MySql Replication与实时数据有关

时间:2011-08-23 10:32:01

标签: mysql

我目前有一个master-master(假设A和B,其中A是主要的主)复制设置与mysql 5.1.45。数据超过15 GB。每当我看到重复键错误时,我习惯将sql_slave_skip_counter设置为1并重新启动从站。几个月来,这已经完成,现在A和B存在很多差异,并且由于数据量很大,我也无法解决不一致问题。

这让我有了重新创建服务器B的选项。我从A转储并将其复制到B. A是生产,我无法承受停机时间。 A的二进制日志文件大约是bin.001115,其中在转储之后,二进制日志是bin.000012。

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

有人可以告诉我,我是否采用了正确的方法?

即使在此之后,我仍然看到重复的密钥错误?有什么方法可以遵循,以避免这种重复的键错误。或者是否有任何机制可以进行原始数据复制?

非常感谢您的回复。

2 个答案:

答案 0 :(得分:4)

对于日志位置和服务器B与A同步:遗憾的是,在服务器运行时进行SQL转储最终不会给你一个干净的快照,因为有些表可能在添加后写入了在转储完成之前转储到转储。您已经声明无法完全锁定或停止服务器复制数据文件,因此您可以尝试以下操作:

1)停止复制/登录B

2)获取A

上的日志位置

3)进行SQL转储

4)从转储中恢复B

5)使用配置选项slave_skip_errors = all启动B(参见:http://dev.mysql.com/doc/refman/5.1/en/replication-options-slave.html#option_mysqld_slave-skip-errors

6)在2)

中获得的位置开始B的复制

7)让B赶上A

8)阅读备注:以后防止出现重复的密钥错误,如果它适用于您,则更改设置

9)重启B而没有slave_skip_errors

10)开始B记录到A

为了避免将来出现重复的密钥错误:

获取您拥有的服务器数量(在这种情况下为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

请记住,如果A和B都插入可能重复且不是自动增量的键(即由代码生成的主键),slave_skip_errors = all和自定义自动增量都不会帮助您保持数据一致。 / p>

答案 1 :(得分:1)

在此附加我的程序

在A(主服务器)上:

  1. 停止奴隶;
  2. 重置主人; (我不需要重置,但这将有助于重新开始,就好像新的一样可以消除混淆)
  3. 重置奴隶;
  4. 使用--master-data
  5. 进行转储

    在B:

    1. 使用--skip-slave-start选项重新安装并重新启动mysqld。
    2. 创建复制用户名和密码
    3. 从转储中恢复
    4. 重置主人; (不要重置slave。如果我们重置slave,来自B的数据将不会复制到A)
    5. 启动奴隶(这将同步A的差异)
    6. 在没有--skip-slave-start选项的情况下重启mysql。
    7. 在A:

      1. 启动奴隶;
      2. 我同意auto_increment_increment选项。我的两台服务器都是这样设置的。