我目前有一个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)。
有人可以告诉我,我是否采用了正确的方法?
即使在此之后,我仍然看到重复的密钥错误?有什么方法可以遵循,以避免这种重复的键错误。或者是否有任何机制可以进行原始数据复制?
非常感谢您的回复。
答案 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,......
请记住,如果A和B都插入可能重复且不是自动增量的键(即由代码生成的主键),slave_skip_errors = all和自定义自动增量都不会帮助您保持数据一致。 / p>
答案 1 :(得分:1)
在此附加我的程序
在A(主服务器)上:
--master-data
在B:
--skip-slave-start
选项重新安装并重新启动mysqld。--skip-slave-start
选项的情况下重启mysql。在A:
我同意auto_increment_increment
选项。我的两台服务器都是这样设置的。