所有数据库的MySQL Master-Master复制。怎么样?


16

背景知识:在这份出色的指南之后,我在Master-Master基于行的复制(RBR)中设置了两个MySQL 5.1服务器。我希望复制所有数据库,并将定期添加新数据库。

目标:通过将数据库添加到其中一台服务器,我希望能够将新数据库添加到复制中。 无需停止两个从站,也无需更改配置文件,重新启动MySQL服务器,然后再次启动从站。

:从我读过,我我可以通过简单的漏报任何一个做到这一点binlog-do-dbbinlog-ignore-dbreplicate-do-db,并replicate-ignore-db在每个服务器的配置设置,但我不能肯定。MySQL的有关如何评估数据库级和级复制选项的文档使我认为可能根本无法实现这一目标。

/etc/mysql/my.cnf文件的相关部分复制如下。我在正确的轨道上吗?我想要的甚至有可能吗?

硕士1

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

硕士2

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

1
在您要写入数据的计算机上创建数据库。
马丁

你的完整配置是什么?我在下面尝试这些答案,但没有用:-(
zx1986

Answers:


17

这是我为两位大师所做的

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin

您是否可以将数据库添加到任一主数据库,并使其自动复制到另一个数据库?
Andrew Ensley

是的,他们做到了。.我只是设置要忽略的地方
迈克

1
两个问题:我只需要确保我们都说相同的话。#1您是否可以将数据库添加到两个主数据库之一中,并自动在另一个数据库中创建数据库,然后复制插入新数据库中的所有数据而无需更改配置或重新启动服务器?#2您是否正在使用基于语句或基于行的复制?我需要对所有复制的数据库进行所有更改;即使是那些事先没有“ use”语句的文件。这些设置是否可以与基于行的复制一起使用?
Andrew Ensley

3
是是是是是:)
迈克

1
好的,我昨晚使用这些设置来设置服务器。我跳过了log-slave-updates设置,因为我认为不需要它。一切正常。我可以添加和删除数据库,并且更改已复制。谢谢!获得赏金。
Andrew Ensley

4

关于制作数据库,仍然存在关于将CREATE DATABASE与基于行的复制一起使用的错误报告。

此报告已关闭,但该错误再次出现在MySQL 5.1.47中。
此报告基于MySQL Cluster(NDB存储引擎)。
此报告基于仍然复制的wild-wild-ignore-table。

基于行的复制会导致二进制日志以非凡的速度增长,这可能会增加网络流量,仅将二进制日志数据传送到从属服务器的中继日志即可。

@Mike说,他可以创建数据库并正常工作并进行复制。我一点都不怀疑。我是MySQL(eh Oracle)的小手笔,在实例化数据库后,还没有摆脱基于行的复制的所有麻烦。

如果仍要在二进制日志中基于行的条目,则可能要切换到row_format MIXED。在内部,二进制日志格式无论如何都倾向于在语句和固定语句之间浮动:(请参阅http://bugs.mysql.com/bug.php?id=40146)。使用基于行的混合和回避(http://bugs.mysql.com/bug.php?id=39701)可以关闭更多错误报告,但问题仍然间歇性地存在。

最后说明

为了您自己的理智,请恢复到基于语句的复制,从而使CREATE DATABASE(这是一个SQL语句)稳定且一致,以便随后针对创建的数据库执行SQL。实际上,最新的错误报告显示,最好使用基于语句的复制,而不管文档中关于数据库级和表级选项的说法如何。


感谢您提供的所有信息。我的基于语句的复制的唯一问题是,除非数据库是当前使用的数据库,否则指定数据库的更改(即“ INSERT INTO db1.table1(col1)VALUES('hi');”)将不起作用。我想现在是时候切换到基于语句的复制并清理一些代码了……
Andrew Ensley,

事实证明,修复必要的代码并不难。我现在正在使用基于语句的复制。谢谢你的建议。
Andrew Ensley

0

嗯...您还必须找出一种方法来处理/区分自动递增的键和字段。这看起来很有趣。.http: //mysql-mmm.org/


这是在我的配置文件中的auto-increment-incrementauto-increment-offset设置中处理的。:看到这个页面dev.mysql.com/doc/refman/5.1/en/...
安德鲁Ensley先生

我想你误会了。@Andrew在谈论添加新数据库,而不是添加新数据库服务器。如果@Andrew正在引入新的数据库服务器,则在3个或更多DB服务器之间重新分配数据时,可能会发生键冲突,您的答案将解决该冲突。+1是您的努力,但请仔细阅读所有问题。我也被烧死了。
RolandoMySQLDBA 2011年

@all:糟糕,抱歉。我可以发誓我读完整了,但是一定不要
略读

-1

cmiiw我认为您应该能够在master1和master2上创建数据库,而无需更改conf或停止从属服务器,但是要确保master-master复制正在运行。因为您没有定义需要复制的数据库,所以如果您不在my.cnf上定义它,则意味着所有数据库都将被复制。


这正是我在这里要问的。到目前为止,我无法找到确切的答案。
安德鲁·恩斯利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.