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 确实存在。
我在复制两个 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 确实存在。