Mysql 5.7 Gtid内部学习(八) Gtid带来的运维改变


依托前文的解析来讲5.7中 Gtid带来的运维改变,我想理解应该是更加深刻,这节主要讨论以下几个部分:

  1. 如何跳过一个事务
  2. mysqldump导出行为的改变
  3. 5.7中搭建基于Gtid的主从
  4. 5.7中Gtid的主从的切换
  5. 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,将参数的更改加入到配置文件

六、总结

学习完本节至少能够学习到:

  • 如何跳过一个事务
  • mysqldump导出行为的改变
  • 5.7中搭建基于Gtid的主从
  • 5.7中Gtid的主从的切换
  • 5.7中在线改变Gtid 模式

关于其他运维可以参考官方文档:

  • Chapter 18 Replication
    作者微信:
    [图片上传中...(微信.jpg-c22562-1513590717897-0)]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容