MySQL 8.0复制';未知数据库';错误导致复制停止

MySQL 8.0复制';未知数据库';错误导致复制停止,mysql,database-replication,Mysql,Database Replication,我对两台Mysql服务器的复制有问题。主服务器运行Mysql 5.6,从服务器运行Mysql 8.0,因为另一个依赖项至少需要版本8。我只复制了一个数据库,为了这个例子“我的数据库”。但是,在一天中的某个时间点,主机运行备份并尝试更新数据库“my_DB_backups”。我没有复制这个数据库,我只想忽略副本上的这些SQL命令。我在mysql.conf文件中使用以下命令显式忽略此数据库: replicate-ignore-db=my_db_backups 但是,当我重新启动mysql服务器时,我

我对两台Mysql服务器的复制有问题。主服务器运行Mysql 5.6,从服务器运行Mysql 8.0,因为另一个依赖项至少需要版本8。我只复制了一个数据库,为了这个例子“我的数据库”。但是,在一天中的某个时间点,主机运行备份并尝试更新数据库“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
应该只执行与该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
我已经尝试了复制do和复制忽略do配置的每一种组合,我已经尝试添加了:

replicate-wild-ignore-table=my_db_backups.%
以及删除:

replicate-ignore-db=my_db_backups
我试着把它们都放在conf文件中。似乎什么都不管用

我知道我可以显式跳过错误1049,这是我可能最终不得不做的事情。我只是想弄清楚为什么其他配置没有任何效果,不能让它消失


任何帮助都将不胜感激

我注意到,产生错误的语句实际上并没有写入
my\u db\u backups
中的表中。它正在将INSERT复制到
my\u db
中的表中

INSERT INTO my_db.`table_1` SELECT * FROM my_db_backups.`2021_01_04_17_36_22_table_1`
该语句正在从
my\u db\u backups
中的表中读取,但在副本中找不到该表

因此,插入到
my_db.table_1
中的语句将在副本上执行,因为默认数据库
my_db
未被忽略


您还可以通过在主服务器上使用基于行的二进制日志来解决这个问题,因此它从副本上不存在的表中读取数据并不重要。插入操作将在主控台上生成一个行图像,该表确实存在。

啊,谢谢,就是这样。我发现我误解了复制忽略db的工作方式。很遗憾,我无法更改主机上的复制类型。然而,对于阅读这篇文章的人来说,我试图理解你的意思。在文档中:“基于行的格式-告诉服务器不要记录数据库db_名称中任何表的更新。”在我的示例中,db_名称是
my_db_backups
,但这不是正在更新的数据库。你是说即使是这样也行吗?我想对于我自己来说,跳过错误1049是我唯一的选择。再次感谢!正在更新的表位于
my\u db
中。但是,如果在主服务器上使用基于行的格式,则数据来自何处无关紧要,日志将只包含带有文本值的完整行,以插入到
my_db.table_1
。但是如果你不能改变binlog格式,那就行不通了。基于语句的复制的唯一解决方案是你不能过滤数据库。让
my\u db\u备份
表进行复制。跳过错误不是一个明智的解决方案,因为很难让它不跳过合法的错误。