mysql同步GLOBAL sql_slave_skip_counter解釋

大傢都知道,當slave出現錯誤時,可以通過SET GLOBAL sql_slave_skip_counter = N來跳過錯誤,但是這個N,又真正代表什麼呢。

This statement skips the next N events from the master
即他是跳過N個events,這裡最重要的是理解event的含義
在mysql中,對於sql的 binary log 他實際上是由一連串的event組成的一個組,即事務組。
我們在master上可以通過
SHOW BINLOG EVENTS 來查看一個sql裡有多少個event。
通過例子來說明下,真正的event的含義:
在slave上
show slave status
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '193' for key 'PRIMARY'' on query. Default database: 'ssldb'. Query: 'insert slave_no_skip1  values (193,'y10')'
Skip_Counter: 0
在 master 上,執行
mysql> SHOW BINLOG EVENTS in 'mysql-bin.000010' from 46755013;
+——————+———-+————+———–+————-+——————————————————–+
| Log_name         | Pos      | Event_type | Server_id | End_log_pos | Info                                                   |
+——————+———-+————+———–+————-+——————————————————–+
| mysql-bin.000010 | 46755013 | Query      |         1 |    46755082 | BEGIN                                                  |
1| mysql-bin.000010 | 46755082 | Query      |         1 |    46755187 | use `ssldb`; insert slave_no_skip1  values (193,'y10') |
2| mysql-bin.000010 | 46755187 | Xid        |         1 |    46755214 | COMMIT /* xid=4529451 */                               |
3| mysql-bin.000010 | 46755214 | Query      |         1 |    46755283 | BEGIN                                                  |
4| mysql-bin.000010 | 46755283 | Query      |         1 |    46755387 | use `ssldb`; insert slave_no_skip1 values (194,'y11')  |
5| mysql-bin.000010 | 46755387 | Xid        |         1 |    46755414 | COMMIT /* xid=4529452 */                               |
6| mysql-bin.000010 | 46755414 | Query      |         1 |    46755483 | BEGIN                                                  |
7| mysql-bin.000010 | 46755483 | Query      |         1 |    46755587 | use `ssldb`; insert slave_no_skip1 values (195,'y12')  |
8| mysql-bin.000010 | 46755587 | Xid        |         1 |    46755614 | COMMIT /* xid=4529453 */                               |
9| mysql-bin.000010 | 46755614 | Query      |         1 |    46755683 | BEGIN                                                  |
10| mysql-bin.000010 | 46755683 | Query      |         1 |    46755788 | use `ssldb`; insert slave_no_skip1  values (196,'y13') |
11| mysql-bin.000010 | 46755788 | Xid        |         1 |    46755815 | COMMIT /* xid=4529454 */                               |
12| mysql-bin.000010 | 46755815 | Query      |         1 |    46755884 | BEGIN                                                  |
13| mysql-bin.000010 | 46755884 | Query      |         1 |    46755989 | use `ssldb`; insert slave_no_skip1  values (197,'y14') |
14| mysql-bin.000010 | 46755989 | Xid        |         1 |    46756016 | COMMIT /* xid=4529455 */                               |
15| mysql-bin.000010 | 46756016 | Query      |         1 |    46756085 | BEGIN                                                  |
16| mysql-bin.000010 | 46756085 | Query      |         1 |    46756190 | use `ssldb`; insert slave_no_skip1  values (198,'y15') |
17| mysql-bin.000010 | 46756190 | Xid        |         1 |    46756217 | COMMIT /* xid=4529456 */                               |
18| mysql-bin.000010 | 46756217 | Query      |         1 |    46756286 | BEGIN                                                  |
19| mysql-bin.000010 | 46756286 | Query      |         1 |    46756391 | use `ssldb`; insert slave_no_skip1  values (199,'y16') |
20| mysql-bin.000010 | 46756391 | Xid        |         1 |    46756418 | COMMIT /* xid=4529457 */                               |
21| mysql-bin.000010 | 46756418 | Query      |         1 |    46756487 | BEGIN                                                  |
22| mysql-bin.000010 | 46756487 | Query      |         1 |    46756592 | use `ssldb`; insert slave_no_skip1  values (190,'y17') |
| mysql-bin.000010 | 46756592 | Xid        |         1 |    46756619 | COMMIT /* xid=4529458 */                               |
+——————+———-+————+———–+————-+——————————————————–+
24 rows in set (0.00 sec)        
通過錯誤可知,他是use `ssldb`; insert slave_no_skip1  values (193,'y10') 這條語句導致錯誤瞭
如果我們想跳到最後一條語句“use `ssldb`; insert slave_no_skip1  values (190,'y17')“的話 ,我們必須簡單計算下中間有多少個event
很明顯,是21,那麼我們可以執行SET GLOBAL sql_slave_skip_counter =21(這裡你SET GLOBAL sql_slave_skip_counter =19或者20都可以)
在slave 在次執行show slave status查看
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '190' for key 'PRIMARY'' on query. Default database: 'ssldb'. Query: 'insert slave_no_skip1  values (190,'y17')'
Skip_Counter: 0
可見 他已經如我所願,跳到use `ssldb`; insert slave_no_skip1  values (190,'y17')這裡瞭。
以下是我遇到的情況,同事在試命令.搞的同步出錯.
          Slave_SQL_Running: No
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 1103
                 Last_Error: Error 'Incorrect table name 'aaaaaa.t_period'' on query. Default database: 'aaaaaa'. Query: 'CREATE TABLE if not exists `aaaaaa.t_period` (  `Fid` bigint NOT NULL AUTO_INCREMENT,  `Ftype` int(3) NOT NULL DEFAULT '0',  `Fuid` int(11) NOT NULL DEFAULT '0',  `Fquest_id` int(11) NOT NULL DEFAULT '0',  `Fstep` int(3) NOT NULL DEFAULT '0',  `Ffinish_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',  PRIMARY KEY (`Fid`),  UNIQUE KEY (`Ftype`, `Fuid`, `Fquest_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8'
               Skip_Counter: 0
        Exec_Master_Log_Pos: 92449874
執行到這句出錯瞭.Exec_Master_Log_Pos: 92449874
在master上查詢 mysql -uroot -e "SHOW BINLOG EVENTS in  'mysql-bin.000014' from 92562567 limit 100;"就這一條命令字節跳過即可.
如果錯誤events比較多,可以按上面的情況處理.
還可以在my.cnf中設置如下選項自動跳過這種錯誤.
slave-skip-errors=1062

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *