一、傳統(tǒng)復(fù)制切換為GTID復(fù)制
按需規(guī)劃網(wǎng)站可以根據(jù)自己的需求進(jìn)行定制,成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作構(gòu)思過(guò)程中功能建設(shè)理應(yīng)排到主要部位公司成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義
主/從庫(kù)執(zhí)行
1.SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
持續(xù)觀察MySQL錯(cuò)誤日志一段時(shí)間,看是否有違反gtid 一致性的報(bào)錯(cuò),像create table ... select 的語(yǔ)句是不支持的。這個(gè)時(shí)候只能做業(yè)務(wù)上的調(diào)整來(lái)滿足gtid 一致性的要求,只有語(yǔ)句都滿足了,才能繼續(xù)進(jìn)行一下步。
主/從庫(kù)執(zhí)行
2.SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
主/從庫(kù)執(zhí)行
3.SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
新產(chǎn)生是匿名事務(wù),slave可以識(shí)別匿名事務(wù)和gtid事務(wù)
主/從庫(kù)執(zhí)行
4.SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
新產(chǎn)生是gtid事務(wù),slave可以識(shí)別匿名事務(wù)和gtid事務(wù),到這一步要確保沒(méi)有匿名事務(wù)產(chǎn)生了再進(jìn)行下一步的操作,查看方法為:
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; ?
當(dāng)值為0就表示可以進(jìn)行一下操作了。
主/從庫(kù)執(zhí)行
5.SET @@GLOBAL.GTID_MODE = ON;
新產(chǎn)生是gtid事務(wù),slave只識(shí)別gtid事務(wù),這一步執(zhí)行完主/從就都開(kāi)啟了gtid了。要想配置重啟繼續(xù)生效,將兩個(gè)參數(shù)寫(xiě)入MySQL的配置文件中:
enforce_gtid_consistency=on
gtid_mode=on
從庫(kù)執(zhí)行
STOP SLAVE [FOR CHANNEL 'channel'];
CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
START SLAVE [FOR CHANNEL 'channel'];
二、GTID復(fù)制切換為傳統(tǒng)復(fù)制
從庫(kù)執(zhí)行
1. STOP SLAVE [FOR CHANNEL 'channel'];
等待完這步后,需要查看當(dāng)前slave讀取的文件及位置,傳統(tǒng)復(fù)制需要基于這兩個(gè)值繼續(xù)同步。查看方法就是查看show slave status\G中的兩個(gè)參數(shù):
Relay_Master_Log_File:file #表示 sql_thread已經(jīng)應(yīng)用到了哪個(gè)文件
Exec_Master_Log_Pos:position #表示 sql_thread已經(jīng)執(zhí)行到了文件的哪個(gè)位置
2.CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file, \
MASTER_LOG_POS = position [FOR CHANNEL 'channel'];
3.START SLAVE [FOR CHANNEL 'channel'];
主從庫(kù)執(zhí)行
4.SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;.
主從庫(kù)執(zhí)行
5.SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
執(zhí)行完這步后需要確認(rèn)沒(méi)有新gtid事務(wù)產(chǎn)生
官方文檔上的方法:SELECT @@GLOBAL.GTID_OWNED;只要確保主從上有一個(gè)值為空就行。
另外也可以根據(jù)從上的兩個(gè)參數(shù)是否不再更新來(lái)判斷:
Retrieved_Gtid_Set: #已經(jīng)獲取到的gtid集合
Executed_Gtid_Set: #已經(jīng)執(zhí)行了的gtid集合
主從庫(kù)執(zhí)行
6.SET @@GLOBAL.GTID_MODE = OFF;
主從庫(kù)執(zhí)行
7.將配置寫(xiě)入配置文件
enforce_gtid_consistency=off
gtid_mode=off
三、基于GTID復(fù)制怎么跳過(guò)一個(gè)事務(wù)
基于GTID的復(fù)制無(wú)法使用sql_slave_skip_counter跳過(guò)錯(cuò)誤,可以利用替換空事務(wù)的方法來(lái)處理。
從庫(kù)執(zhí)行:
1.停止slave,并注入空事務(wù)
STOP SLAVE [FOR CHANNEL 'channel'];
SET GTID_NEXT='aaa-bbb-ccc-ddd:N'; #需要跳過(guò)的事務(wù)的gtid
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';
START SLAVE [FOR CHANNEL 'channel'];
從庫(kù)執(zhí)行
2.刷新并清理binlog文件
FLUSH LOGS; #會(huì)生成一個(gè)新的binlog文件
PURGE BINARY LOGS TO 'master-bin.00000N'; #N表是最新的binlog文件
這么做的用意在于防止將來(lái)slave提升為master的時(shí)候這個(gè)問(wèn)題事務(wù)繼續(xù)傳播。
四、基于GTID復(fù)制,將slave切換為Master
1.確保主上不再有數(shù)據(jù)更新
flush table with read lock; #會(huì)話級(jí)的,斷開(kāi)會(huì)話就失效了。
或
set global read_only=1; #重啟失效
set global super_read_only=1
2.檢查主從是否完全同步了
Master:show master status\G;
Slave:show slave status\G;
3.從庫(kù)(新的主庫(kù))
STOP SLAVE;
RESET SLAVE ALL;
4.主庫(kù)(新的從庫(kù))
CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file, \
MASTER_LOG_POS = position [FOR CHANNEL 'channel'];
寫(xiě)在最后:
本文只是基于官方文檔及自己在用的過(guò)程的一些總結(jié),英文好的可以直接去看官方文檔。如果寫(xiě)的有錯(cuò)的地方也歡迎吐槽?;贕tid的復(fù)制維護(hù)起來(lái)還是很方便的,不再需要關(guān)心binlog file及position了。slave會(huì)向Master上報(bào)它已經(jīng)執(zhí)行的gtid,Master會(huì)將剩余的gtid發(fā)給Slave去執(zhí)行。為了防止在從上誤操作導(dǎo)致主從的數(shù)據(jù)不一致,從最好還是設(shè)置為只讀,在Slave的配置文件中加入兩個(gè)參數(shù):
super_read_only=1
read_only=1