MySQL 8.0 复制 'Unknown Database' 错误导致复制停止

MySQL 8.0 Replication 'Unknown Database' Error Causes Replication to Stop

我在复制两个 Mysql 服务器时遇到问题。主服务器是 运行 Mysql 5.6,从服务器是 运行 Mysql 8.0,因为另一个依赖项至少需要版本 8。我只复制一个数据库,对于这个例子清酒 'my_db'。然而,在一天中的某个时间点,master 运行备份并尝试更新 DB 'my_db_backups'。我不是在复制这个数据库,我只是想忽略副本上的这些 SQL 命令。我在我的 mysql.conf 文件中明确忽略了这个数据库,使用:

replicate-ignore-db=my_db_backups

然而,当我重新启动 mysql 服务器时,我继续看到错误:

Last_SQL_Errno: 1049
Last_SQL_Error: Error 'Unknown database 'my_db_backups'' on query. Default database: 'my_db'. Query: 'INSERT INTO my_db.`table_1` SELECT * FROM my_db_backups.`2021_01_04_17_36_22_table_1`'

我读过的所有内容似乎都表明设置 replicate-do-db 应该只执行与该数据库相关的查询。另外添加一个明确的忽略,replicate-ignore-db,我希望也能工作,但我没有运气。

我的完整 mysql.conf 看起来像这样:

[mysqld]
server-id=20
lower_case_table_names=1
updatable_views_with_limit=1
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
replicate-ignore-db=my_db_backups
replicate-ignore-table=my_db.mysql_8_incompatible_view_1
replicate-ignore-table=my_db.mysql_8_incompatible_view_2
replicate-ignore-table=my_db.mysql_8_incompatible_view_3
replicate-ignore-table=my_db.mysql_8_incompatible_view_4
replicate-wild-do-table=my_db.%
replicate-do-db=my_db

我已经尝试了这些 replicate-do 和 replicate-ignore-do 配置的所有组合,我已经尝试添加:

replicate-wild-ignore-table=my_db_backups.%

并删除:

replicate-ignore-db=my_db_backups

我试过将它们都放在 conf 文件中。似乎没有任何效果。

我知道我可以明确地跳过错误 1049,这是我最终可能不得不做的。我只是想弄清楚为什么其他配置没有任何效果并且不能放手。

如有任何帮助,我们将不胜感激!

我注意到产生错误的语句实际上并未写入 my_db_backups 中的 table。它正在将 INSERT 复制到 my_db 中的 table。

INSERT INTO my_db.`table_1` SELECT * FROM my_db_backups.`2021_01_04_17_36_22_table_1`

该语句 正在从 my_db_backups 中的 table 读取,它在副本上找不到。

所以插入 my_db.table_1 的语句将在副本上执行,因为默认数据库 my_db 没有被忽略。

您也可以通过在主服务器上使用基于 ROW 的二进制日志来解决此问题,因此它正在从副本上不存在的 table 读取并不重要。 INSERT 会在 master 上生成行图像,其中 table 确实存在。