将多个数据库复制到单个数据库并反过来

时间:2017-11-04 10:47:31

标签: mysql replication

这是我的Master-Master复制方案

-------------------
| Master/Slave 1  |
| Database = MainDB |
-------------------
/\
|
|
|
\/
-------------------
| Master/Slave 2  |
| Database = DB1  |
| Database = DB2  |
| Database = DB3  |
-------------------

这是我的Master / Slave1配置:

[mysqld]
binlog_format                   = MIXED
user                            = mysql
port                            = 3306
socket                          = /tmp/mysql.sock
#bind-address                    = 127.0.0.1
basedir                         = /usr/local
datadir                         = /var/db/mysql
tmpdir                          = /var/db/mysql_tmpdir
slave-load-tmpdir               = /var/db/mysql_tmpdir
secure-file-priv                = /var/db/mysql_secure
log-bin                         = MainDB.log
replicate-do-db                 = MainDB
replicate-rewrite-db            = "DB1->MainDB"
replicate-rewrite-db            = "DB2->MainDB"
replicate-rewrite-db            = "DB3->MainDB"
replicate-rewrite-db            = "DB4->MainDB"
log-output                      = TABLE
master-info-repository          = TABLE
relay-log-info-repository       = TABLE
relay-log-recovery              = 1
slow-query-log                  = 1
server-id                       = 1

和我的Master / Slave2配置:

[mysqld]
binlog_format                   = mixed
user                            = mysql
port                            = 3306
socket                          = /tmp/mysql.sock
#bind-address                    = 127.0.0.1
basedir                         = /usr/local
datadir                         = /var/db/mysql
tmpdir                          = /var/db/mysql_tmpdir
slave-load-tmpdir               = /var/db/mysql_tmpdir
secure-file-priv                = /var/db/mysql_secure
log-bin                         = mysql-bin
log-output                      = TABLE
master-info-repository          = TABLE
relay-log-info-repository       = TABLE
relay-log-recovery              = 1
slow-query-log                  = 1
server-id                       = 2
log_bin                         = cloud.log
binlog-do-db                    = DB1
binlog-do-db                    = DB2
binlog-do-db                    = DB3
binlog-do-db                    = DB4

使用这种配置,我可以从Master / slave2复制到Master / slave1,但它不能相反地复制。 云如何改变my.cnf以便将它们复制在一起?

2 个答案:

答案 0 :(得分:0)

  

(1)如果主服务器没有将语句写入其二进制日志,   该声明未被复制。如果服务器记录了该语句,   该语句被发送给所有从站,每个从站确定是否   执行它或忽略它。

Master / Slave1 Master / Slave2 接收所有 DB%的binlog,这样他就可以处理将每个DB重写为<强> MainDB 即可。 (使用这个replicate-rewrite-db即使这个选项对我来说也有点危险,你必须要有点儿,否则它会破坏看到option_mysqld_replicate-rewrite-db)。

首先,在master master中我认为你应该启用登录slave log_slave_updates的选项,这样其他slave“master”就可以将语句存储在二进制日志(1)中。检查这一点以及how Servers Evaluate Replication Filtering Rules

另一方面, Master / Slave2 会收到一个binglog,其中包含一个数据库 MainDB ,并且没有任何内容可以帮助您参与另一个数据库。或者将所有内容重写为一个。

  

在主服务器上,您可以控制要记录更改的数据库   使用--binlog-do-db--binlog-ignore-db选项进行控制   二进制日志。

所以你必须在 Master / Slave1 中添加此选项,告诉他记录 MainDB 的更改,然后在 Master / Slave2 您指定要在其上重写的数据库或要在哪个数据库中复制的表

答案 1 :(得分:0)

是的,我们知道它应该与master / slave2中的某个数据库一起复制,但是我们想要回到那个已经复制到MainDB的特定数据库。