MySQL删除数据库后未清理参照约束,重建同名库外键报错如何解决?
故障根因
- 该问题是MySQL 8.0.22版本在macOS环境下的已知InnoDB数据字典元数据残留bug:执行
DROP DATABASE操作时,如果操作瞬间存在未提交的背景事务、元数据锁抢占,会导致数据字典中对应schema的外键约束元数据没有被同步删除,成为无对应schema的游离残留记录。 - 残留的外键约束会和同名新库的表资源产生冲突,即便你的SQL脚本中加约束的逻辑在末尾,只要新库的表名和旧库表名一致,InnoDB在初始化表元数据时就会匹配到残留的约束记录,提前触发外键约束报错。这也解释了为什么更换其他库名可以正常建库,因为残留约束仅和旧库名绑定,不会匹配到其他名称的schema。
解决方案
临时修复(快速恢复建库能力)
- 停止MySQL服务
mysql.server stop
- 以强制恢复模式启动MySQL,跳过权限校验
mysqld --skip-grant-tables --innodb_force_recovery=3
- 登录MySQL执行以下命令,清理旧库残留的外键元数据,将下方
旧库名替换为你实际的数据库名称
DELETE FROM mysql.innodb_foreign WHERE db_name = '旧库名'; DELETE FROM mysql.innodb_foreign_cols WHERE db_name = '旧库名'; FLUSH TABLES;
- 关闭当前MySQL进程,正常重启服务即可重新执行建库脚本
mysql.server restart
永久规避方案
- 升级MySQL Community Server到8.0.28及以上版本,该元数据残留bug已在后续版本正式修复
- 后续执行
DROP DATABASE前先执行SET FOREIGN_KEY_CHECKS=0;关闭外键校验,完成删库后执行FLUSH TABLES;清理表缓存,可大幅降低残留概率
内容的提问来源于stack exchange,提问作者henryhbk
相关产品推荐
相关产品推荐

