我有点惊讶地看到一个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中?有可能阻止这个吗?
答案 0 :(得分:2)
复制过滤的工作原理是在运行查询时过滤任何默认数据库 - 而不是受查询影响的数据库。
因此,如果使用合格的表名,在some_db_4
中更改数据,而当前的默认数据库不是该数据库,则会遇到麻烦。
如果你使用跨数据库DML,就像从some_db_4中的一个SELECT中删除some_db_3中的表一样,存在类似的问题,而且在slave中不存在。
因此,您的问题的答案是肯定的,如果您在默认数据库是受该语句影响的数据库时小心在主上执行DML,则可以避免此错误。