[MySQL] 數據庫複製異常恢復之Error_code: 1062 (Duplicate entry)

環境:兩臺服務器雙機備份,數據庫採用主主複製
說明:以下主機指HA集羣的主機

Error_code: 1062
該報錯通常會出現在主機或備機,通常最後兩臺服務器都有該報錯(形式相同,內容不同),我們以主機上的報錯爲準去恢復備機數據。步驟如下:
1、記錄主機(node1)執行show slave status\G;的報錯
Last_SQL_Error: Error 'Duplicate entry '4200000357' for key 'PRIMARY'' on query. Default database: 'somedb'. Query: 'insert into sometable (columns…) values (values…)'

說明:主機和備機報錯爲同一張表。如果僅備機有報錯,記錄備機報錯;如果主機和備機同一張表報錯,記錄較小的那一個id。

2、停止HA服務
# service rgmanager stop; service cman stop

3、停止數據庫主從複製
分別在主、備機上關閉 MySQL 主從複製和 MySQL 事件調度器。

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> stop slave io_thread;
Query OK, 0 rows affected (0.07 sec)
mysql> set global event_scheduler=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| OFF               |
+-------------------+
1 row in set (0.00 sec)

4、數據恢復
4.1 刪除不一致的表記錄
刪除報錯中備機(node2)與主機不一致的表記錄

mysql> use somedb;
mysql> delete from sometable where id>4200000356;
說明:開始不一致的id是4200000357,所以把alaems表中大於420000036的記錄都刪除

4.2 記錄需要恢復到的位置
查看備機錯誤日誌,記錄ERROR出現後stopped的位置
2017-05-23T05:47:16.711096Z 1511 [ERROR] Slave SQL for channel '': Error 'Duplicate entry '4200000358' for key 'PRIMARY'' on query. Default database: 'somedb'. Query: 'insert into sometable (columns…) values (values…)', Error_code: 1062
2017-05-23T05:47:16.711117Z 1511 [Warning] Slave: Duplicate entry '4200000358' for key 'PRIMARY' Error_code: 1062
2017-05-23T05:47:16.711122Z 1511 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000008' position 129383305

4.3 重新定位備機複製主機數據庫的位置
在備機(node2)執行如下操作
mysql> change master to master_log_file='mysql-bin.000008',master_log_pos=129383305;

說明:將備機讀取主機MySQL操作的二進制文件位置改爲備機錯誤日誌中提示的位置(發生該報錯後stoped的位置,即該位置之前的操作是無誤的,重新定位後,會從該位置開始繼續讀取主機的數據庫操作)

4.4 重新定位主機複製備機數據庫的位置
說明:如果主機也有報錯執行,執行該步驟;反之則跳過該步驟(1)    首先在備機(node2)刷新其mysql-bin.xxx

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |  3952751 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.36 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_log_file='mysql-bin.000003',master_log_pos=154;
Query OK, 0 rows affected (0.00 sec)

(2)    然後在主機(node1)重新定位其讀取備機二進制文件的位置

mysql> change master to master_log_file='mysql-bin.000003',master_log_pos=154;
Query OK, 0 rows affected (0.00 sec)

說明:因爲數據庫採用主主複製,主機會複製備機MySQL執行的操作,而數據庫恢復以主機數據爲基準,所以刷新備機的mysq-bin.xxx以新的位置開始,主機就不會去執行備機與自己數據庫不一致的部分。flush logs後,備機mysql-bin.xxx數值加1,重新在一個文件中記錄備機操作。

5、啓動複製
分別在主、備機上開啓和MySQL 事件調度器和MySQL 主從複製。

mysql> set global event_scheduler=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON                |
+-------------------+
1 row in set (0.00 sec)
mysql> start slave io_thread;
Query OK, 0 rows affected (0.07 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

6、 查看主機和備機同步狀態

mysql> show slave status\G;
數據庫恢復正常,不過備機延時較大,但只要主機正常,不影響其業務。
主機(node1)延遲:
Seconds_Behind_Master: 0
備機(node2)延遲:
Seconds_Behind_Master: 86669

等待同步完成,即兩臺服務器上述Seconds_Behind_Master:0

7、啓動HA服務
# service cman start; service rgmanager start

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