我正在运行一个任务,它将所有数据从postgres 10.4迁移到RDS postgres 10.4。无法迁移具有jsonb列的表。错误发生后,整个表只获得包含449行的suspended.Table。
我做了跟随错误的策略,仍然整个表暂停。"DataErrorPolicy":"IGNORE_RECORD","DataTruncationErrorPolicy":"IGNORE_RECORD","DataErrorEscalationPolicy":"SUSPEND_TABLE","DataErrorEscalationCount":1000,
我的期望是整个表应该被转移,如果有任何json错误,它可以忽略记录。我不知道为什么它给这个错误‘无效的输入语法类型json’,我已经检查了所有的json和所有的json是有效的。
在调试了更多之后,这个错误被认为是表错误,但是为什么呢?这就是为什么由于TableErrorPolicy是‘悬空_ 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)
编辑-调试之后,这个错误被认为是表错误,但是为什么呢?
发布于 2020-09-03 03:11:16
在目标DB中,JSONB列数据类型必须为空。
注意-在我的例子中,在使JSONB列为可空之后,此错误消失了。
如AWS文件所述-
在本例中,AWS DMS将JSONB数据视为LOB列。在迁移的满载阶段,目标列必须为空。
Source.PostgreSQL.Prerequisites
https://aws.amazon.com/premiumsupport/knowledge-center/dms-error-null-value-column/
发布于 2020-09-01 05:48:12
AWS将PostgreSQL中的JSON数据类型视为LOB数据类型列。这意味着当您使用有限LOB模式时LOB大小限制适用于JSON数据。例如,假设有限LOB模式设置为4,096 KB。在本例中,任何大于4,096 KB的JSON数据都会在4,096 KB的限制范围内被截断,并在PostgreSQL中通过验证测试。
DataErrorPolicy更新:您可以调整错误处理任务设置以跳过错误行,方法是将的值设置为IGNORE_RECORD,该值确定在记录级别上与数据处理相关的错误时所采取的操作。数据处理错误的一些示例包括转换错误、转换中的错误和坏数据。默认情况是LOG_ERROR。IGNORE_RECORD,任务继续,该记录的数据将被忽略。
参考资料:AWS DMS -错误处理任务设置
发布于 2022-04-20 10:05:42
您提到您正在从PostgreSQL迁移到PostgreSQL。是否有使用AWS DMS的具体原因?
AWS文档:Source.PostgreSQL.Homogeneous
当您从PostgreSQL以外的数据库引擎迁移到PostgreSQL数据库时,AWS几乎总是最好的迁移工具。但是当您从数据库迁移到PostgreSQL数据库时,PostgreSQL工具可能会更有效。
..。
我们建议在以下条件下使用PostgreSQL数据库迁移工具(如pg_dump ):
https://stackoverflow.com/questions/63681133
复制相似问题