代码改变世界

gtid复制中跳过错误事务的另一种方法

2022-12-13 22:28  abce  阅读(181)  评论(0编辑  收藏  举报

gtid复制中跳过错误事务的另一种方法

replica1 > select @@gtid_mode;
+---------------------+
| @@gtid_mode         |
+---------------------+
|  on                 |
+---------------------+
replica1 > stop slave;
query ok, 0 rows affected (0.02 sec)
 
replica1 > set gtid_mode=on_permissive;
query ok, 0 rows affected (0.04 sec)
 
replica1 > set global sql_slave_skip_counter = 1;
query ok, 0 rows affected (0.00 sec)
 
replica1 > start slave;
query ok, 0 rows affected (0.00 sec)
 
replica1 > pager grep seconds
pager set to 'grep seconds'
replica1 > show slave status\g
        seconds_behind_master: 0
1 row in set (0.00 sec)

关闭主从复制,并将gtid_mode设置成on_permissive(新的事务是gtid事务,复制事务可以是匿名事务、也可以是gtid事务)。使用sql_slave_skip_counter=1跳过事务,然后重启复制。

一旦复制同步后,我们就需要将gtid_mode改会on。

replica1 > select @@gtid_mode;
+---------------------- ----+
| @@gtid_mode               |
+---------------------------+
| on_permissive             |
+---------------------------+
 
replica1 > set global gtid_mode=on;
query ok, 0 rows affected (0.04 sec)


要想将gtid_mode从on设置成on_permissive,必须将sql_slave_skip_counter设置成0。

replica1 > stop slave;
query ok, 0 rows affected (0.02 sec)
 
replica1 > set gtid_mode=on_permissive;
query ok, 0 rows affected (0.04 sec)
 
replica1 > set global sql_slave_skip_counter = 1;
query ok, 0 rows affected (0.00 sec)
 
replica1 > set global gtid_mode=on;
error 3111 (hy000): set @@global.gtid_mode = on is not allowed because @@global.sql_slave_skip_counter is greater than zero.
 
replica1 > start slave;
query ok, 0 rows affected (0.00 sec)
 
replica1 > set global gtid_mode=on;
query ok, 0 rows affected (0.02 sec)

这样跳过后,主从可能会不一致,这就需要使用pt-table-checksum、pt-table-sync来修复一致性了。