我正在使用master-master复制进行一些测试,我遇到了一些奇怪的问题,我将尝试描述我遵循的程序,以便有人可以重现这个问题。
我在2个虚拟机和配置文件中为每个虚拟机设置了复制:
-- Master1 --
auto_increment_increment = 2
auto_increment_offset = 1
-- Master2 --
auto_increment_increment = 2
auto_increment_offset = 2
这些设置应导致自动增量列的算术级数:
- Master1: 1,3,5,7,9,11,13 ...
- Master2: 2,4,6,8,10,12,14 ...
Master1获得奇数,Master2获得偶数。 然后我创建一个测试数据库,然后添加一个包含以下定义的表:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` varchar(50) DEFAULT NULL,
`d1` date DEFAULT '1970-01-01',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
当然,数据库是在两台服务器上创建的。之后,我执行
START SLAVE;
两台服务器上的以便复制开始。 为了生成数据,我使用以下过程:
必须插入单个记录才能使进程取消
INSERT INTO t1(c1,d1)SELECT LPAD('',50,MD5(RAND())),DATE_ADD(CURDATE(),INTERVAL FLOOR(RAND()* 365)DAY);
< / LI>然后使用同一个表中的INSERT - SELECT,它将以2 n 的速率开始插入, n 是您执行查询的时间:
INSERT INTO t1(c1,d1)SELECT LPAD('',50,MD5(RAND())),DATE_ADD(CURDATE(),INTERVAL FLOOR(RAND()* 365)DAY)FROM t1;
提示:我发现此处描述的此方法也非常便于为表生成随机数据。
因此,当我在两台服务器上同时开始执行这些查询时,这总是会导致自动增量列的复制重复键错误。 如果有人有任何想法,我会很感激!
PS:当然,这种查询很少发生在生产应用程序中,但我相信它仍然证明了这一点。