MYSQL5.7 MASTER-SLAVE 在线关闭和启动GTID

原创转载注明出处

本文参考:MYSQL 5.7官方手册
本文步骤中master slave代表主库和从库都需要更改、 slave代表从库更改、master代表主库更改


在MYSQL 5.7.6后可以在线的开启和关闭gtid功能,为了做到这一点MYSQL对GTID_MODE做了改动
增加了OFF_PERMISSIVE和ON_PERMISSIVE来完成平滑的切换,下面看看有关参数


ENFORCE_GTID_CONSISTENCY:这个参数主要有如下设置,主要用于不让违反GTID设置的操作执行,如果执行会报错如:
Statement violates GTID consistency: CREATE TABLE ... SELECT.
? OFF: all transactions are allowed to violate GTID consistency.(所有操作允许)
? ON: no transaction is allowed to violate GTID consistency.(不允许违反gtid的操作,并且报错)
? WARN: all transactions are allowed to violate GTID consistency, but a warning is generated in this case.
Added in MySQL 5.7.6.(所有操作允许,但是违反GTID的操作会报出警告)


GTID_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事物)

违反gtid的操作:
1、CREATE TABLE ... SELECT.
2、CREATE TEMPORARY TABLE/DROP TEMPORARY TABLE
3、sql_slave_skip_counter
4、delete testii2,testii1 from testii2,testii1 where testii2.id=testii1.id; testii2为MYISAM、testii1为innodb
参考:18.1.3.4 Restrictions on Replication with GTIDs


一、在线启动gtid  
1、master slave
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
确定事物都支持gtid,不会在err log中出现警告如下:
2017-02-26T22:35:24.322055Z 55 [Warning] Statement violates GTID consistency: CREATE TABLE ... SELECT.


2、master slave
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;


3、master slave
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; 
生成的是匿名事物,slave可以应用匿名和GTID事物


4、master slave
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
生成的是GTID事物,slave可以应用匿名和GTID事物


5、master slave
确定已经没有匿名的事物
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
确定如下一般情况下有值,可能为空(压力很小甚至没有事物)
SELECT @@GLOBAL.GTID_OWNED;
确定此时的Retrieved_Gtid_Set Executed_Gtid_Set正常增长
(甚至你可以在slave上使用:
SELECT MASTER_POS_WAIT(file, position);
来强制等待slave端直到指定位置,这个位置就是你确定的使用GTID事物的位置)

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


6、master slave
SET @@GLOBAL.GTID_MODE = ON;
生成的是GTID事物,slave也只能应用GTID事物


7、slave
stop slave;
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
start slave;


8、master slave
修改配置文件my.cnf


二、在线关闭gtid 


1、slave

stop slave;


记录slave status
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;

2、master slave
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
生成的是GTID事物,slave可以应用匿名和GTID事物


3、master slave  
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
生成的是匿名事物,slave可以应用匿名和GTID事物


4、master slave
SELECT @@GLOBAL.GTID_OWNED;
等到主库和备库此显示为空,并且Retrieved_Gtid_Set Executed_Gtid_Set
不再变动.
(甚至你可以在slave上使用:
SELECT MASTER_POS_WAIT(file, position);
来强制等待slave端直到指定位置,这个位置就是你确定的没有使用GTID事物的位置)
完成这一步实际上GTID事物已经没有生成和应用了


5、master slave
SET @@GLOBAL.GTID_MODE = OFF;


6、master slave
修改配置文件my.cnf

注意在线开启步骤中第5步和在线关闭的第4步是重点。

作者微信:

               
请使用浏览器的分享功能分享到微信等