MySQL 多源复制错误 1062 - PRIMARY (AUTO_INCREMENT) 键的重复条目

问题描述

我们有基于 STATEMENT 的多源复制。两个源(replica06、replica07)和一个目标(replica08)。

[MysqLd@replica06]
datadir=/var/lib/MysqL6
socket=/var/lib/MysqL6/MysqL.sock
port=3311
log-error=/var/log/MysqL/replica06.log
server-id=101
binlog-format=STATEMENT

[MysqLd@replica07]
datadir=/var/lib/MysqL7
socket=/var/lib/MysqL7/MysqL.sock
port=3312
log-error=/var/log/MysqL/replica07.log
server-id=102
binlog-format=STATEMENT

[MysqLd@replica08]
datadir=/var/lib/MysqL8
socket=/var/lib/MysqL8/MysqL.sock
port=3313
log-error=/var/log/MysqL/replica08.log
server-id=199
binlog-format=STATEMENT

每个 MysqL 实例上有一个简单的表。

CREATE TABLE `dictionary` (
  `id` int NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

然后我们配置复制用户binlog位置、binlog文件,开始复制。从现在开始,一切都运行良好。

当我们在一个源(主)数据库上运行 INSERT 语句时:

INSERT INTO `replica_test`.`dictionary` (`name`) VALUES ('test');

一切正常 - 数据被复制到目标数据库id 被分配给每一行。此时我们在目标(从)数据库id = 1,name = "test" 中获得了一行。

但是当我们在另一个源(主)数据库上运行相同的命令时,我们得到了一个错误

Error 'Duplicate entry '1' for key 'dictionary.PRIMARY'' on query. Default database: ''. Query: 'INSERT INTO `replica_test`.`dictionary` (`name`) VALUES ('test_two')'

请注意,我们没有手动设置 id,假设 AUTO_INCREMENT 字段会自动生成。我确信,根据目标 db (2) 上的当前自动增量,目标 db (slave) 上的执行语句将生成 id。我们为什么以及如何获得目标数据库 id = 1(如在源数据库上,主数据库)?

我知道 auto_increment_incrementauto_increment_offset,但这对我们来说不是最好的方法,因为我们有 10 个源(主)数据库,它们的数量增加

有什么办法可以让 MysqL 引擎在目标(从)数据库生成当前的 AUTO_INCREMENT 值?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)