问题描述
我们有基于 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
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 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_increment
和 auto_increment_offset
,但这对我们来说不是最好的方法,因为我们有 10 个源(主)数据库,它们的数量会增加。
有什么办法可以让 MysqL 引擎在目标(从)数据库上生成当前的 AUTO_INCREMENT 值?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)