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到底做了寫什麼。