2011-08-23 53 views
0

我目前有一个master-master(让我们说A和B,其中A是主要的主)复制设置与MySQL 5.1.45。数据超过15 GB。每当我看到重复的键错误,我曾经将sql_slave_skip_counter设置为1并重新启动slave。在过去的几个月中,这已经完成了,现在A和B之间存在很多差异,并且由于数据量很大,我无法修复不一致。带有实时数据的MySql复制问题

这给我留下了一个选项来重新创建我所做的服务器B.我把A转储并复制到B上.A是生产,我无法承受停机时间。 A的二进制日志文件在bin.001115左右,在转储之后,二进制日志为bin.000012。

经过这一步后,我对如何更改这两台服务器上的主日志位置感到困惑。我已经将主日志文件和位置设置在A(从B的show master状态)和主日志文件以及B的位置(从A的show master状态)。

有人可以告诉我,如果我遵循正确的方法吗?

即使在这之后,我仍然看到重复键错误?有什么方法可以遵循以避免重复的重要错误。还是有任何机制,以便我可以做一个原始数据复制?

非常感谢您的回复。

+0

有一件对我有帮助的事情是在LVM分区上运行我的主设备。当我想重新初始化我的复制服务器时,我只需执行一个'FLUSH TABLES WITH READ LOCK',停止mysql,拍摄快照并重新启动mysql - 在几秒钟内完成。然后,我可以在闲暇时从快照中复制文件。 –

+0

但是,我不能停止在主要主人:()的MySQL。 –

回答

1

追加这里我的程序

上(主服务器):

  1. 停止奴隶;
  2. reset master; (我不需要重置,但是这将有助于全新开始,因为这样可以消除混淆)
  3. reset slave;
  4. 拉屎与--master-data

在B:

  1. 重新安装并重启mysqld与--skip-slave-start选项。
  2. 创建复制的用户名和密码
  3. 从转储
  4. 复位主还原; (不要复位从机,如果我们复位从机,来自B的数据不会复制到A)
  5. 启动从机(这将同步来自A的差异)
  6. 重启mysql没有--skip-slave-start选项。

上的:

  1. 开始从属;

我同意auto_increment_increment选项。我的两台服务器都是这样设置的。

4

对于日志位置和同步服务器B与答:不幸的是做一个SQL转储,而服务器是活的最后不会给你一个干净的快照,因为一些表可能已被写入后,他们是在转储完成之前添加到转储。你已经指出,你不能做一个完整的锁或停止服务器复制数据文件,所以这里的东西,你可以尝试:

1)停止复制/登录基于B

2)获取日志上的一个

3的位置)使SQL转储

4)从转储还原乙

5)开始与乙配置选项slave_skip_errors =所有(参见:http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_slave-skip-errors

6)启动B的你在2得到的位置)

7)设B追赶复制到一个

8)阅读笔记回复:防止重复在未来的关键错误,更改设置,如果它的工作原理你

9)无slave_skip_errors重启乙

10)启动B的记录到

为了避免将来出现重复键错误:

带你有服务器的数量(在这种情况2) 设置每个服务器的auto_increment_increment = [该号码] 设置每个服务器的auto_increment_offset,从1开始并且对于每个服务器

实施例上升1:

A的配置

auto_increment_increment=2 
auto_increment_offset=1 

B的配置

auto_increment_increment=2 
auto_increment_offset=2 

A将产生自动增量ID的像1,3,5,7,... B就产生2,4,6,8,...

http://dev.mysql.com/doc/refman/5.1/en/replication-options-master.html#sysvar_auto_increment_increment#auto_increment_increment

请记住,无论是slave_skip_errors =如果A和B都插入可能被复制并且不是自动增量的密钥,所有或自定义自动增量都将帮助保持数据的一致性(即由您的代码生成的主键)。