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

-------------------quote begin------------------------ 3. If you decide that you can skip the next statement from the master, issue the following statements: mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n; mysql> START SLAVE; The value of n should be 1 if the next statement from the master does not use AUTO_INCREMENT or LAST_INSERT_ID(). Otherwise, the value should be 2. The reason for using a value of 2 for statements that use AUTO_INCREMENT or LAST_INSERT_ID() is that they take two events in the binary log of the master.

-------------------quote end------------------------

MySQL文档中的意思是当master传到slave的语句中要用到auto_increment,或者last_insert_id()时,需要skip两个event. 但实际情况并非如此

测试过程如下: 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, 在salve上insert 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上insert 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,  slave 的sql thread 中止

/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,  skip next statemate后start 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: Error 'Duplicate entry '1' for key 1' on query. Default database: 'c2cdb'. Query: 'insert into tmp_te st_0208(name) values('a'),('b'),('c')', Error_code: 1062

070208 16:07:59 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE  START". We stopped at log 'db_auction1-bin.000203' position 14215101

070208 16:09:59 [Note] Slave SQL thread initialized, starting replication in log 'db_auction1-bin.000203' at position 14215101, rela y log './db_auction1_b-relay-bin.000457' position: 200682931

 

master羰binlog中相应的记录如下:

# at 14215101 #070208 16:08:00 server id 1  log_pos 14215101  Intvar SET INSERT_ID=1; # at 14215129 #070208 16:08:00 server id 1  log_pos 14215129  Query   thread_id=2744782       exec_time=0     error_code=0 SET TIMESTAMP=1170922080; insert into tmp_test_0208(name) values('a'),('b'),('c');

总结:使用SET GLOBAL SQL_SLAVE_SKIP_COUNTER 命令跳过失败的SQL

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索主从复制
重复键
mysql 主从复制、mysql主从复制配置、mysql gtid 主从复制、mysql主从复制原理、mysql主从复制延迟,以便于您获取更多的相关知识。

时间: 2024-09-17 03:40:14

MySQL中主从复制重复键问题修复方法_Mysql的相关文章

MySQL中删除重复数据的简单方法_Mysql

MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考. 第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表 create table tmp3 as select min(id) as col1 from data_content

mysql中关于Myisam_recover自动修复的使用方法_Mysql

Myisam_revocer控制了Myisam查找和修复错误的方式. 自动修复MySQL的myisam表 常用MySQL的童鞋都知道这个myisam类型的表极容易损坏,多数人可能都是用myisamchk命令来人工修复,下面介绍一种自动修复myisam的方法,也是我上午刚学的,共同进步,呵呵~ 在MySQL的配置文件my.cnf中,启动项部分加入myisam-recover设置数据恢复功能,具体参数如下: DEFAULT 与没有使用--myisam-recover选项相同. BACKUP 如果在恢

mysql中为用户设置密码的多种方法_Mysql

当初次在机器上安装完Mysql时,你可以匿名进行访问数据库或者以不带口令的root身份进入数据库.另外如果你是一个管理员,你还要进行一些用户的建立及授权,这又涉及到设置密码的问题.下面我们就讨论一下如何设置密码: 首先我们应该知道Mysql数据库中的口令存储必须用password()函数加密它.因为在user表中是以加密形式存储口令,而不是作为纯文本.如果你没有加密,直接在数据库中执行以下语句: 复制代码 代码如下: use mysql insert into user (host,user,p

详解MySQL中的SQRT函数的使用方法_Mysql

MySQL的SQRT函数是用来计算出任何数量的平方根.可以使用SELECT语句找出方检定根的任意数如下: mysql> select SQRT(16); +----------+ | SQRT(16) | +----------+ | 4.000000 | +----------+ 1 row in set (0.00 sec) 所看到的浮点值,因为内部MySQL将处理浮点数据类型的平方根. 可以使用SQRT函数,计算出记录的平方根.了解SQRT函数更详细用法,考虑EMPLOYEE_TBL的表具

在MySQL中增添新用户权限的方法_Mysql

有2个不同的方法增加用户:通过使用GRANT语句或通过直接操作MySQL授权表.比较好的方法是使用GRANT语句,因为他们是更简明并且好像错误少些.  下面的例子显示出如何使用MySQL客户安装新用户.这些例子假定权限根据以前的章节描述的缺省被安装.这意味着为了改变,你必须在MySQL正在运行同一台机器上,你必须作为MySQL root用户连接,并且root用户必须对MySQL数据库有insert权限和reload管理权限.另外,如果你改变了root用户口令,你必须如下的MySQL命令指定它. 

Mysql中存储UUID去除横线的方法_Mysql

参考: http://stackoverflow.com/questions/412341/how-should-i-store-guid-in-mysql-tables 通常用UUID做唯一标识,需要在数据库中进行存储. UUID的格式 复制代码 代码如下: String string = UUID.randomUUID().toString();  System.out.println("uuid:" + string); uuid:05ba463f-1dab-471f-81c7-

学习入门:在MySQL中定义外键

和所有开源项目的参考文档一样,MySQL文档中的SQL语法说明让我等初学者看起来头大.这不,今天我花了大半天的工夫,才把在MySQL中设置外键的语法弄明白,所以赶紧写下来,一来加深一下印象,二来万一过两天忘了,自己也好回来查一下. 定义数据表 假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息.用来保存整机产品信息的表叫做 pc:用来保存配件供货信息的表叫做 parts. 在 pc 表中有一个字段,用来描述这款电脑所使用的CPU型号: 在 parts 表中相应有一个字段,描述的正是CPU

MySQL中的SQRT函数的使用方法

  这篇文章主要介绍了详解MySQL中的SQRT函数的使用方法,是MySQL入门学习中的基础知识,需要的朋友可以参考下 MySQL的SQRT函数是用来计算出任何数量的平方根.可以使用SELECT语句找出方检定根的任意数如下: ? 1 2 3 4 5 6 7 mysql> select SQRT(16); +----------+ | SQRT(16) | +----------+ | 4.000000 | +----------+ 1 row in set (0.00 sec) 所看到的浮点值,

select-关于mysql中查询重复数据的疑问

问题描述 关于mysql中查询重复数据的疑问 我有一个表叫做sc. 现在要查询score中有相同分数的信息, 查询的sql语句是 select * from sc where score in (select score from sc group by score having count(score)>1); 我很好奇的是group by的执行顺序是比 having先执行啊, 按道理,执行了之后重复的score值是没有的,怎么还能再用having 来查出count(score)>1 的重复