前言:最近還是在做MariaDB10.1.12升級為MySQL5.7的升級方案,其中有一個環(huán)節(jié)涉及到傳統(tǒng)復(fù)制到GTID復(fù)制的在線切換,本文就介紹下如何是現(xiàn)在線切換。
一、參數(shù)解析
下面對GTID_MODE變量如下解釋:
| 值 | 解釋 |
|---|---|
| OFF | 新事務(wù)是非GTID, Slave只接受不帶GTID的事務(wù),傳送來GTID的事務(wù)會報錯 |
| OFF_PERMISSIVE | 新事務(wù)是非GTID, Slave即接受不帶GTID的事務(wù)也接受帶GTID的事務(wù) |
| ON_PERMISSIVE | 新事務(wù)是GTID, Slave即接受不帶GTID的事務(wù)也接受帶GTID的事務(wù) |
| ON | 新事務(wù)是GTID, Slave只接受帶GTID的事務(wù) |
我們在更改GTID_MODE時不可直接跳躍更改,否則會提示報錯
root@localhost [xucl]>set global gtid_mode=ON;
ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.
二、在線更改
1.將enforce_gtid_consistency設(shè)置為WARNING,主庫從庫都要設(shè)置,無先后順序。
set @@global.enforce_gtid_consistency=warn;
注意:執(zhí)行完這條語句后,如果出現(xiàn)GTID不兼容的語句用法,在錯誤日志會記錄相關(guān)信息,那么需要調(diào)整應(yīng)該程序避免不兼容的寫法,直到完全沒有產(chǎn)生不兼容的語句,可以通過應(yīng)用程序去排查所有的sql,也可以設(shè)置后觀察錯誤日志一段時間,建議觀察過,這一步非常重要。
2.將ENFORCE_GTID_CONSISTENCY設(shè)置為ON,主庫從庫都要設(shè)置,無先后順序。
set @@global.enforce_gtid_consistency=on;
3.設(shè)置GTID_MODE為off_permissiv,主庫從庫都要設(shè)置,無先后順序。
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
4.設(shè)置GTID_MODE為on_permissiv,主庫從庫都要設(shè)置,無先后順序。
SET @@GLOBAL.GTID_MODE = on_permissive;
5.主從檢查變量ONGOING_ANONYMOUS_TRANSACTION_COUNT
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
需要等到該變量為0
6.確保所有的匿名事務(wù)(非GTID事務(wù))已經(jīng)被完全復(fù)制到所有的server上。
主庫
show master status;
從庫
show slave status\G
確保事務(wù)在從庫都會放完畢
或者:
SELECT MASTER_POS_WAIT('mysql-bin.00000x', xxx);
7.確認(rèn)整個拓?fù)浣Y(jié)構(gòu)中已經(jīng)沒有匿名事務(wù)的存在,如之前產(chǎn)生的所有匿名事務(wù)已經(jīng)全部被執(zhí)行完畢,甚至二進(jìn)制日志中也不要有匿名事務(wù),可以通過flush logs,并讓mysql來自動清理舊的二進(jìn)制日志文件。
8.設(shè)置GLOBAL.GTID_MODE為ON,主庫從庫都要設(shè)置,無先后順序。
SET @@GLOBAL.GTID_MODE = ON;
9.my.cnf增加GTID_MODE = ON;
至此,GTID復(fù)制在線切換完成。