MySQL5.7 GTID与传统快速切换
当前场景:某些业务场景还未开启GTID服务组,在最新版本中,BINLOG组提交也基于GTID方式,因此如何检测是否符合开启GTID条件,在线切换使用GTID,以及如何快速回滚:
gtid_mode参数新选项:MySQL提供两个额外的选项off_permissive和on_permissive
gtid-mode的几种状态说明:
off :不产生gtid,基于binlog+position,slave也不能接受gtid的日志;
off_permissive:不产生gtid,但做为slave可以识别gtid事务也可以识别非gtid事务;
on_permissive:产生gtid事务,slave可以处理gtid事务和非gtid事务;
on:产生gtid事务,slave只接受gtid事务
GTID三个限制
enforce-gtid-consistency=ON时,以下三类语句时不支持的
[*] CREATE TABLE ... SELECT statements
[*] CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE statements inside transactions
[*] Transactions or statements that update both transactional and nontransactional tables. There is an exception that nontransactional DML is allowed in the same transaction or in the same statement as transactional DML, if all nontransactional tables are temporary.
而实际上这个限制没有必要这么严格,
[*] CREATE TABLE ... SELECT statements
对于binlog_format=row, gtid_next='automatic'时可以放开限制。
生成的binlog包含两个GTID, 一个是建表语句,一个是包含多个insert的事务。
[*] 事务中包含事务表和非事务表
对于gtid_next='automatic'时可以放开限制。
生成的binlog包含两个GTID, 一个是所有非事务表的,一个是所有事务表的。
对update多表(包含事务表和非事务表)此时需额外要求binlog_format=row。
在线开启GTID过程如下:
① 所有的server上执行
set @@global.enforce_gtid_consistency = warn; 特别注意: 这一步是关建的一步使用不能出现警告。会将不符合的语句记入错误日志
② 所有的server上执行:
set @@global.enforce_gtid_consistency = on;
③ 所有的Server上执行(不关心最先最后,但要执行完):
set @@global.gtid_mode = off_permissive;
④ 所有的server上执行:
set @@global.gtid_mode=on_permissive;
实质在这一步骤生成的日志都是带GTID的日志了,这个步骤号称是不关心任何节点,但从实际管理上推荐在slave上先执行,然后再去master上执行。
⑤ 确认传统的binlog复制完毕,该值为0
show status like 'ongoing_anonymous_transaction_count';
所有节点进行判断 show status like 'ongoing_anonymous_transaction_count’; 为零
⑥ 所有的节点执行: flush logs; 用于切换一下日志。
⑦ 所有的节点启用gtid_mode
set @@global.gtid_mode=on;
⑧ 启用Gtid的自动查找节点复制:
stop slave;
change master to master_auto_position=1;
start slave;
⑨ 把gtid_mode = on相关配置写入配置文件
gtid_mode=on
enforce_gtid_consistency=on
最后可以看到传统复制的一个变化,通过BINLOG观察:
#171116 19:16:57 server>
#171116 19:17:03 server>
#171116 19:19:54 server>
#171116 19:19:59 server>
#171116 19:21:06 server>
#171116 19:21:11 server> GTID复制数据:
#171117 13:40:00 server>
#171117 13:40:00 server>
#171117 13:40:00 server>
#171117 13:40:00 server>
#171117 13:40:00 server> #####从GTID模式到传统模式过程:
① 在SLAVE:
stop slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.130
Master_User: dlan
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000010
Read_Master_Log_Pos: 458282
同时执行:
change master to master_auto_position=0,MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=458282;
start slave;
②在MS上执行:
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
③在MS上执行
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
④在MS上执行
SELECT @@GLOBAL.GTID_OWNED;##都为空就可以
⑤关闭GTID
SET @@GLOBAL.GTID_MODE = OFF;
最后观察又GTID又是匿名:
#171117 14:32:38 server>
#171117 14:32:38 server>
#171117 14:32:38 server>
#171117 14:32:38 server>
#171117 14:32:38 server>
#171117 14:32:38 server>
#171117 14:32:38 server>
页:
[1]