我只配置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
谢谢你,快乐的圣诞节!
答案 0 :(得分:1)
无论您是否选择了RBR,都使用基于语句的复制始终记录 。因此,执行CREATE TABLE
语句时,默认(当前)数据库非常重要。
CREATE TABLE和ALTER TABLE等DDL语句始终作为语句记录,而不考虑有效的日志记录格式,因此以下基于语句的--binlog-do-db规则始终适用于确定是否声明已记录。
...只有那些语句被写入二进制日志,其中默认数据库(即USE选择的数据库)是db_name。
这表明你所观察到的行为是可以预期的,虽然它有点奇怪。
如果可能,我建议您USE
执行不希望在应用程序中复制的DDL之前的未复制数据库(例如mysql
)。