加载顺序和并行加载是否在 AWS DMS 中结合使用?

问题描述

我有两个表,我们在 Microsoft sql Server 中将其称为 tbl_parenttbl_child,并尝试将这些表的数据传输到 AWS aurora Postgresql

此处 tbl_childtbl_parent 上有一个外键引用,因此为了避免在完全加载期间出现 FK 问题,我提到 tbl_parent 的加载顺序高于表 tbl_child . aws documentation 中也提出了同样的建议。

因此,使用该加载顺序设置,我希望只有在 tbl_child 中完成插入后,数据才会插入到 tbl_parent 中。

我还想对子表进行并行加载,因此我指定了表设置规则来执行 aws documentation 中建议的并行加载

出于某种原因,我看到 tbl_child 中的数据甚至在 tbl_parent 加载完成之前就已插入,并且出现如下外键问题...

2021-07-14T18:53:43 [TARGET_LOAD]W:加载命令输出:psql: /usr/lib64/libcom_err.so.2:没有可用的版本信息(需要 通过 /rdsdbbin/awsdms/lib/libgssapi_krb5.so.2) psql: /usr/lib64/libcom_err.so.2:没有可用的版本信息(需要 by /rdsdbbin/awsdms/lib/libkrb5.so.3) 错误:插入或更新 表“tbl_child”违反外键约束 “tbl_child_tbl_parent_fkey”详细信息:密钥 (parent_id)=(1468137) 不是 存在于表“tbl_parent”中。 (csv_target.c:1018)

如果有帮助,请在下面找到映射规则 json

{
    "rules": [
        {
            "rule-type": "selection","rule-id": "101","rule-name": "101","object-locator": {
                "schema-name": "dbo","table-name": "tbl_parent"
            },"rule-action": "include","filters": [],"load-order": 2
        },{
            "rule-type": "selection","rule-id": "102","rule-name": "102","table-name": "tbl_child"
            },"load-order": 1
        },{
            "rule-type": "table-settings","rule-id": "131","rule-name": "Parallel_Range_Child","parallel-load": {
                "type": "ranges","columns": [
                    "child_id"
                ],"boundaries": [
                    [
                        "100"
                    ],[
                        "200"
                    ],[
                        "300"
                    ]
                ]
            }
        }
    ]
}

解决方法

如果要严格控制加载顺序,比如先完成一张表,再完成另一张表,则必须设置maxFullloadsubtasks=1。

实际上,为了避免此类问题,一种方法是禁用目标数据库中的 FK/RI 检查,此类选项在 SQL Server/MySQL/Oracle 中是 a/v,但在 PgSQL 中似乎不是 a/v。无论如何,您使用 DMS 的完整 + CDC 步骤可能:

  1. 在目标数据库中创建包含主键的基本表架构
  2. DMS 满载
  3. 创建 FK/RIs/index 和其他数据库对象
  4. DMS 疾控中心