【问题标题】:invalid input syntax for type json aws dms postgresjson aws dms postgres 类型的输入语法无效
【发布时间】:2022-04-20 18:05:42
【问题描述】:

我正在运行一项将所有数据从 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)

Edit-多调试后,这个错误一直被认为是TABLE错误,但是为什么?

【问题讨论】:

  • 你能验证列中的数据是有效的 JSON 吗?
  • jsonb列中实际存在的数据
  • 是的,但它是有效的 JSON 记录 raghavt.com/blog/2018/08/23/… 吗?
  • 是的,所有的 json 都是正确的。我已经更新了问题。请检查。谢谢!

标签: postgresql aws-dms


【解决方案1】:

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/

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 我正在使用完整的 lob 模式。不使用受限 lob 模式。
    • 我应该尝试在全 lob 模式下增加 lob 大小吗?
    • @OpsterElasticsearchPro-Vijay,是的。此外,为确保它是由于 LOB 大小限制引起的,请尝试导入除具有 JSON 列的表之外的所有表以确认并加载具有不同配置的 JSON 列的单个表,以节省时间并确认解决方法。
    • 我在全 lob 模式下增加了 lob 的大小。还是同样的问题。我们能够迁移非 jsonb 表。
    • 你救了我的命,非常感谢你指出AWS DMS treats the JSON data type in PostgreSQL as a LOB data type column. 的事实。谢谢!
    【解决方案3】:

    您提到您正在从 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 工具会更有效。

    ...

    我们建议您在以下情况下使用 pg_dump 等 PostgreSQL 数据库迁移工具:

    • 您进行了同构迁移,即从源 PostgreSQL 数据库迁移到目标 PostgreSQL 数据库。
    • 您正在迁移整个数据库。
    • 本机工具可让您以最少的停机时间迁移数据。

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2021-11-04
      • 2023-01-15
      相关资源
      最近更新 更多