首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当出现重复密钥问题时,如何修复MySQL复制?

当出现重复密钥问题时,如何修复MySQL复制?
EN

Database Administration用户
提问于 2023-02-27 12:21:37
回答 2查看 75关注 0票数 0

我有数据记录器软件,可以将数据写入主数据库。只有两张桌子。如果该数据库被锁定或停止超过1分钟,我将释放一些应该存储的数据。

主数据库通过蜂窝连接复制到另一台计算机,有时不稳定。副本用于查看Grafana上的数据。它可以被阻止很长一段时间,什么坏事都不会发生。

我第二次体验了重复密钥问题,我正在寻找有效的方法来修复它。上一次,我花了一些时间才找到了修复它的方法,并且主数据库被锁定了几分钟,因为我无法正确地完成它,并且做了几次尝试。

我想我可以暂时锁定主数据库,执行mysql转储,检查当前日志位置,解锁它并开始重建我的从数据库。

我不知道该如何从主转储文件中重建奴隶。是否应该截断或删除从从属服务器中的表?用户和权限呢?

能请人一步一步地解释一下我该怎么做?

下面是来自副本的create (从主转储创建的,因此DDL是相同的):

代码语言:javascript
运行
复制
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操作源。

这是我复制的原木尾巴:

代码语言:javascript
运行
复制
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中打开该表时,我看到有更多的记录是从主服务器复制的,但是由于某种原因,复制可能会再次尝试插入它们。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2023-02-27 22:02:08

没有共享相同AUTO_INCREMENT id的两个表。相反,插入到一个带有AUTO_INCREMENT的表中,为另一个没有AUTO_INCREMENT的表从该表获取id (例如,使用LAST_INSERT_ID())。

更好的方法是将这两个表合并成一个表。

另外:

代码语言:javascript
运行
复制
PRIMARY KEY(id),
UNIQUE KEY (id)  -- This is redundant, DROP it.
票数 1
EN

Database Administration用户

发布于 2023-02-27 21:02:43

好吧,我做了个快速修复。

在我的副本上,我刚刚从我的>=91393表中删除了bits记录。

然后我停止了复制(stop replica;),并再次启动它(start replica;)。在mysql中出现这个新错误之后,日志就出现了。它是关于第二个words表中的重复键。我又删除了行,就像在第一个表中一样。

但它发生的原因仍然是个谜。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/324091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档