mysql運維-slave_skip_errors

1 簡介
    mysql在主從複製過程中,由於各種的原因,從服務器可能會遇到執行BINLOG中的SQL出錯的情況,在默認情況下,服務器會停止複製進程,不再進行同步,等到用戶自行來處理。
    slave-skip-errors的作用就是用來定義複製過程中從服務器可以自動跳過的錯誤號,當複製過程中遇到定義的錯誤號,就可以自動跳過,直接執行後面的SQL語句。
2 官方參考

Command-Line Format

--slave-skip-errors=name

System Variable Name

slave_skip_errors

Variable Scope

Global

Dynamic Variable

No

 

Permitted Values

Type

string

Default

OFF

Valid Values

OFF

[list of error codes]

all

ddl_exist_errors

    slave_skip_errors選項有四個可用值,分別爲:off,all,ErorCode,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
    具體測試方法同上,大家可自己驗證。

4 從backup恢復時從機複製出錯的一些解釋

    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
****************************************************************************************

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