MYSQL5.7 MASTER-SLAVE 線上關閉和啟動GTID

gaopengtttt發表於2017-02-27
原創轉載註明出處

本文參考: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步是重點。

作者微信:

               

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2134366/,如需轉載,請註明出處,否則將追究法律責任。

相關文章