返回顶部
首页 > 资讯 > 数据库 >Mysql 5.7中Gtid带来的运维改变分析
  • 729
分享到

Mysql 5.7中Gtid带来的运维改变分析

2024-04-02 19:04:59 729人浏览 薄情痞子
摘要

本篇内容主要讲解“Mysql 5.7中Gtid带来的运维改变分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql 5.7中Gtid带来的运维改变分析”吧

本篇内容主要讲解“Mysql 5.7中Gtid带来的运维改变分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习mysql 5.7中Gtid带来的运维改变分析”吧!

一、如何跳过一个事物

和传统基于位置的主从不同,如果从库报错我们需要获得从库执行的最后一个事物,方法有如下:

  • show slave status \G 中的 Executed_Gtid_Set。

  • show global variables like '%gtid%'; 中的 gtid_executed 。

  • show master status;中的Executed_Gtid_Set。

然后构建一个空事物如下:

stop slave ;
set gtid_next='4a6f2a67-5d87-11e6-a6bd-000c29a879a3:34';
begin;commit;
set gtid_next='automatic';
start slave ;

如果是多个如下:

stop slave ;
set gtid_next='89dfa8a4-cb13-11e6-b504-000c29a879a3:3';
begin;commit;
set gtid_next='89dfa8a4-cb13-11e6-b504-000c29a879a3:4';
begin;commit;
set gtid_next='automatic';
start slave ;

二、 mysqldump导出行为的改变

使用mysqldump受到选项set-gtid-purged=AUTO的影响,假如我们在Gtid开启和关闭的情况下使用如下语句导出数据:

mysqldump  --single-transaction  --master-data=2  -R -E --triggers  --all-databases

在Gtid开启的情况下会多如下设置:

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;

--
-- GTID state at the beginning of the backup 
--

SET @@GLOBAL.GTID_PURGED='ec9bdd78-a593-11e7-9315-5254008138e4:1-105';

为什么要这么设置呢?因为如果做基于Gtid的主从,是否生成binlog就意味着在导入数据的时候是否基于本地数据库生成新的Gtid事物,显然这是不合理的,所以将SQL_LOG_BIN设置为0是必须的。接着GTID_PURGED被设置为备份时刻已经执行过的Gtid事物,如前文第五节源码剖析设置GTID_PURGED会设置三个地方的Gtid如下:

  • mysql.gtid_executed表

  • gtid_purge变量

  • gtid_executed变量

看起来是合理的,但是如果这里忽略了整个mysql.gtid_executed表是innodb表,导入过程中某些版本(已知percona 5.7.14,5.7.17)会重新删除和建立,因此通过GTID_PURGED设置的mysql.gtid_executed表会重新改变,重启数据库后需要读取mysql.gtid_executed表可能获得错误Gtid集合导致复制错误。这也为我的故障案例埋下了伏笔,案例中在详细描述。
当然也可以使用 --set-gtid-purged=OFF选项来告诉mysqldump不需要加入SQL_LOG_BIN= 0和GTID_PURGED,但是初始化搭建基于Gtid的主从一定不要设置为OFF。下面是这个选项的含义。

 --set-gtid-purged[=name] 
                      Add 'SET @@GLOBAL.GTID_PURGED' to the output. Possible
                      values for this option are ON, OFF and AUTO. If ON is
                      used and GTIDs are not enabled on the server, an error is
                      generated. If OFF is used, this option does nothing. If
                      AUTO is used and GTIDs are enabled on the server, 'SET
                      @@GLOBAL.GTID_PURGED' is added to the output. If GTIDs
                      are disabled, AUTO does nothing. If no value is supplied
                      then the default (AUTO) value will be considered.

三、5.7中搭建基于Gtid的主从

这里存在一个注意点,也是我案例中会提到的。我们还是直接说步骤

  • 注意主备库必须开启Gtid和设置好server_id

 enforce_gtid_consistency = ON
 gtid_mode = ON
 server_id = 9910
 binlog_fORMat = row

同时主备库都开启binlog如果不设置级联从库,从库不要设置log_slave_updates参数。
这是最合理的设置。

  • 建立复制用户

CREATE USER 'repl'@'%' IDENTIFIED BY  'test123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' ;
  • 导出数据

mysqldump  --single-transaction  --master-data=2  -R -E --triggers  --all-databases > test.sql
  • 从库导入数据
    source即可。

  • 从库执行reset master语句
    这一步主要防止gtid_executed被更改过。这个问题在在percona 5.7.14 5.7.17存在但是在percona 5.7.15 5.7.19又不存在。所以为了安全还是执行下面的两步。

reset master;
  • 提取GTID_PURGED,并且执行
    使用head -n 40 命令可以快速的得到比如我这里的

--
-- GTID state at the beginning of the backup 
--

SET @@GLOBAL.GTID_PURGED='ec9bdd78-a593-11e7-9315-5254008138e4:1-21';

执行

SET @@GLOBAL.GTID_PURGED='ec9bdd78-a593-11e7-9315-5254008138e4:1-21';

语句即可,完成本部分mysql.gtid_executed表会重构。

  • 使用MASTER_AUTO_POSITION建立同步

change master to 
master_host='192.168.99.41',
master_user='repl',
master_passWord='test123',
master_port=3310,
MASTER_AUTO_POSITION = 1;
  • 启动slave

start slave

四、5.7中Gtid的主从的切换

切换中必须要确认从库(新主库)没有做过本地的事物,如果做过,否则切换主库(新从库)需要拉取这一部分的Gtid事物,如果这些binlog已经不存在了那么势必会报错。这种情况下还是从建从库吧。那么我们来说正常的切换步骤。

  • 从库(新主库)

stop slave;
reset slave all;
  • 主库(新从库)

change master to 
master_host='192.168.99.40',
master_user='repl',
master_password='test123',
master_port=3310,
MASTER_AUTO_POSITION = 1;
start slave;

实际就这么简单,从库(新主库)会生成自己的Gtid事物,新主库接受到后执行即可。此时会出现如下有两个server_uuid对应的Gtid,如下的gtid_executed

mysql> show global variables like '%gtid%';
+----------------------------------+-------------------------------------------------------------------------------------+
| Variable_name                    | Value                                                                               |
+----------------------------------+-------------------------------------------------------------------------------------+
| binlog_gtid_simple_recovery      | ON                                                                                  |
| enforce_gtid_consistency         | ON                                                                                  |
| gtid_executed                    | 31704d8a-da74-11e7-b6bf-525400a7d243:1-9,
ec9bdd78-a593-11e7-9315-5254008138e4:1-25 |
| gtid_executed_compression_period | 1000                                                                                |
| gtid_mode                        | ON                                                                                  |
| gtid_owned                       |                                                                                     |
| gtid_purged                      | ec9bdd78-a593-11e7-9315-5254008138e4:1-25                                           |
| session_track_gtids              | OFF                                                                                 |
+----------------------------------+-------------------------------------------------------------------------------------+

总的说来如果要作为的切换的从库,不要在从库本地做任何事物。如果确实要做比如加索引等不影响数据的操作可以是使用如下:

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

mysql> create index test_jjj on jjj(id);
Query OK, 0 rows affected (0.42 sec)
Records: 0  Duplicates: 0  Warnings: 0

这样也是不会增加本地Gtid的。

五、在线修改Gtid模式

这是5.7.6以后实现的功能其主要依赖了我们前面分析的 Previous gtid Event以及参数gtid_mode新加入的2个值。我们具体来看看gitd_mode各个值的含义:

  • OFF(0): Both new and replicated transactions must be anonymous.(生成的是匿名事物,slave也只能应用匿名事物)

  • OFF_PERMISSIVE:(1) New transactions are anonymous. Replicated transactions can be either
    anonymous or GTID transactions.(生成的是匿名事物,slave可以应用匿名和GTID事物)

  • ON_PERMISSIVE(2): New transactions are GTID transactions. Replicated transactions can be either
    anonymous or GTID transactions.(生成的是GTID事物,slave可以应用匿名和GTID事物)

  • ON(3): Both new and replicated transactions must be GTID transactions(生成的是GTID事物,slave也只能应用GTID事物)

注意每次修改值必然导致一次binlog的切换,如果发生binlog删除也能够依托 Previous gtid Event快速准确的找到gtid_purged(Gtid_state.lost_gtids)。

在线启动

  • 主库/从库执行

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

确定事物都支持gtid,不会在err log中出现警告如下:
2017-02-26T22:35:24.322055Z 55 [Warning] Statement violates GTID consistency: CREATE TABLE ... SELECT.

  • 主库/从库执行

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  • 主库/从库执行

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

生成的是匿名事物,slave可以应用匿名和GTID事物

  • 主库/从库执行

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

生成的是GTID事物,slave可以应用匿名和GTID事物

  • 主库/从库执行

确定已经没有匿名的事物

SHOW GLOBAL STATUS LIKE 'ONGoING_ANONYMOUS_TRANSACTION_COUNT';

同时确认从库
Retrieved_Gtid_Set
Executed_Gtid_Set
正常增长

到这一步实际上gtid事物已经开始使用了。

  • 主库/从库执行

SET @@GLOBAL.GTID_MODE = ON;
  • 从库执行

stop slave;
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
start slave;
  • 主库/从库执行
    修改配置文件my.cnf,将参数的更改加入到配置文件

在线关闭

  • 从库执行

stop slave;

记录从库执行状态值

Exec_Master_Log_Pos: 7631438
Relay_Master_Log_File: bin_log.000016

执行

CHANGE MASTER TO MASTER_AUTO_POSITION = 0,
MASTER_LOG_FILE = 'bin_log.000016', 
MASTER_LOG_POS = 7631438
start slave;
  • 主库/从库执行

SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

生成的是GTID事物,slave可以应用匿名和GTID事物

  • 主库/从库执行

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

生成的是匿名事物,slave可以应用匿名和GTID事物

  • 从库执行

等待从库
Retrieved_Gtid_Set
Executed_Gtid_Set
不再变动。
完成这一步实际上GTID事物已经没有生成和应用了

  • 主库/从库执行

SET @@GLOBAL.GTID_MODE = OFF;
  • 主库/从库执行

修改配置文件my.cnf,将参数的更改加入到配置文件

到此,相信大家对“Mysql 5.7中Gtid带来的运维改变分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: Mysql 5.7中Gtid带来的运维改变分析

本文链接: https://lsjlt.com/news/65752.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mysql 5.7中Gtid带来的运维改变分析
    本篇内容主要讲解“Mysql 5.7中Gtid带来的运维改变分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql 5.7中Gtid带来的运维改变分析”吧...
    99+
    2024-04-02
  • Mysql 5.7 Gtid内部学习(四) mysql.gtid_executed表Previous gtid Event的改变
    简书地址: http://www.jianshu.com/p/1f4f9c07ce0b 之所以把mysql.gtid_executed表的作用和Previous gtid Event的改变放到一起进行...
    99+
    2024-04-02
  • Mysql 5.7 Gtid内部学习(七) 总结binlog_gtid_simple_recovery参数带来的影响
    简书地址: http://www.jianshu.com/p/c9888d6447c8 想了想还是专门开了一节来总结这个问题 5.7.6以下中默认 simplified_binlog_gt...
    99+
    2024-04-02
  • 如何分析Linux系统运维的未来
    今天就跟大家聊聊有关如何分析Linux系统运维的未来,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。我想来跟大家聊聊Linux运维这一行业,从几个方面说下行业的现状、如何学好Linux...
    99+
    2023-06-05
  • mongodb中运维的示例分析
    这篇文章主要介绍了mongodb中运维的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们以管理员的视角来看mongodb,作为一名...
    99+
    2024-04-02
  • 如何分析Python自动化运维开发中的变量
    本篇文章给大家分享的是有关如何分析Python自动化运维开发中的变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。好程序员分享Python自动化运维开发实战四-变量导语:1.什...
    99+
    2023-06-04
  • MySQL高可用运维的示例分析
    这篇文章将为大家详细讲解有关MySQL高可用运维的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、基本知识介绍1、MHA定义Master HA。是一个开源的高可...
    99+
    2024-04-02
  • mysql auto_increment锁带来的表锁举例分析
    这篇文章主要介绍“mysql auto_increment锁带来的表锁举例分析”,在日常操作中,相信很多人在mysql auto_increment锁带来的表锁举例分析问题上存在疑惑,小编查阅了各式资料,整...
    99+
    2024-04-02
  • Mysql 5.7中数据量更改统计数据收集的逻辑分析
    这篇文章主要介绍了Mysql 5.7中数据量更改统计数据收集的逻辑分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 一、持久化(PERS...
    99+
    2024-04-02
  • 如何从运维角度来分析MySQL数据库优化的关键点
    本篇文章为大家展示了如何从运维角度来分析MySQL数据库优化的关键点,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 概述一个成熟的数据库架构并不是一开始设...
    99+
    2024-04-02
  • Linux运维中常用维护命令的示例分析
    这篇文章主要为大家展示了“Linux运维中常用维护命令的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux运维中常用维护命令的示例分析”这篇文章吧。(1)让程序在用户退出后仍然在运...
    99+
    2023-06-10
  • python中自动化运维工具ansible的示例分析
    这篇文章主要介绍python中自动化运维工具ansible的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ansible 简介ansible 是什么?  ansible是新出现的自动化运维工具,基于Pytho...
    99+
    2023-06-20
  • Go 中的 numpy 容器:为大数据分析带来新的突破?
    Go 作为一门静态类型语言,一直以来都在处理大数据方面拥有着出色的性能表现。但是,Go 的数据分析库一直以来都没有能够像 Python 中的 numpy 那样流行。然而最近,Go 的社区中出现了一些新的数据分析库,它们尝试着将 numpy ...
    99+
    2023-10-13
    numpy 容器 大数据
  • MySQL中增删改查语法的示例分析
    这篇文章给大家分享的是有关MySQL中增删改查语法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。普通的单表更新或删除sql大家肯定滚瓜烂熟,但你有用过连表更新或删除的s...
    99+
    2024-04-02
  • Python中的变量、运算符与流程控制实例分析
    本篇内容主要讲解“Python中的变量、运算符与流程控制实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的变量、运算符与流程控制实例分析”吧!一、执行Python程序的两种方...
    99+
    2023-06-30
  • 关于Qt6中QtMultimedia多媒体模块的重大改变分析
    目录一、前言二、目标Qt 5 中的 Qt 多媒体有一个相当松散定义的范围三、内部架构变化Qt 5 中的 Qt 多媒体具有复杂的基于插件的架构四、支持的后端在 Qt 6 中,我们还重新...
    99+
    2024-04-02
  • Win7系统中怎么修改环境变量PATH以此来更好的运行进程
        环境变量是在操作系统中具有一个特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息,而“Path”就是一个变量,里面存储了一些常用命令所存放...
    99+
    2023-06-07
    Win7 环境变量 PATH 系统 运行
  • MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析
    小编给大家分享一下MySQL中slave端Retrieved_Gtid_Set读取改进的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起...
    99+
    2024-04-02
  • Ubuntu中环JDK环境变量配置以及MySQL、Samba安装的示例分析
    这篇文章主要为大家展示了“Ubuntu中环JDK环境变量配置以及MySQL、Samba安装的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ubuntu中...
    99+
    2024-04-02
  • vue App.vue中公共组件改变值触发其他组件或.vue页面监听的示例分析
    这篇文章主要为大家展示了“vue App.vue中公共组件改变值触发其他组件或.vue页面监听的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue A...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作