-------------------引用开始------------------------ 3.如果您决定可以跳过主服务器的下一条语句,请发出以下语句: mysql SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; mysql 启动从机; n sh
的值-------------------引用开始------------------------ 3.如果您决定可以跳过主服务器的下一条语句,请发出以下语句: mysql>设置全局 SQL_SLAVE_SKIP_COUNTER = n; mysql>启动从机;如果主服务器的下一条语句不使用 AUTO_INCRMENT 或 LAST_INSERT_ID(),则 n 的值应为 1。否则,该值应为 2。对于使用 AUTO_INCRMENT 或 LAST_INSERT_ID() 的语句使用值 2 的原因是它们在主服务器的二进制日志中获取两个事件。
--------------------引用结束------------------------
MySQL文档中的意思是当master传到slave的语句中用到auto_increment,或者last_insert_id()时,需要skip两个事件。 但实际情况并非如此
测试过程如下: 172.16.161.26 为master 172.16.161.15 为slave 同步c2cdb,初始状态ok
1。 在master上创建测试表
mysql> create table tmp_test_0208(id int not null auto_increment,name varchar(30),primary key(id)) engine=innodb; Query OK, 0 rows affected (0.20 sec)
2、在药膏上插入3条记录
mysql> insert into tmp_test_0208 values(1,'a'),(2,'b'),(3,'c'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from tmp_test_0208; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ 3 rows in set (0.00 sec)
3、在master上插入3条记录
mysql> insert into tmp_test_0208(name) values('a'),('b'),('c'); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from tmp_test_0208; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ 3 rows in set (0.00 sec)
4、从属的sql线程中止
/usr/local/mysql/bin/mysql -uroot -pxxx c2cdb -s -e "show slave status\G" |egrep "Slave_IO_Running|Sl ave_SQL_Running" Slave_IO_Running: Yes Slave_SQL_Running: No
5, 跳过下一个statemate后启动slave正常
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ; Query OK, 0 rows affected (0.00 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) /usr/local/mysql/bin/mysql -uroot -pxxx c2cdb -s -e "show slave status\G" |egrep "Slave_IO_Running|Sl ave_SQL_Running" Slave_IO_Running: Yes Slave_SQL_Running: Yes
slave端errlog如下: 070208 16:07:59[ERROR] Slave: 查询时出现“重复条目 '1' for key 1'”错误。默认数据库:“c2cdb”。查询:'插入 tmp_test_0208(name) 值('a'),('b'),('c')',Error_code: 1062
070208 16:07:59 [错误] 运行查询时出错,从属 SQL 线程中止。修复问题,然后使用“SLAVE START”重新启动从属 SQL 线程。我们停在日志“db_auction1-bin.000203”位置 14215101
070208 16:09:59 [注意]从属 SQL 线程已初始化,在位置 14215101 处的日志 'db_auction1-bin.000203' 中开始复制,中继日志 './db_auction1_b-relay-bin.000457' 位置:200682931
master雕刻binlog中相应的记录如下:
# 在 14215101 #070208 16:08:00 服务器 id 1 log_pos 14215101 Intvar SET INSERT_ID=1; # 在 14215129 #070208 16:08:00 服务器 id 1 log_pos 14215129 查询 thread_id=2744782 exec_time=0 error_code=0 SET TIMESTAMP=1170922080;插入 tmp_test_0208(name) 值('a'),('b'),('c');
总结:使用SET GLOBAL SQL_SLAVE_SKIP_COUNTER命令跳过失败的SQL