MySQL基于行的复制(RBR) - 包含意外语句的日志文件

时间:2013-12-24 14:51:49

标签: mysql database-replication

我只配置2个mySQL服务器进行MASTER-MASTER复制。 我出于某种原因选择了RBR复制。

我在服务器上的配置 ONE

#replication
server-id=1
binlog_do_db = db1
binlog_ignore_db = db2
log-bin="C:/ProgramData/MySQL/my56"
auto_increment_increment = 2
auto_increment_offset = 1
binlog_format=ROW
replicate_do_db=db1

并在服务器上 TWO

#replication
server-id=2
binlog_do_db = db1
log-bin="C:/ProgramData/MySQL/my56"
auto_increment_increment = 2
auto_increment_offset = 2
binlog_format=ROW
replicate_do_db=db1

这样,复制就可以了。

例如,在服务器 ONE 上,如果我执行:

USE db1;
INSERT INTO db1.table1 values (foo,bar);

它适用于服务器TWO。

如果在服务器上 ONE ,我执行:

USE db1;
INSERT INTO second_db.table2 values (foo,bar);

插入不在服务器 TWO 上执行,这很好。

如果在服务器上 ONE ,我执行:

CREATE table db1.tableFoo(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

创建表未在服务器 TWO 上执行,这很好,因为我选择了基于行的复制,所以我必须在服务器 TWO上强制执行CREATE STATEMENT 。这就是我想要的。

现在,我的问题是:

如果在服务器上 ONE ,我执行:

USE db1;
CREATE table db1.tableFoo(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

CREATE TABLE在服务器 TWO 上执行, NOT 好!通常使用基于行的复制,不会复制CREATE ORDER。

最糟糕的是,如果在 USE db1; 之后如果在另一个数据库中创建一个表,则CREATE TABLE将在我的服务器上复制 TWO ,并且我的奴隶将在服务器 TWO 因为数据库不存在...

你知道吗?我不想要任何CREATE / ALTER / CREATE USER ...发送到我的复制即使我使用à USE db1;

我的工作基于mySQL文档,特别是这一篇:http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html

谢谢你,快乐的圣诞节!

1 个答案:

答案 0 :(得分:1)

无论您是否选择了RBR,都使用基于语句的复制始终记录 。因此,执行CREATE TABLE语句时,默认(当前)数据库非常重要

来自http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#option_mysqld_binlog-do-db

  

CREATE TABLE和ALTER TABLE等DDL语句始终作为语句记录,而不考虑有效的日志记录格式,因此以下基于语句的--binlog-do-db规则始终适用于确定是否声明已记录。

     

...只有那些语句被写入二进制日志,其中默认数据库(即USE选择的数据库)是db_name。

这表明你所观察到的行为是可以预期的,虽然它有点奇怪。

如果可能,我建议您USE执行不希望在应用程序中复制的DDL之前的未复制数据库(例如mysql)。