DM做数据迁移上游数据表必须要设置主键吗?

DM做数据迁移上游数据表必须要设置主键吗?已设置如下配置
session:
sql_require_primary_key: OFF
任务开始会有如下报错:

{
    "result": false,
    "msg": "[code=46014:class=scheduler:scope=internal:level=medium], Message: subtasks with name mysql-syc-task for sources [dm-source-1] already exist, Workaround: Please use `query-status` command to see tasks.",
    "sources": [
    ],
    "checkResult": "fail to check synchronization configuration with type: no errors but some warnings
        detail: {
                "results": [
                        {
                                "id": 12,
                                "name": "table structure compatibility check",
                                "desc": "check compatibility of table structure",
                                "state": "warn",
                                "errors": [
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_employee_org_rel` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_employee_role_rel` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_employee_org_position_rel` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_role_resource_rel` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_dict` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_operation_log_ext` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_position_role_rel` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_employee` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_parameter` primary/unique key does not exist"
                                        },
                                        {
                                                "severity": "warn",
                                                "short_error": "table `badc_base_1`.`base_role` primary/unique key does not exist"
                                        }
                                ],
                                "instruction": "You need to set primary/unique keys for the table. Otherwise replication efficiency might become very low and exactly-once replication cannot be guaranteed."
                        }
                ],
                "summary": {
                        "passed": true,
                        "total": 13,
                        "successful": 12,
                        "failed": 0,
                        "warning": 1
                }
        }"
}

是的呢

没有主键的表是不就同步不了了

目前 DM 仅保证最终一致性,尚未支持“精确一次处理”及“保持事务原有顺序同步”。

同步会有性能问题,并且无法保证上下游的一致性

1 个赞

必须有主键,而且什么样的情况表不要主键呢?根本不合理。

只要是表,都建议有主键。

建议主键了

你这个最主要的错误是任务重名了。没有主键只会导致下游 TiDB 上的数据可能出现重复,但是不会导致任务启动不了

数据迁移多数工具都要求所有表有主键

文档中有写,DM必须设置为OFF

源数据表不一定必须有主键,但拥有主键可以显著简化数据迁移过程,提高数据一致性和迁移效率。因此,建议在可能的情况下,为源数据表添加主键或唯一键。

来回忆一下DM运作机制:
Data Migration 中的 DML 同步机制

请教一下,如不设置主键或唯一键,下游库 怎么确保数据更改同步准确?

DM 使用限制未提必需索引

以前看视频教程的时候,好像是推荐有主键和唯一约束,新版本什么情况不清楚了;
现在建表,基本上都会有主键,没有业务上的主键,建一个逻辑主键也行

应该还是需要主键吧,毕竟是逻辑抽取数据。类似ogg工具,没有主键也能同步,但是都不保证数据一致性,,,

最佳实验 建议索引。
https://docs.pingcap.com/zh/tidb/stable/dm-best-practices/

1 个赞

是的,必须有主键,Tidb转化KV键值对时,键是表ID+主键组成的!

dm会并行执行dml,以达到一个比较快的同步速度。

在这个并行执行的dml的过程中,怎么能保证同一条记录的执行顺序不会出错呢?
或者说怎么判断两条binlog是在更新同一条记录呢?
就是靠主键,拥有相同主键的记录,如果老的binlog没有被执行过,信的binlog就没法执行。这就保证了一条记录的最终一致性。

所以如果原表上没有主键,那么dm在执行dml的过程中是没有办法保证执行的结果正确的。

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