AWS DMS数据复制失败,仅识别部分列触发目标表非空约束报错
AWS DMS 复制
users表非空约束报错排查方案 你遇到的报错本质是DMS同步插入数据时,未给目标端users表的非空name列传有效值,触发PostgreSQL(SqlState 23502对应PostgreSQL非空约束报错)的写入失败,可按以下步骤排查:
报错原文:
ERROR - RetCode: SQL_ERROR SqlState: 23502 NativeError: 1 Message: ERROR: null value in column "name" of relation "users" violates not-null constraint;
Error while executing the query
排查步骤
- 核对源端、目标端
users表结构
分别在源库、目标库执行表结构查询语句,确认两侧列名、列顺序、非空约束完全一致:
源库查询:DESCRIBE users;(MySQL)/\d users;(PostgreSQL)
目标库查询:\d users;(PostgreSQL)
重点确认name列在源表是否为非空,以及列的排序位置。 - 校验DMS映射规则的列配置
检查你配置的表映射规则,确认没有给users表配置列过滤规则:- 有没有设置只同步
users表的部分列,漏选了name列 - 有没有配置列转换规则,错误地将
name列置空、重命名或者过滤
- 有没有设置只同步
- 验证插入语句的合法性
你执行的INSERT INTO users VALUES(13,'test');未指定列名,完全依赖源表的列顺序赋值:
如果源表的列顺序不是[id, name],而是比如[id, age, name],那么你这个插入语句实际是给id赋值13、age赋值'test',name为NULL,本身就不符合源表约束(如果源表name非空的话你源端就会报错,如果源端没报错说明源端name允许为空,但目标端设置了非空,就是两侧表结构不一致的问题)。 - 修复后验证
定位问题修复后,重启DMS复制任务,执行带明确列名的插入语句测试:INSERT INTO users (id, name) VALUES (14, 'dms_test');
检查目标端users表是否成功写入数据,awsdms_apply_exception表无新报错即为恢复正常。
内容的提问来源于stack exchange,提问作者Eyal Solomon
相关产品推荐
相关产品推荐

