DM中自增主键冲突处理具体方法

您好,由于我们的源库属于分库分表,其中有几张表存在自增主键的情况。

https://pingcap.com/docs-cn/tidb-data-migration/stable/shard-merge-best-practices/#去掉自增主键的主键属性

按照以上《自增主键处理》文档,在下游数据库中把那几张表的主键改为索引,但在重新执行同步任务的时候还会继续报错:
“errorMsg”: “instance mysql-replica-06 table hdb_broker_0.client_building_visited of sharding hdb_broker.client_building_visited have auto-increment key, would conflict with each other to cause data corruption”,
“instruction”: “please handle it by yourself, read document https://pingcap.com/docs-cn/dev/reference/tools/data-migration/usage-scenarios/best-practice-dm-shard/#自增主键冲突处理 for more detail (only have Chinese document now, will translate to English later)”

基于以上情况,想确认下具体需要如何操作才会让同步任务跑起来?谢谢。

你好,

可以上传下上游的表 hdb_broker_0 . client_building_visited 和 下游的表 hdb_broker . client_building_visited 的表结构,

这边对分库分表柯合并的处理基于,下游表去掉 primary key 并添加为普通索引,下游表中存在 unique key 保证数据一致性。看下自己是否满足此条件

对表client_baseinfo来说明:
上游表结构

下游表结构:

本次按照文档中的方法,创建了联合主键,但是执行start-task后,如下:

请帮忙再看看……

联合主键不会有 auto increment 属性,去掉试下

已经重新更新下游表结构,但是执行还是报错

你好

确定下上游分表在向下游汇总表插入数据时,数据是否满足联合主键要求。是否有数据重复问题

目前不好排查这个表对应字段是否有重复的问题。
加入联合主键字段存在重复数据,而且表中又没有 UNIQUE KEY的情况,是否还有办法处理这类问题?

明确下当前的情况
上游分表表结构中使用 r_build_id 作为自增主键,下游汇总表使用 r_build_id 和 client_rb_id 作为联合主键,并且不能保证联合主键的唯一性,那将不能继续复制。

目前建议确认下是否有其他的字段可以作为联合主键的列,除了 client_rb_id 之外的。

今天下午从业务方确定表中id字段值是唯一的,我们在下游库重新创建了一个新表:如下

但启动的时候还是报错了

上下游表结构均提供一下。
使用 show create table 返回文本结果

上游:

CREATE TABLE `client_baseinfo` (
  `id` varchar(50) DEFAULT NULL,
  `client_id` varchar(50) DEFAULT NULL COMMENT 'client.id',
  `age` varchar(4) DEFAULT NULL COMMENT '年龄',
  `gender` varchar(4) DEFAULT NULL COMMENT '性别【1:男 2:女】',
  `buy_objective` int(11) DEFAULT NULL COMMENT '购房目的',
  `has_property` int(11) DEFAULT NULL COMMENT '名下房产(套)',
  `is_limited` int(11) DEFAULT NULL COMMENT '是否限购【1:是 2:否】',
  `live_city` varchar(50) DEFAULT NULL COMMENT '现居城市',
  `live_district` varchar(50) DEFAULT NULL COMMENT '现居区域',
  `work_city` varchar(50) DEFAULT NULL COMMENT '工作城市',
  `work_district` varchar(50) DEFAULT NULL COMMENT '工作区域',
  `is_married` int(11) DEFAULT NULL COMMENT '是否结婚【1:是 2:否】',
  `fm_name` varchar(100) DEFAULT NULL COMMENT '家属姓名',
  `fm_phone` varchar(100) DEFAULT NULL COMMENT '家属电话',
  `is_decider` int(11) DEFAULT NULL COMMENT '是否决策人【1:是 2:否】',
  `decider` varchar(100) DEFAULT NULL COMMENT '决策人姓名',
  `relation` varchar(100) DEFAULT NULL COMMENT '关系',
  `decider_phone` varchar(100) DEFAULT NULL COMMENT '决策人电话',
  `remark` varchar(1024) DEFAULT NULL,
  `intention_price` varchar(10) DEFAULT NULL COMMENT '意向总价',
  `intention_area` varchar(10) DEFAULT NULL COMMENT '意向面积',
  `r_build_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `client_rb_id` bigint(20) NOT NULL,
  `sync_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '同步数据时间',
  PRIMARY KEY (`r_build_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1792682 DEFAULT CHARSET=utf8mb4 COMMENT='客户详细信息表'

下游:
| client_baseinfo | CREATE TABLE `client_baseinfo` (
  `id` varchar(50) DEFAULT NULL,
  `client_id` varchar(50) DEFAULT NULL COMMENT 'client.id',
  `age` varchar(4) DEFAULT NULL COMMENT '年龄',
  `gender` varchar(4) DEFAULT NULL COMMENT '性别【1:男 2:女】',
  `buy_objective` int(11) DEFAULT NULL COMMENT '购房目的',
  `has_property` int(11) DEFAULT NULL COMMENT '名下房产(套)',
  `is_limited` int(11) DEFAULT NULL COMMENT '是否限购【1:是 2:否】',
  `live_city` varchar(50) DEFAULT NULL COMMENT '现居城市',
  `live_district` varchar(50) DEFAULT NULL COMMENT '现居区域',
  `work_city` varchar(50) DEFAULT NULL COMMENT '工作城市',
  `work_district` varchar(50) DEFAULT NULL COMMENT '工作区域',
  `is_married` int(11) DEFAULT NULL COMMENT '是否结婚【1:是 2:否】',
  `fm_name` varchar(100) DEFAULT NULL COMMENT '家属姓名',
  `fm_phone` varchar(100) DEFAULT NULL COMMENT '家属电话',
  `is_decider` int(11) DEFAULT NULL COMMENT '是否决策人【1:是 2:否】',
  `decider` varchar(100) DEFAULT NULL COMMENT '决策人姓名',
  `relation` varchar(100) DEFAULT NULL COMMENT '关系',
  `decider_phone` varchar(100) DEFAULT NULL COMMENT '决策人电话',
  `remark` varchar(1024) DEFAULT NULL,
  `intention_price` varchar(10) DEFAULT NULL COMMENT '意向总价',
  `intention_area` varchar(10) DEFAULT NULL COMMENT '意向面积',
  `r_build_id` bigint(20) NOT NULL,
  `client_rb_id` bigint(20) NOT NULL,
  `sync_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '同步数据时间',
  KEY `r_build_id` (`r_build_id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='客户详细信息表' 

上游 id 字段 default null 如何保证的有值且唯一呢?查一下上游 id 字段是否有 is null 和 ‘’ 的值。如果没有那此值又是什么意思呢。‘’

通常来讲,id 应为 not null primary key auto_increment、r_build_id 为 unique key,现况是颠倒了,所以需要确认 id 的值。

刚刚一起全量导出id字段进行判断,该字段并没有空值,也没有相同的值,理论上同步应该是可行的
wc -l id.txt
57331270 id.txt

通过以下方法确认没有相同的id。
awk ‘{s[$1]++}END{for (x in s) if(s[x] >1 )print x"|"s[x]}’ id.txt

同时也确定了没有空行存在。

上游 DB:hdb_broker_0/1/2/3/4 ... /27 中的 client_baseinfo id 列都没有重复的是吗?

是的,所以才想用这个字段作为UNIQUE KEY

ok,请问在 task 文件中是否已经添加该参数?

ignore-checking-items: ["auto_increment_ID"]

之前没有留意到文档中还存在这个跳过的动作,加入此参数后,已经解决了这个问题,非常感谢!!
image

ok,我们也看下当前文档是否需要调整下,

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。