YugabyteDB执行ADD COLUMN IF NOT EXISTS报错列已存在如何解决
故障根因
YugabyteDB 为分布式架构,若之前执行过同名列的创建DDL时出现节点通信中断、事务异常回滚等情况,会导致pg_attribute等系统元数据表残留对应列的无效记录:ADD COLUMN IF NOT EXISTS会优先检测系统元数据判定列已存在报错,但实际列未完成全链路创建,因此查询表结构时看不到该列。
修复步骤
第一步:确认元数据残留
执行以下查询验证系统表中是否存在对应列的残留记录,注意将table_name替换为实际表名,若使用独立Schema请补全Schema前缀:SELECT attname FROM pg_attribute WHERE attrelid = 'table_name'::regclass AND attname = 'chk_col' AND attisdropped = false;若查询返回记录即可确认为元数据残留问题。
第二步:清理无效元数据
先执行列删除语句清理残留元数据:ALTER TABLE table_name DROP COLUMN IF EXISTS chk_col;执行完成后重新运行原始的新增列语句即可:
alter table table_name ADD COLUMN IF NOT EXISTS chk_col jsonb not null DEFAULT '{}'::jsonb;特殊情况处理(上述步骤无效时使用)
- 先检查是否有未结束的同表DDL事务阻塞元数据更新:
若有残留事务,执行终止命令(替换SELECT pid, query FROM pg_stat_activity WHERE query ILIKE '%table_name%' AND state = 'active' AND query ILIKE '%ALTER%';对应pid为上一步查询到的pid值):SELECT pg_terminate_backend(对应pid); - 若仍存在问题,需由集群管理员调用YB管理工具修复集群元数据一致性:
执行完成后重新执行新增列语句即可。yb-admin -master_addresses <master节点地址列表> repair_syscatalog_entries
- 先检查是否有未结束的同表DDL事务阻塞元数据更新:
内容的提问来源于stack exchange,提问作者lazyakshay
相关产品推荐
相关产品推荐

