1. 程式人生 > >set global sql_slave_skip_counter=1

set global sql_slave_skip_counter=1

由於字符集編碼問題,導致slave上insert中文時出錯。

處理過程為:
1. 先停止slave
mysql>stop slave;

2. 跳過slave上的1個錯誤
mysql>set  global sql_slave_skip_counter=1;

3.在slave上手工插入一條資料
mysql>insert into  ...

4.啟動slave
mysql>start slave;

5.過了一段時間,待Seconds_Behind_Master為0後
mysql>pager grep -i -E  'Running|Seconds'
mysql>show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
        Seconds_Behind_Master: 0
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)

6.檢查同步表的資料,發現slave比master少一條
mysql>select count(1)  from test;


此時master上業務已經停止更新test表中的資料。


檢查master上的binlog:
# at 666
#141121 14:23:38 server id 150  end_log_pos 755 CRC32 0x10a3f34c        Query   thread_id=411   exec_time=0     error_code=0
SET TIMESTAMP=1416551018/*!*/;
BEGIN
/*!*/;
# at 755
#141121 14:23:38 server id 150  end_log_pos 865 CRC32 0xca82b435        Query   thread_id=411   exec_time=0     error_code=0
SET TIMESTAMP=1416551018/*!*/;
insert into test values('北京')

/*!*/;
# at 865
#141121 14:23:38 server id 150  end_log_pos 975 CRC32 0xd377f37e        Query   thread_id=411   exec_time=0     error_code=0
SET TIMESTAMP=1416551018/*!*/;
insert into test values(‘上海’)
/*!*/;
# at 975
#141121 14:23:38 server id 150  end_log_pos 1006 CRC32 0x91c3fc01       Xid = 2745705
COMMIT/*!*/;
發現在一個BEGIN/insert/COMMIT中插入了多條資料,而我只在slave上插入了一條。
所以資料會比master上少一條。去slave上查詢,果然找不到這個事物中插入的另一條記錄。
這是因為如果跳過的event在一個事物內,則整個事物的event都會被跳過。

所以在使用set  global sql_slave_skip_counter=1; 時要注意以下幾點:
1. 檢查跳過的event是否在一個事物中
2. 跳過slave上的event進行後續處理後要檢查資料的一致性。
3. 最好能在master的binglog上檢視一下跳過的evnet到底做了寫什麼。