Mysql GTID模式下跳过错误

https://www.jianshu.com/p/2aed9584c80c

GTID(全局事务标示符) 最初由google实现,在MySQL 5.6中引入。GTID在事务提交时生成,由UUID和事务ID组成。UUID会在第一次启动MySQL时生成,保存在数据目录下的auto.cnf文件里,事务id则从1开始自增。使用GTID的好处主要有两点:

不再需要指定传统复制中的 master_log_files和master_log_pos,使主从复制更简单可靠
可以实现基于库的多线程复制,减小主从复制的延迟
在传统的主从复制出错时,一般都是设置跳过出错的事务来继续同步:

1.跳过指定数量的事务:

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N ;      #跳过N个事务
mysql> START SLAVE;

2.通过my.cnf文件跳过所有错误或指定类型的错误

slave-skip-errors=1053,1146 #跳过指定类型的错误
slave-skip-errors=all #跳过所有错误

但是在使用GTID进行主从复制的数据库中,如果复制过程发生错误,上述方法是不能用的,我们试一下:

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

提示我们可以生成一个空事务来跳过错误的事务。

3.通过插入空事务跳过错误

我们先来看下主库和从库的状态:

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)

主库的事务id是1-54,看下从库的同步状态:

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项:记录了relay日志从Master获取了binlog日志的位置
Executed_Gtid_Set项:记录本机执行的binlog日志位置,从机上该项中包括主机和从机的binlog日志位置。

我们插入空事务,跳过该错误:

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)

无论是使用哪种复制方法,都也可以重新导出主库数据重新配置主从。

4.通过插入多条空事务跳过多条错误

如果需要一次跳过多条,通过binlog找出需要跳过的gtid。

执行stop slave;后

再批量执行空事务:


 set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298637';begin;commit;

 set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298638';begin;commit;


 set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298639';begin;commit;


 ......

最后

 set @@session.gtid_next=automatic; 

 start slave;


即可。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值