Repair MySQL 5.6 GTID replication by injecting empty transactions


在前面文章我提到了兩種關於如何修復 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章