License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
转载请注明:http://suzf.net/post/486
在前面文章我提到了两种关于如何修复 Mysql 5.6 GTID 主从数据库。
我没有提到大家说熟知的方法 - ` GLOBAL SQL_SLAVE_SKIP_COUNTER = n`。原因很简单,如果你使用的是MysqlGTID,它是不工作的。
那么问题来了:
有没有简单的方法跳过这单一事务 ?
是的!注入空事务。让我们想象一下,从服务器上的复制不工作,因为下面一个错误:
Last_SQL_Error: Error 'Duplicate entry '4' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t VALUES(NULL,'salazar')' Retrieved_Gtid_Set: 7d72f9b4-8577-11e2-a3d7-080027635ef5:1-5 Executed_Gtid_Set: 7d72f9b4-8577-11e2-a3d7-080027635ef5:1-4
这里有不同的方法可以找到失败的事务。你可以检查二进制日志,或者你也可以检查retrieved_gtid_set 和 executed_gtid_set 从显示输出的例子中我们可以看出。此从服务器检索到1到5的交易,但只执行了1到4。这意味着交易5是导致问题的一个问题。
因为在GTID中sql_slave_skip_counter不工作,我们需要找到一种办法来忽视事务。我们可以在GTID中创建空事务以跳过它。
STOP SLAVE; SET GTID_NEXT="7d72f9b4-8577-11e2-a3d7-080027635ef5:5"; BEGIN; COMMIT; SET GTID_NEXT="AUTOMATIC"; START SLAVE; [...] Retrieved_Gtid_Set: 7d72f9b4-8577-11e2-a3d7-080027635ef5:1-5 Executed_Gtid_Set: 7d72f9b4-8577-11e2-a3d7-080027635ef5:1-5
START SLAVE 之后 检查事务5已经在它自己的二进制文件中了,这就意味着它已经执行过了。
这是一个简单的方法来跳过一些事务,但是,你应该想到主从服务器之间数据不一致。pt-table-checksum 在这里可以帮助你,它可以在Percona Toolkit for mysql 中找到。
上周我谈及了很多关于GTID的东西在多伦多 Percona Mysql 大学。 它包括MySQL 5.6 gtid 这个新功能的工作概述,可以帮助人们。这是来自该会议的幻灯片。我希望你觉得它有用:MySQL 5.6 GTID in a nutshell
原文: https://www.percona.com/blog/2013/03/26/repair-mysql-5-6-gtid-replication-by-injecting-empty-transactions/