程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MYSQL數據庫復制時跳過錯誤的方法

MYSQL數據庫復制時跳過錯誤的方法

編輯:MySQL綜合教程


MYSQL數據庫復制時跳過錯誤的方法   在MYSQL進行Replication的時候,有時候會由於主從端的POS點不同,導致復制的SQL進程出現錯誤,從而導致主從復制失敗。比如在主端復制一個ID是100的到從端,而此時由於某種原因從端已經有了ID=100的記錄,這時進行INSERT操作的時候,就會主鍵重復,插入失敗。這時候需要跳過這條錯誤。方法如下   1:停止SLAVE 服務 mysql> STOP SLAVE;   2:設置跳過的EVENT個數 mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;   www.2cto.com   3:啟動SLAVE服務 mysql> START SLAVE;   下面闡述下N的意思,轉帖 大家都知道,當slave出現錯誤時,可以通過SET GLOBAL sql_slave_skip_counter = N來跳過錯誤,但是這個N,又真正代表什麼呢,開始時, 理解錯了,以為對於事務型,N代表N個事務,而非事務型,代表一條sql 語句。後經過linuxtone曹哥指導發現,其實並不是這麼回事
  文檔中有介紹說(http://dev.mysql.com/doc/refman/ ... e-skip-counter.html): 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  www.2cto.com   在 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                                                  |  | 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)                www.2cto.com   通過錯誤可知,他是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')這裡了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved