Mysql主从同步失败

Posted sqlservertongbu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql主从同步失败相关的知识,希望对你有一定的参考价值。

当备库复制出错时,传统的跳过错误的方法是设置sql_slave_skip_counter,然后再START SLAVE。

但如果打开了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

?

提示的错误信息告诉我们,可以通过生成一个空事务来跳过错误的事务。

我们手动产生一个备库复制错误:

Last_SQL_Error: Error ‘Unknown table ‘test.t1” on query. Default database: ‘test’. Query: ‘DROP TABLE `t1` ’

查看binlog中,该DDL对应的GTID为7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1131

在备库上执行:

mysql> STOP SLAVE;

Query OK, 0 rows affected (0.00 sec)

mysql> SET SESSION GTID_NEXT=’7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1131′;

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 SESSION GTID_NEXT=AUTOMATIC;

Query OK, 0 rows affected (0.00 sec)

?

mysql> START SLAVE;

再查看show slave status,就会发现错误事务已经被跳过了。这种方法的原理很简单,空事务产生的GTID加入到GTID_EXECUTED中,这相当于告诉备库,这个GTID对应的事务已经执行了。

使用change master to …. , MASTER_AUTO_POSITION=1;

注意在整个复制拓扑中,都需要打开gtid_mode

5.6提供了新的util condition,可以根据GTID来决定备库复制执行到的位置

SQL_BEFORE_GTIDS:在指定的GTID之前停止复制

SQL_AFTER_GTIDS :在指定的GTID之后停止复制

判断函数为Relay_log_info::is_until_satisfied

详细文档见:?http://dev.mysql.com/doc/refman/5.6/en/start-slave.html

以上是关于Mysql主从同步失败的主要内容,如果未能解决你的问题,请参考以下文章

mysql主从同步失败Last_IO_Error: Got fatal error 1236 from master解决方法

mysql主从同步失败Last_IO_Error: Got fatal error 1236 from master解决方法

mysql主从同步失败Last_IO_Error: Got fatal error 1236 from master解决方法

mysql主从同步失败Last_IO_Error: Got fatal error 1236 from master解决方法

mysql 主从同步的问题以及详细解决方案

mysql 主从同步的问题以及详细解决方案