我目前正在尝试使用 AWS DMS 将多个表从 MySQL 移动并捕获 (CDC) 到 PostgreSQL。 初始复制运行良好,但问题出在 CDC 期间的 PostgreSQL UUID 类型。 例如,假设我有这些源表 A (MySQL) 和目标表 B (PostgreSQL):
CREATE TABLE `A` ( -- in MySQL
user_id VARCHAR(36), -- UUID STRING like 550e8400-e29b-41d4-a716-446655440000
...
)
CREATE TABLE `B` ( -- in PostgreSQL
user_id UUID,
...
)
第一阶段(历史复制)成功,但持续复制 (CDC) 失败并将日志留在 PostgreSQL 的 awsdms_apply_exceptions 表中。 “awsdms_apply_exceptions”中的语句和错误如下所示:
STATEMENT
INSERT INTO "public"."B" (user_id, ...) VALUES ('550e8400-e29b-41d4-a716-446655440000', ...)
ERROR
RetCode: SQL_ERROR SqlState: 22P02 NativeError: 1 Message: ERROR: invalid input syntax for type uuid: "5 5 0 e 8 4 0 0 - e 2 9 b - 4 1 d 4 - a 7 1 6 - 4 4 6 6 5 5 4 4 0 0 0 0 ";
Error while executing the query
我已检查该语句是否有效,并且在 SQL 控制台上运行/执行该语句时,它运行时没有任何问题。 我认为这个问题与AWS DMS的数据类型转换有关,并尝试了数据类型,但没有成功。 (MySQL 上的 MySQL VARBINARY,DMS 上的数据类型更改为 STRING)
另外,我有一种感觉,这可能是由于源数据的编码所致,因为源数据在 user_id 之外的其他列中包含非字母数字字符(韩语、日语、中文等),因此 AWS DMS 添加了一个读取时在 user_id 中的每个字符后面添加“ ”字符?但我还没有找到 AWS DMS 内部如何工作以及解决这个问题的潜在方法。
所以,目前我唯一的选择是:
由于安全和维护问题,我对这两者都不满意。 如果有人遇到过同样的问题,可以分享一下你是如何解决这个问题的吗?
我遇到了同样的问题,这个答案是我能找到的唯一参考。所以既然我弄清楚了,我希望在这里分享它可能对未来遇到同样情况的读者有所帮助。
问题与数据类型有关。 DMS 使用自己的中间类型进行数据转换。完整列表可以在这里找到。
如果源列是 MySQL 中的
VARCHAR
,DMS 会将其解释为其内部数据类型 WSTRING
(source)。
在 PostgreSQL 端,
UUID
类型(source)没有显式映射。似乎尝试将 WSTRING
插入到 UUID
类型字段中是有问题的(出于我不知道的原因,遗憾的是没有源代码可供检查)。
但是,我们可以通过向 DMS 任务添加数据类型转换来轻松解决此问题。 文档有一个很好的例子。
表的 DMS 转换规则如下所示:
{
"rule-type": "transformation",
"rule-id": "123",
"rule-name": "a-userid-transform",
"rule-target": "column",
"object-locator": {
"schema-name": "test",
"table-name": "a",
"column-name": "user_id"
},
"rule-action": "change-data-type",
"data-type": {
"type": "string",
"length": "36",
"scale": ""
}
}
请注意,长度字段是强制性的。鉴于您的 UUID 格式当前包含破折号,我将其设置为 36。这对我们来说是相同的,所以它应该可以工作。对于不包含破折号的源,32 也可以。