MySQL 复制:“休斯顿,我们遇到了问题”

Kat*_*kas 4 mysql replication

我的复制服务器遇到了问题。本质上,我们有 2 个数据库(database1 和 database2)。主服务器两者都有。从站只有database1。有一个

Replicate_Do_DB: database1
Run Code Online (Sandbox Code Playgroud)

在 CHANGE MASTER TO 配置中设置。

现在发生的事情是 - 我们正在使用代码点火器,其中一位程序员创建了 database2 并开始向其中插入信息。代码点火器将默认数据库设置为 database1。现在结果是他生成的每个查询 - 我在 SHOW SLAVE STATUS\G 上收到错误:

Error 'Table 'database2.tbl40' doesn't exist' on query. Default database: 'database1'. Query: 'INSERT INTO `database2`.`tbl40` (`date`, `day`) VALUES ('2011-04-26', '2011-04-26')'
Run Code Online (Sandbox Code Playgroud)

所以基本上,我后来解决了这个问题,但复制不起作用,因为大约有 1000 个查询会为复制服务器产生该错误。

我的问题是 - 有没有办法从二进制日志中清除这样的查询?或者我需要编写一个脚本来执行

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
Run Code Online (Sandbox Code Playgroud)

对于每个产生和错误的查询?

Aar*_*own 5

如果你真的不关心那个表,你可以在从服务器上使用pt-slave-restart并让它跳过这些问题。我对运行它持保守态度,并确保您只跳过对您不关心的表/数据库的查询,或者至少仅跳过特定错误。

您没有在 SHOW SLAVE STATUS 的输出中发布错误代码,但我怀疑它是错误 1146。

例如,这将跳过 1146 的所有错误:

pt-slave-restart -u root -p pass --error-numbers 1146
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试跳过引用该表的所有错误

pt-slave-restart -u root -p pass --error-text 'database2'
Run Code Online (Sandbox Code Playgroud)

另一种方法是replicate-ignore-db=database2在从站上设置并重新启动 MySQL,但是您应该在文档中阅读有关其工作原理的一些注意事项