Mariadb 主從數據不一致問題

數據庫環境:Mariadb 10.1.12

主從架構:一主三從

問題描述:今日接到某項目組故障技術支持請求,稱他們的系統的三個從庫在同一時間全部因“sql thread”關閉而丟失主從關係。

 

分析過程:首先通過命令show slave status \G;

                  發現slave_sql_running線程的狀態爲“NO”

                  last_error這行顯示:could not execute update_rows_xxx event on table user.t1;can't find record in 't1',error_code                           1032.....  the event's log mysql-bin.004417。

                 因爲沒有太多線索可以直接引用,所以只能根據數據庫提示的binlog名稱和具體gtid值去查詢二進制文件中是否有一些有價值的信息。

                 通過使用 mysqlbinlog --no-defaults -v --base64-output=decode-rows mysql-bin.004417 > /tmp/binlog.txt,

通過gtid值查找binlog.txt文件發現相對應的位置上只是一條簡單的update語句,語句簡化如下:update t1 set a=xyz where b=x。此時,思路又陷入僵局中,這個sql語句並沒有過多的提示,最後經過和項目組運維人員討論,決定先比對主從之間到底相差多少條數據入手,經過使用select count(*) from t1 where取一個合適的值統計後發現主庫(1040條)比從庫(1032)多了8條數據。

這8條不同的數據又如何找到呢?方法應該是很多:UE、EXCEL、DIFF命令,這裏我使用excel的單獨排序每條數據的id列,i找到了這8條數據,其中,7條數據顯示今天主庫的插入記錄,這7條可以忽略不計,根據id值,找到了剩下那1條數據的插入顯示時間爲半個月前的一個晚上,這就奇怪了,主庫居然有一條從庫沒有的數據,大家都知道從庫是根據binlog日誌同步主庫數據的,現在主庫居然瞞着備庫發生了這條數據DML操作!!

到目前爲止,可以得到的初步結論是:主庫比從庫多一條半個月前的數據,今天主庫更新了這條記錄,從庫發現並沒有相應的數據,繼而導致從庫sql線程停止;第二個初步結論是:binlog居然不記錄DML操作!!!

這時,查半個月前的binlog日誌文件已經不在操作系統上了。

往往這時,官方文檔會有很好的發揮餘地。以下摘自mariadb關於複製的解讀:

Replication is based upon the binary log. However, cascading deletes or updates based on foreign key relations are an internal mechanism, and are not written to the binary log.

Because of this, an identical statement run on the master and the slave may result in different outcomes if the foreign key relations are not identical on both master and slave This could be the case if the storage engine on one supports cascading deletes (e.g. InnoDB) and the storage engine on the other does not (e.g. MyISAM), or the one has specified a foreign key relation, and the other hasn't.

大意是:基於外鍵級聯刪除和更新的操作屬於內部機制,是不記錄binlog日誌的。

如果主和從服務器的外鍵關係不相同,則在主從服務器上運行相同的sql語句會導致不同的結果;或者主服務器上支持級聯刪除的存儲引擎(innodb),從上面不支持(myisam),或者主上面支持外鍵,從上面不支持。

以上結論都可以導致問題的發生。

參考地址如下:https://mariadb.com/kb/en/library/replication-and-foreign-keys/

問題分析到最後,結果是這個屬性導致的。同時,在從庫上的錯誤日誌中可以發現這麼一條語句:

 internal mariadb error code:1032      呵呵,數據庫早就告訴DBA這是一條內部錯誤。

問題分析到這,明天去項目組驗證這個由外鍵引起的一個問題。

 

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