mysql在主從複製過程中,由於各種的原因,從服務器可能會遇到執行BINLOG中的SQL出錯的情況,在默認情況下,服務器會停止複製進程,不再進行同步,等到用戶自行來處理。
slave-skip-errors的作用就是用來定義複製過程中從服務器可以自動跳過的錯誤號,當複製過程中遇到定義的錯誤號,就可以自動跳過,直接執行後面的SQL語句。
2 官方參考
Command-Line Format |
--slave-skip-errors=name |
|
System Variable Name |
||
Variable Scope |
Global |
|
Dynamic Variable |
No |
|
|
Permitted Values |
|
Type |
string |
|
Default |
OFF |
|
Valid Values |
OFF |
|
[list of error codes] |
||
all |
||
ddl_exist_errors |
默認情況下該參數值是off,我們可以列出具體的error code,也可以選擇all,mysql5.6及MySQL Cluster NDB 7.3以及後續版本增加了參數ddl_exist_errors,該參數包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
一些error code代表的錯誤如下:
1007:數據庫已存在,創建數據庫失敗
1008:數據庫不存在,刪除數據庫失敗
1050:數據表已存在,創建數據表失敗
1051:數據表不存在,刪除數據表失敗
1054:字段不存在,或程序文件跟數據庫有衝突
1060:字段重複,導致無法插入
1061:重複鍵名
1068:定義了多個主鍵
1094:位置線程ID
1146:數據表缺失,請恢復數據庫
1053:複製過程中主服務器宕機
1062:主鍵衝突 Duplicate entry '%s' for key %d my.cnf中的寫法:
slave_skip_errors=1062,1053
slave_skip_errors=all
slave_skip_errors=ddl_exist_errors
作爲mysql啓動參數的寫法:--slave-skip-errors=1062,1053
--slave-skip-errors=all
--slave-skip-errors=ddl_exist_errors
從數據庫中查看該參數的值:
mysql> show variables like 'slave_skip%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_skip_errors | 1007 |
+-------------------+-------+
3 舉例分析 3.1 測試說明
配置好mysql主從同步,然後在從上寫入數據,造成主從不一致。
3.2 準備測試表結構
在主機上創建表:
create table replication (c1 int not null primary key, c2 varchar(10));
3.3 準備測試數據在主機上插入基礎數據
mysql> insert into replication values (1, 'test1');
mysql> insert into replication values (2, 'test2');
此時,主機從機replication表裏面都有兩條記錄
3.4 開始測試
從機插入一條記錄
mysql> insert into replication values (3, 'test3');
然後在主機上執行相同的操作
mysql> insert into replication values (3, 'test3');
在從機上查看複製狀態
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.222
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 16700
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 16595
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table: mysql.ibbackup_binlog_marker
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.backup_%
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '3' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into replication values (3, 'test3')'
Skip_Counter: 0
Exec_Master_Log_Pos: 16425
Relay_Log_Space: 17544
可以看到:sql線程已經停止工作 Slave_SQL_Running: No錯誤號爲:Last_Errno: 1062
錯誤信息爲:Last_Error: Error 'Duplicate entry '3' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into replication values (3, 'test3')'
如果我們在my.cnf中加入如下選項,則可跳過此錯誤,數據同步繼續進行。
[mysqld]
slave_skip_errors=1062
具體測試方法同上,大家可自己驗證。mysql企業版備份工具meb提供在線熱備功能,如果在備份過程中執行ddl操作,從機需要從主機的備份恢復時可能會異常,從而導致從機同步數據失敗。原因是從機恢復時需要先從備份文件恢復(包含備份過程中執行的ddl語句),同步時不是從全備後的最後一個位置同步,而是從ddl的上個位置同步,如果再次執行該ddl語句在從機上不會造成衝突,則同步繼續,如果會造成衝突,同步終止。解決此衝突的辦法是在my.cnf文件中加入一行
[mysqld]
slave_skip_errors=ddl_exist_errors
5 注意事項5.1 該參數爲全局靜態參數,不能動態調整,可在my.cnf中加入該參數列表後重啓mysql服務器生效。
5.2 必須注意的是,啓動這個參數,如果處理不當,很可能造成主從數據庫的數據不同步,在應用中需要根據實際情況,如果對數據完整性要求不是很嚴格,那麼這個選項確實可以減輕維護的成本
****************************************************************************************
原文地址:http://blog.csdn.net/jesseyoung/article/details/40585809
博客主頁:http://blog.csdn.net/jesseyoung
****************************************************************************************