我有数据记录器软件,可以将数据写入主数据库。只有两张桌子。如果该数据库被锁定或停止超过1分钟,我将释放一些应该存储的数据。
主数据库通过蜂窝连接复制到另一台计算机,有时不稳定。副本用于查看Grafana上的数据。它可以被阻止很长一段时间,什么坏事都不会发生。
我第二次体验了重复密钥问题,我正在寻找有效的方法来修复它。上一次,我花了一些时间才找到了修复它的方法,并且主数据库被锁定了几分钟,因为我无法正确地完成它,并且做了几次尝试。
我想我可以暂时锁定主数据库,执行mysql转储,检查当前日志位置,解锁它并开始重建我的从数据库。
我不知道该如何从主转储文件中重建奴隶。是否应该截断或删除从从属服务器中的表?用户和权限呢?
能请人一步一步地解释一下我该怎么做?
下面是来自副本的create (从主转储创建的,因此DDL是相同的):
CREATE TABLE `bits` (
`Id` bigint NOT NULL AUTO_INCREMENT,
`Datetime` datetime NOT NULL,
`B01` tinyint(1) NOT NULL,
`B02` tinyint(1) NOT NULL,
`B03` tinyint(1) NOT NULL,
`B04` tinyint(1) NOT NULL,
`B05` tinyint(1) NOT NULL,
`B06` tinyint(1) NOT NULL,
`B07` tinyint(1) NOT NULL,
`B08` tinyint(1) NOT NULL,
`B09` tinyint(1) NOT NULL,
`B10` tinyint(1) NOT NULL,
`B11` tinyint(1) NOT NULL,
`B12` tinyint(1) NOT NULL,
`B13` tinyint(1) NOT NULL,
`B14` tinyint(1) NOT NULL,
`B15` tinyint(1) NOT NULL,
`B16` tinyint(1) NOT NULL,
`B17` tinyint(1) NOT NULL,
`B18` tinyint(1) NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Id` (`Id`),
KEY `idx_dt` (`Datetime`)
) ENGINE=InnoDB AUTO_INCREMENT=92553 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `words` (
`Id` bigint NOT NULL AUTO_INCREMENT,
`Datetime` datetime NOT NULL,
`W01` int NOT NULL,
`W02` int NOT NULL,
`W03` int NOT NULL,
`W04` int NOT NULL,
`W05` int NOT NULL,
`W06` int NOT NULL,
`W07` int NOT NULL,
`W08` int NOT NULL,
`W09` int NOT NULL,
`W10` int NOT NULL,
`W11` int NOT NULL,
`W12` int NOT NULL,
`W13` int NOT NULL,
`W14` int NOT NULL,
`W15` int NOT NULL,
`W16` int NOT NULL,
`W17` int NOT NULL,
`W18` int NOT NULL,
`W19` int NOT NULL,
`W20` int NOT NULL,
`W21` int NOT NULL,
`W22` int NOT NULL,
`W23` int NOT NULL,
`W24` int NOT NULL,
`W25` int NOT NULL,
`W26` int NOT NULL,
`W27` int NOT NULL,
`W28` int NOT NULL,
`W29` int NOT NULL,
`W30` int NOT NULL,
`W31` int NOT NULL,
`W32` int NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Id` (`Id`),
KEY `idx_dt` (`Datetime`)
) ENGINE=InnoDB AUTO_INCREMENT=92553 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
表中只有一个主键(bigint )。
除了来自主机的复制之外,副本上没有INSERT
操作源。
这是我复制的原木尾巴:
2023-02-14T09:48:00.884440Z 161 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error reconnecting to master 'replica@10.15.0.12:3306' - retry-time: 60 retries: 1 message: Can't connect to MySQL server on '10.15.0.12:3306' (110), Error_code: MY-002003
2023-02-21T13:13:38.933590Z 161 [ERROR] [MY-010584] [Repl] Slave I/O for channel '': error reconnecting to master 'replica@10.15.0.12:3306' - retry-time: 60 retries: 1 message: Can't connect to MySQL server on '10.15.0.12:3306' (110), Error_code: MY-002003
2023-02-27T01:05:20.054098Z 7 [ERROR] [MY-010584] [Repl] Slave SQL for channel '': Worker 1 failed executing transaction 'ANONYMOUS' at master log NBMS-DELL-bin.000009, end_log_pos 8885352; Could not execute Write_rows event on table nbmslogger.bits; Duplicate entry '91393' for key 'bits.PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 8885352, Error_code: MY-001062
2023-02-27T11:58:07.334955Z 37 [ERROR] [MY-010584] [Repl] Slave SQL for channel '': Worker 1 failed executing transaction 'ANONYMOUS' at master log NBMS-DELL-bin.000009, end_log_pos 8885352; Could not execute Write_rows event on table nbmslogger.bits; Duplicate entry '91393' for key 'bits.PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 8885352, Error_code: MY-001062
当我在DBeaver中打开该表时,我看到有更多的记录是从主服务器复制的,但是由于某种原因,复制可能会再次尝试插入它们。
发布于 2023-02-27 22:02:08
没有共享相同AUTO_INCREMENT
id的两个表。相反,插入到一个带有AUTO_INCREMENT
的表中,为另一个没有AUTO_INCREMENT
的表从该表获取id (例如,使用LAST_INSERT_ID()
)。
更好的方法是将这两个表合并成一个表。
另外:
PRIMARY KEY(id),
UNIQUE KEY (id) -- This is redundant, DROP it.
发布于 2023-02-27 21:02:43
好吧,我做了个快速修复。
在我的副本上,我刚刚从我的>=91393表中删除了bits
记录。
然后我停止了复制(stop replica;
),并再次启动它(start replica;
)。在mysql中出现这个新错误之后,日志就出现了。它是关于第二个words
表中的重复键。我又删除了行,就像在第一个表中一样。
但它发生的原因仍然是个谜。
https://dba.stackexchange.com/questions/324091
复制相似问题