微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JSON AWS DMS Postgres类型的输入语法无效

如何解决JSON AWS DMS Postgres类型的输入语法无效

我正在运行一项任务,该任务将所有数据从Postgres 10.4迁移到RDS postgres 10.4。 无法迁移具有jsonb列的表。 发生错误后,整个表将被暂停。表仅包含449行。

我制定了以下错误策略,但整个表仍被暂停。 “ DataErrorPolicy”:“ IGnorE_RECORD”, “ DataTruncationErrorPolicy”:“ IGnorE_RECORD”, “ DataErrorEscalationPolicy”:“ SUSPEND_TABLE”, “ DataErrorEscalationCount”:1000,

我的期望是应该转移整个表,如果任何json错误,它可以忽略记录。 我不知道为什么会给这个错误“类型json无效的输入语法”,我已经检查了所有json并且所有json都是有效的。

更多调试后,此错误被视为TABLE错误,但是为什么呢?这就是为什么表由于TableErrorPolicy为'SUSPEND_TABLE'而被挂起的原因。 为什么将此错误视为表错误而不是记录错误

DMS不支持JSONB列,这就是为什么我们遇到以下错误

日志:-

2020-09-01T12:10:04 https://forums.aws.amazon.com/I: Next table to load 'public'.'TEMP_TABLE' ID = 1,order = 0 (tasktablesmanager.c:1817)
2020-09-01T12:10:04 https://forums.aws.amazon.com/I: Start loading table 'public'.'TEMP_TABLE' (Id = 1) by subtask 1. 
Start load timestamp 0005AE3F66381F0F (replicationtask_util.c:755)
2020-09-01T12:10:04 https://forums.aws.amazon.com/I: REPLICA IDENTITY information for table 'public'.'TEMP_TABLE': Query status='Success' Type='DEFAULT' 
Description='Old values of the Primary Key columns (if any) will be captured.' (postgres_endpoint_unload.c:191)
2020-09-01T12:10:04 https://forums.aws.amazon.com/I: Unload finished for table 'public'.'TEMP_TABLE' (Id = 1). 449 rows sent. (streamcomponent.c:3485)
2020-09-01T12:10:04 https://forums.aws.amazon.com/I: Table 'public'.'TEMP_TABLE' contains LOB columns,change working mode to default mode (odbc_endpoint_imp.c:4775)
2020-09-01T12:10:04 https://forums.aws.amazon.com/I: Table 'public'.'TEMP_TABLE' has Non-Optimized Full LOB Support (odbc_endpoint_imp.c:4788)
2020-09-01T12:10:04 https://forums.aws.amazon.com/I: Load finished for table 'public'.'TEMP_TABLE' (Id = 1). 449 rows received. 0 rows skipped.
Volume transferred 190376. (streamcomponent.c:3770)
2020-09-01T12:10:04 https://forums.aws.amazon.com/E: RetCode: sql_ERROR sqlState: 22P02 NativeError: 1 Message: ERROR: invalid input Syntax for type json; 
Error while executing the query https://forums.aws.amazon.com/ (ar_odbc_stmt.c:2648)
2020-09-01T12:10:04 https://forums.aws.amazon.com/W: Table 'public'.'TEMP_TABLE' (subtask 1 thread 1) is suspended (replicationtask.c:2471)

编辑-经过更多调试后,此错误已被视为TABLE错误,但为什么呢?

解决方法

JSONB列数据类型在目标数据库中必须为空。

注意-就我而言,将JSONB列设置为可空后,此错误消失了。

如AWS文档中所述-

在这种情况下,AWS DMS将JSONB数据视为是LOB列。在迁移的整个加载阶段,目标列必须为空。

https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.Prerequisites

https://aws.amazon.com/premiumsupport/knowledge-center/dms-error-null-value-column/

,

AWS DMS将PostgreSQL中的JSON数据类型视为LOB数据类型列。这意味着当您使用受限LOB模式时,LOB大小限制适用于JSON数据。例如,假设受限LOB模式设置为4,096 KB。在这种情况下,任何大于4,096 KB的JSON数据都会在4,096 KB的限制处被截断,并且无法通过PostgreSQL中的验证测试。

参考:AWS DMS - JSON data types being truncated

更新:您可以通过将 DataErrorPolicy 的值设置为 IGNORE_RECORD 来调整错误处理任务设置以跳过错误的行,从而确定操作当记录级别上发生与数据处理相关的错误时,AWS DMS进行处理。 数据处理错误的一些示例包括转换错误,转换错误和不良数据。默认值为LOG_ERROR。 IGNORE_RECORD,该任务继续,并且该记录的数据将被忽略。

参考:AWS DMS - Error handling task settings

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。