1. 程式人生 > >mysql5.6 主從同步失敗問題解決

mysql5.6 主從同步失敗問題解決

1. 場景分析:

主(hsz_sql0):
#分析主數庫在幹什麼,其中“307844154”是show slave status\G;檢視Last_SQL_Error:…最後 end_log_pos 307844154

/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000002 | grep -A '10' 307844154

在這裡插入圖片描述
1.1
通過上圖(1.1)資訊可以看到 主資料庫hszcjd中ecs_sessions,更新ecs_sessions中的sesskey=’ be5e1c77c83ed4da2692eae3a949f99b’,去主資料庫和從資料庫都找不到該條資料;
備(hsz_sql1):


在這裡插入圖片描述
1.2

通過在從資料庫上圖(1.2)可以看到,主從同步發生異常:

Last_SQL_Error: Could not execute Update_rows event on table hszcjd.ecs_sessions; Can’t find record in ‘ecs_sessions’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event’s master log mysql-bin.000824, end_log_pos 307844154

原因分析:Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND 是主從更新時丟失資料,導致主從不一致,在從庫上mysql> show slave status\G;結果如上圖(1.2),去主資料庫和從資料庫都找不到該條資料,由於ecs_sessions表在主資料庫超時會有刪除的操作,可能在資料同步時網路異常造成資料掉失,而主資料庫該條資料超時會刪掉,所以在主資料庫和從資料庫都沒找到該資料;

2. 解決方案:

2.1:由於該表同步意義不大,超時資料會刪除,配置/etc/my.cnf 中[mysqld]下新增不同步該表資料,重啟從資料庫(hsz_sql1):

replicate-wild-ignore-table=hszcjd.ecs_sessions

重啟資料庫:service mysql restart

2.2:跳過該錯誤,但是沒有徹底解決該問題,以後修改這條資料時,如果主從資料不一致,還是同步失敗,只是暫時解決了該問題。有資料的情況下除非通過修改或更新,使主從資料一致,然後再跳過該錯誤。

在沒配GTID模式同步下可以通過:

stop slave;
set global sql_slave_skip_counter =1;
start slave;

配置GTID模式同步可以通過,SET SESSION GTID_NEXT=‘masterUUID:錯誤位置+1’,其中masterUUID在show slave status\G;命令下可以找到:

STOP SLAVE;
SET SESSION GTID_NEXT = '8e2e8a72-6e7a-11e5-9df0-00163e001264:643142148';
BEGIN; COMMIT;
SET SESSION GTID_NEXT = AUTOMATIC;
START SLAVE;

補充說明:
檢視是否開啟GTID模式:mysql > show variables like '%GTID%';
開啟GTID以後,無法使用sql_slave_skip_counter跳過事務。前面介紹過了,使用GTID找點兒時,主庫會把從庫缺失的GTID,傳送給從庫,所以skip是沒有用的。為了提前發現問題,MySQL在gtid模式下,直接禁止使用set global sql_slave_skip_counter = x。
GTID比傳統複製的優勢:
a、更簡單的實現failover,不用以前那樣在需要找log_file和log_Pos。
b、更簡單的搭建主從複製。
c、比傳統複製更加安全。
d、GTID是連續沒有空洞的,因此主從庫出現數據衝突時,可以用新增空事物的方式進行 跳過。
2.3:把主資料庫資料全部匯出,匯出到備資料庫,修改下從資料庫到同步最新的位置,由於主資料庫(hsz_sql0)主從密碼忘記了,主要重新開放一個同步賬號;

主操作:

GRANT REPLICATION SLAVE ON *.* to '賬號(最好不要給root)'@'%' identified by '密碼';

從操作:

stop slave;
change master to master_host='主機ip',master_user='賬號',master_password='密碼',
     master_log_file='二進位制檔名稱',master_log_pos=最新位置;
start slave;

2.4:重新搭建從資料庫hsz_sql1