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到底做了写什么。

你可能感兴趣的:(set global sql_slave_skip_counter=1)