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:
- 操作步骤:
- 打开AWS DMS控制台,找到目标复制任务
- 编辑任务,进入任务设置 -> CDC高级设置
- 添加或修改参数
CaptureUnchangedLob,设置值为true - 保存并重启任务
- 注意:该配置会增加源数据库的读取负载(每次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
相关产品推荐
相关产品推荐

