[FAQ] dm 如何使用重构后的表结构进行数据同步

【问题澄清】

  • 当 dm 在下游 tidb 中创建表结构时,该如何微调部分表结构信息来避免写入热点问题,譬如:
  • 上游 rds 中 id 是自增主键,下游 tidb 中改为唯一索引 ;并且通过增加 SHARD_ROW_ID_BITS 以及 PRE_SPLIT_REGIONS 来实现预打散的目的。
上游 rds 表结构
CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `age` bigint(20) NOT NULL,
  primary KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

期望下游 tidb 中的表结构为
CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL,
  `age` bigint(20) NOT NULL,
  unique KEY uk_id(`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 SHARD_ROW_ID_BITS=4 PRE_SPLIT_REGIONS=4;

【解决方案】

  • 去掉 id 中 primary key / auto-increment 属性,并添加 tidb 特有表/列属性 SHARD_ROW_ID_BITS=4 PRE_SPLIT_REGIONS=4 / unique key(id) ,并将修改后的表结构导入到 tidb 集群中。
  • 不需要对 mydumpers 和 loaders 部分进行特殊配置
  • >start-task tmp_task.yaml

【注意事项】

  • 修改表结构需要注意对比上下游表的字段类型,以免在 check-task 环节出现问题。
  • 目前可以对下游表结构进行无影响的结构变更譬如,pk 变为 uk,增加 SHARD_ROW_ID_BITS 和 PRE_SPLIT_REGIONS 属性,auto_random 属性。

【扩展】

  • 当前 loader 在导入表结构时,如果下游出现同表名将会忽略导入。

【经典案例】