MySQL主从复制中断,报“Error on master: message (format)='Cannot delete or update a parent row: a foreign key constraint fails' error code=1217” 错误

前几天,发现从库挂了,具体报错信息如下:

分析思路

1. 因为我采用的是选择性复制,只针对以下几个库进行复制: card,upay,deal,monitor,collect。所以,不太可能出现对于sas_basic的操作能复制到该从库上。

2. 整个架构是1主2从,且都是选择性复制,上面这个从库是直接复制card,upay,deal,monitor,collect这几个数据库的数据,而另外一个从库则是忽略上述库,如下所示:

怀疑是在上述schema下,执行了DROP TABLE IF EXISTS `sas_basic.old_channel_code`操作。

3. 于是根据报错信息查看了主库binlog日志的内容,发现是在sas_basic schema下操作的。

use `sas_basic`/*!*/;

困惑

针对sas_basic的操作为什么会反映到不复制它操作的从库上。

PS:根据上述报错信息,中途还怀疑主从库的外键定义不一致导致上述问题的产生,后来查看,发现主从库的外键定义是一致的。

原因

上次利用set global sql_slave_skip_counter=1跳过后,今天又碰到了这个问题,深入其中,才发现这是MySQL的一个bug:https://bugs.mysql.com/bug.php?id=77684

但是这个bug中涉及到的版本是5.6.25, 5.6.27。而我生产数据库是5.6.26。于是,在测试机上搭建环境,看能否重现问题。

重现现场

还是一主两从,其中一个从设置replicate-ignore-db=test,另外一个从设置replicate-do-db=test。

在主中执行以下语句:

CREATE DATABASE `db1`;

USE `db1`;

CREATE TABLE `table1` (`ID` bigint(20) primary key) ENGINE=InnoDB;

CREATE TABLE `table2` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `DIVISION_ID` bigint(20) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `FK_TABLE1_DIVISION_1` (`DIVISION_ID`), CONSTRAINT `FK_TABLE1_DIVISION_1` FOREIGN KEY (`DIVISION_ID`) REFERENCES `table1` (`ID`) ON DELETE CASCADE ) ENGINE=InnoDB;

DROP TABLE IF EXISTS `table1`;

结果,replicate-ignore-db=test这个从库中复制正常,但replicate-do-db=test这个从库的复制却出现问题。报如下错误:

 Last_SQL_Error: Query caused different errors on master and slave.     Error on master: message (format)=‘Cannot delete or update a parent row: a foreign key constraint fails‘ error code=1217 ; Error on slave: actual message=‘no error‘, error code=0. Default database: ‘db1‘. Query: ‘DROP TABLE IF EXISTS `table1` /* generated by server */‘
  Replicate_Ignore_Server_Ids: 

完美重现现场。

提交这个Bug的哥们同时也给出了一种替代方案

Suggested fix:
The problem seems to be related to the "USE" above as the following works as expected:

CREATE DATABASE `db1`;
CREATE TABLE `db1`.`table1` (`ID` bigint(20) primary key) ENGINE=InnoDB;
CREATE TABLE `db1`.`table2` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `DIVISION_ID` bigint(20) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `FK_TABLE1_DIVISION_1` (`DIVISION_ID`), CONSTRAINT `FK_TABLE1_DIVISION_1` FOREIGN KEY (`DIVISION_ID`) REFERENCES `db1`.`table1` (`ID`) ON DELETE CASCADE ) ENGINE=InnoDB;
DROP TABLE IF EXISTS `db1`.`table1`;

however if you add an USE `db1` after the CREATE DATABASE statement the replication error will follow.

即在其它schema中删除该表。

但经过测试,无论是在其它schema中执行该操作还是不指定数据库执行该操作,均会使得复制中断。

总结:

1. 该Bug不仅仅在replicate-ignore-db会触发,在replicate-do-db中也会触发。

2. 官方承诺会在5.6.30和5.7.12修复,具体未测。

MySQL主从复制中断,报“Error on master: message (format)='Cannot delete or update a parent row: a foreign key constraint fails' error code=1217” 错误

时间: 2024-10-06 00:11:06

MySQL主从复制中断,报“Error on master: message (format)='Cannot delete or update a parent row: a foreign key constraint fails' error code=1217” 错误的相关文章

MySQL:ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails 可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS = 0; 然后就可以删除表了. 删除完成后设置 SET FOREIGN_KEY_CHE

关于mysql中[Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails

今天在弄mysql的时候突然出现一条这个错误信息,当时就蒙逼了,不过仔细观察一番后发现是外键的原因,这是由于在删除表的时候存在外键关联这时候就会出现删除错误,我们可以暂时把mysq数据库的外键约束给关闭掉,具体方法请看如下: [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails SET FOREIGN_KEY_CHECKS = 0 //关闭外键约束 进行完操作后别忘记了再把外键约束重新打开

Mysql之1451 - Cannot delete or update a parent row: a foreign key constraint fails...解决办法记录

今天使用delete语句删除一张表中的一条信息时,提示了这么一个错误:1451 - Cannot delete or update a parent row: a foreign key constraint fails...错误代码为1451 在这里参考了一位园友的解决方案mysql删除外链解决办法,如下: 关闭外键约束 SET FOREIGN_KEY_CHECKS=0; 语句执行 DELETE FROM blog_blog WHERE blog_blog.id=91; 删除完成后,重新开启外

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

MySQL在删除一张表时出现 可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS = 0; 然后就可以删除表了. 删除完成后设置 SET FOREIGN_KEY_CHECKS = 1; drop table slow_log cascade; ERROR 1580 (HY000) at line 1: You cannot 'DROP' a l

MYSQL: Cannot delete or update a parent row: a foreign key constraint fails

这可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS = 0; 删除完成后设置 SET FOREIGN_KEY_CHECKS = 1; 其他: 关闭唯一性校验 set unique_checks=0; set unique_checks=1;

mysql ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrain fails

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constrain fails. 可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. 1.set foreign_key_checks=0; 2.删除要删除的表; 3.set foreign_key_checks=1; 原文地址:https://w

MySQL设置外键报错 #1452 - Cannot add or update a child row: a foreign key constraint fails 解决方法

MySQL数据库,当我尝试在A表中设置B表的主键为外键时,报出错误:#1452 - Cannot add or update a child row: a foreign key constraint fails  于是去搜索了一下 "#1452 - Cannot add or update a child row: a foreign key constraint fails" 的含义与解决方法,根据这篇博文去排查了报错原因,排除了可能1和可能2,然后去研究可能3的具体含义,一开始并

ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails

MySQL添加外键失败  error 1452解决办法 举例: 两个表       用户表:user   班级表:  grade 用户表中每个用户对应一个班级ID,即gradeId 即:user表的主关键字gradeId是grade表中的Id user表称为主表   grade表称为从表 [sql] alter table user add foreign key (gradeId) references grade(Id ); [error] [原因] user表中的有的gradeId不属于g

删除带外键的表【foreign key constraint fails】报错

title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibernate的时候,刚好学到了一对多,多对多的关联操作.时间也正是刚好在那是有了一个项目,把各表的间的结构还理清,俗话说学到就要用到,就把这些表的结构都能配置级联关系的都把它配上.没想到就在这里给自己放了个小坑.前几天在一个帖子中看到别人说,尽量少配些ORM约束,数据库的外键约束什么的.当时还不以为然.没