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列数据类型在目标数据库中必须可以为null。

注意-在我的例子中,在将JSONB列设置为可以为null之后,这个错误就消失了。

如AWS文件-中所述

在这种情况下,AWS DMS将JSONB数据视为LOB列。在迁移的满载阶段,目标列必须可以为null。

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模式设置为4096 KB。在这种情况下,任何大于4096 KB的JSON数据都会在4096 KB限制下被截断,并且无法通过PostgreSQL中的验证测试。

参考:AWS DMS-JSON数据类型被截断

更新:您可以通过将DataErrorPolicy的值设置为IGNORE_RECORD来调整错误处理任务设置,以跳过错误行,该值确定当出现与记录级别的数据处理相关的错误时,AWS DMS采取的操作。数据处理错误的一些示例包括转换错误、转换错误和坏数据。默认值为LOG_ERRORIGNORE_RECORD,任务继续,该记录的数据被忽略

参考:AWS DMS-错误处理任务设置

您提到您正在从PostgreSQL迁移到PostgreSQL。是否有使用AWS DMS的具体原因?

AWS文件:https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.Homogeneous

当您从PostgreSQL以外的数据库引擎迁移到PostgreSQL数据库时,AWS DMS几乎总是最好的迁移工具。但是当您从PostgreSQL数据库迁移到PostgreSQL时,PostgreSQL工具可能更有效

。。。

我们建议您在以下条件下使用PostgreSQL数据库迁移工具,如pg_dump:

  • 您有一个同质迁移,从源PostgreSQL数据库迁移到目标PostgreSQL
  • 您正在迁移整个数据库
  • 本机工具允许您在最少的停机时间内迁移数据

最新更新