在企業中,數據庫高可用一直是企業的重中之重,中小企業很多都是使用mysql主從方案,一主多從,讀寫分離等,但是單主存在單點故障,從庫切換成主庫需要作改動。因此,如果是雙主或者多主,就會增加mysql入口,增加高可用。不過多主需要考慮自增長ID問題,這個需要特別設置配置文件,比如雙主,可以使用奇偶,總之,主之間設置自增長ID相互不沖突就能完美解決自增長ID沖突問題。
Linux系統環境:SUSE12.4
MySQL數據庫版本:5.7.29
Mysql數據庫架構:雙主
由于業務側在做雙主架構選擇的時候,沒有做VIP高可用冗余,所以只能實現普通的雙主基本復制功能,分別基于maser01和master02之間的讀寫同步復制。
生產中經監控平臺發現MySQL數據庫雙主復制中SQL復制線程斷開,經排查發現雙主復制出現了異常,具體報錯信息如下圖所示:在master02數據庫服務器上發現,同步master01數據庫服務器的SQL線程斷開了,截圖如下:
此時,檢查master01數據庫服務器的同步情況,發現master01同步master02的復制目前是正常顯示的。
通過查看日志文件發現如下報錯信息:
通過上面日志分析,發現雙主同步復制異常存在兩種情況:
A:master01的表數據可能被truncate導致master02同步異常中斷;
B:或者是master01和master02之間數據復制過程中主鍵沖突導致同步異常中斷。最后我們來清查一下對應報錯的表數據在master01和master02兩個庫中的數據是否一致,如果不一致,那就說明其中一個庫中的數據被清理了,或者另一個庫中的表數據同步一直不一致導致同步異常。
1)經報錯信息查詢該表數據統計記錄master02的表數據量為:462740條。
2)同時也記錄了master01數據庫上,該表的數據量為:462733條。與master02對比發現數據量少了7條。
將master02上的這個表全表導出備份后,再將該表數據導入到master01中,最后還是報該表存在數據主鍵沖突,報錯如下:
在導入過程中,需要關閉binlog的記錄setsql_log_bin=0,避免導入數據表時報ID主鍵列沖突數據刷新到日志中,這樣master01的表數據就會被master02的表數據全部置換,在主主同時寫同時復制的情況下,之前一樣的數據就沒有了,最后剩下的是7條不一致的數據。雖然把主主復制功能恢復了,但是這個cer_work_order_temp表數據被新的二進制文件數據置換掉了,最終導致這表數據丟失。
通過全備+增量備份在測試環境對cer_work_order_temp表進行數據恢復,先找到增量起始點position812016541結合二進制日志進行恢復該表在master02服務器上的數據。
第一個binlog日志恢復命令如下:
mysql-bin.000025一次執行不完,分兩次執行: 第一次: mysqlbinlog --no-defaults --start-position="812016541" --stop-position="883789149" mysql-bin.000025 |mysql --login-path=myconn 第二次: mysqlbinlog --no-defaults --start-position="883789256" mysql-bin.000025 |mysql --login-path=myconn |
第二個binlog日志恢復命令如下:
因第二個日志mysql-bin.000026事務量比較大,如果像第一個binlog那樣恢復的話,時間會很慢,所以第二個日志binlog我們采用sql文件導入方式:
根據發生的故障時間點,進行二進制日志數據的提取,提取方式如下所示:
mysqlbinlog --stop-datetime=2020-07-07 23:59:59 mysql-bin.000026 > new_026.sql |
刪除原表主鍵,再重建新表及1條索引,目的為了導入數據不沖突,并且導入速度快。
刪除主鍵并建索引: alter table cer_work_order_temp drop primary key; create index aa on cer_work_order_temp(serial_no); 創建新的aa表并把cer_work_order_temp信息同步: create table aa as select *,count(distinct serial_no) from cer_work_order_temp group by serial_no; |
再把new_026.sql數據導入數據庫即可
[mysql@vgasmrzfaceresource02 ~]$cat mysql_in.sh mysql --login-path=myconn< use smzrz; set names utf8mb4; select database(); set sql_log_bin=0; source /data/backup/new_026.sql EOF |
最終數據查詢,如下查詢已經恢復到原始數據量。
最后把這個表數據mysqldump到master01/master02數據庫,再把雙主復制功能恢復就可以了。
此次故障恢復還是算流暢的,沒有遇到較大的難點,數據庫服務器恢復正常后,也通知業務側那邊進行數據校驗,同時得到他們的認可數據恢復一致,沒有問題再現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/130108.html
摘要:上個文章集群搭建主主從模式中我們知道如何搭建主主從模式,今天這個文章正式進入高可用的架構。由開發,用來管理和監控雙主復制,雖然是雙主架構,但是業務上同一時間只允許一個節點進行寫入操作。包含兩類角色和分別對應讀寫節點和只讀節點。 上個文章 MySQL集群搭建(2)-主主從模式 中我們知道如何搭建 MySQL 主主從模式,今天這個文章正式進入 MySQL 高可用的架構。 1 MMM 介紹 ...
MySQL高可用方案測試 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1902·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2748·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20