You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS DMS CDC复制任务更新记录LOB列显示Unchanged-Toast-Datum求助

解决AWS DMS CDC迁移PostgreSQL LOB列显示“Unchanged-Toast-Datum”问题

问题原因

PostgreSQL中超过阈值的LOB数据会被存入TOAST表,当仅更新表内非LOB列时,CDC日志(通过test_decoding插件生成)不会包含未修改的TOAST列实际数据,只会标记为unchanged-toast-datum。AWS DMS默认会忽略这类标记的列,导致目标S3中该列值为空;而全量加载是直接读取表全量数据,因此能正常获取LOB值。

解决方案

1. 启用DMS的CaptureUnchangedLob参数

这是最直接的修复方法,让DMS在CDC过程中,即使LOB列未被修改,也主动从源PostgreSQL库读取该列当前值并写入目标S3:

  • 操作步骤:
    1. 打开AWS DMS控制台,找到目标复制任务
    2. 编辑任务,进入任务设置 -> CDC高级设置
    3. 添加或修改参数CaptureUnchangedLob,设置值为true
    4. 保存并重启任务
  • 注意:该配置会增加源数据库的读取负载(每次CDC事件需额外查询LOB列),建议在低峰时段启用并监控源库性能。

2. 调整源表的TOAST存储策略(可选优化)

若你的表频繁出现“仅更新非LOB列但需保留LOB值”的场景,可修改LOB列的TOAST存储方式,让数据直接存入主表(避免TOAST表的间接存储):

  • 执行SQL命令(替换对应表和列名):
    ALTER TABLE public.ShipmentBilling ALTER COLUMN BillingDetails SET STORAGE PLAIN;
    
  • 限制:仅当该LOB列的平均数据大小小于PostgreSQL的toast_tuple_target参数值(默认2KB)时,此设置才会生效,否则PostgreSQL仍会自动将数据存入TOAST表。

3. 重新同步任务(若参数修改后未生效)

如果修改CaptureUnchangedLob参数后问题仍存在,尝试:

  • 停止当前CDC任务,选择重新启动任务并重新加载目标表,执行一次全量+CDC的同步,确保新配置生效。

内容的提问来源于stack exchange,提问作者Ahteshaam Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:57:55