GTID(全局事務(wù)標(biāo)示符) 最初由google實(shí)現(xiàn)俐载,在MySQL 5.6中引入侥加。GTID在事務(wù)提交時(shí)生成蛾默,由UUID和事務(wù)ID組成。UUID會(huì)在第一次啟動(dòng)MySQL時(shí)生成瑰排,保存在數(shù)據(jù)目錄下的auto.cnf文件里,事務(wù)id則從1開始自增贯要。使用GTID的好處主要有兩點(diǎn):
不再需要指定傳統(tǒng)復(fù)制中的 master_log_files和master_log_pos,使主從復(fù)制更簡單可靠
可以實(shí)現(xiàn)基于庫的多線程復(fù)制椭住,減小主從復(fù)制的延遲
在傳統(tǒng)的主從復(fù)制出錯(cuò)時(shí)崇渗,一般都是設(shè)置跳過出錯(cuò)的事務(wù)來繼續(xù)同步:
1.跳過指定數(shù)量的事務(wù):
mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N ; #跳過N個(gè)事務(wù)
mysql> START SLAVE;
2.通過my.cnf文件跳過所有錯(cuò)誤或指定類型的錯(cuò)誤
slave-skip-errors=1053,1146 #跳過指定類型的錯(cuò)誤
slave-skip-errors=all #跳過所有錯(cuò)誤
但是在使用GTID進(jìn)行主從復(fù)制的數(shù)據(jù)庫中,如果復(fù)制過程發(fā)生錯(cuò)誤,上述方法是不能用的宅广,我們?cè)囈幌拢?/p>
mysql> set global sql_slave_skip_counter = 1;
ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction
提示我們可以生成一個(gè)空事務(wù)來跳過錯(cuò)誤的事務(wù)葫掉。我們先來看下主庫和從庫的狀態(tài):
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000010
Position: 643
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: daf34b30-033c-11e9-b7f8-001c425bf1a7:1-54
1 row in set (0.00 sec)
主庫的事務(wù)id是1-54,看下從庫的同步狀態(tài):
Last_SQL_Error: Error 'Table 'yuyu2' already exists' on query. Default database: 'fanfan'. Query: 'create table yuyu2 (id int)'
Replicate_Ignore_Server_Ids:
Master_Server_Id: 25
Master_UUID: daf34b30-033c-11e9-b7f8-001c425bf1a7
Master_Info_File: /application/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 181220 11:06:20
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: daf34b30-033c-11e9-b7f8-001c425bf1a7:54
Executed_Gtid_Set: daf34b30-033c-11e9-b7f8-001c425bf1a7:1-53
Retrieved_Gtid_Set項(xiàng):記錄了relay日志從Master獲取了binlog日志的位置
Executed_Gtid_Set項(xiàng):記錄本機(jī)執(zhí)行的binlog日志位置,從機(jī)上該項(xiàng)中包括主機(jī)和從機(jī)的binlog日志位置跟狱。
我們插入空事務(wù)俭厚,跳過該錯(cuò)誤:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> set gtid_next="daf34b30-033c-11e9-b7f8-001c425bf1a7:54";
Query OK, 0 rows affected (0.00 sec)
mysql> begin;commit;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> set gtid_next="automatic";
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
無論是使用哪種復(fù)制方法,都也可以重新導(dǎo)出主庫數(shù)據(jù)重新配置主從驶臊。
轉(zhuǎn)自 https://www.52os.net/articles/injecting-empty-transactions-repair-mysql-5-6-gtid-replication.html