首页  >  文章  >  数据库  >  MySQL中主从复制重复键问题修复方法

MySQL中主从复制重复键问题修复方法

WBOY
WBOY原创
2016-06-07 16:27:33954浏览

-------------------引用开始------------------------ 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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn