是否可以阻止非复制数据库破坏复制的mysql错误?

时间:2014-09-17 07:14:15

标签: mysql database-replication

我有点惊讶地看到一个mysql slave显示复制因复制错误而停止。它显示的错误来自主人,但是在一个没有被复制的数据库上。

主人在/etc/my.cnf部分的[mysqld]中有当前配置:

binlog-do-db=some_db_1
binlog-do-db=some_db_2
binlog-do-db=some_db_3

在slave上,这些数据库被复制而没有问题。我们使用的复制类型是MIXED。但是,停止复制的从站上的错误是与另一个数据库相关的声明:

Last_SQL_Error: Error 'Table 'some_db_4.some_table' doesn't exist' on query.

我认为这是因为它是用schema.table语法引用而不是use语句引用的,但有没有办法阻止这种情况发生?我是否正确地说,如果我执行以下操作,通常会这样做:

USE some_db_2;
UPDATE some_table SET some_column = 1 WHERE some_column = 0;
USE some_db_4;
UPDATE some_table SET some_column = 2 WHERE some_column = 1;

然后只有前两行出现在binlog中?鉴于:

UPDATE some_db_2.some_table SET some_column = 1 WHERE some_column = 0;
UPDATE some_db_2.some_table SET some_column = 2 WHERE some_column = 1;

两者都出现在binlog中?有可能阻止这个吗?

1 个答案:

答案 0 :(得分:2)

复制过滤的工作原理是在运行查询时过滤任何默认数据库 - 而不是受查询影响的数据库。

因此,如果使用合格的表名,在some_db_4中更改数据,而当前的默认数据库不是该数据库,则会遇到麻烦。

如果你使用跨数据库DML,就像从some_db_4中的一个SELECT中删除some_db_3中的表一样,存在类似的问题,而且在slave中不存在。

因此,您的问题的答案是肯定的,如果您在默认数据库是受该语句影响的数据库时小心在主执行DML,则可以避免此错误。