问题描述
我有两个表,我们在 Microsoft sql Server 中将其称为 tbl_parent
和 tbl_child
,并尝试将这些表的数据传输到 AWS aurora Postgresql。
此处 tbl_child
在 tbl_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 步骤可能:
- 在目标数据库中创建包含主键的基本表架构
- DMS 满载
- 创建 FK/RIs/index 和其他数据库对象
- DMS 疾控中心