如何修改系统表找回丢失的列信息
➢ 分析&&解答
1.查询丢失列的用户表的 oid, 给第二步使用
select oid, * from pg_class where relname=;
2.确认丢失列是否在 pg_attribute 系统表中存在, 如果能够查到数据,说明这种情况可以恢复删除的列;
select attrelid, attname, attnum, atttypid from pg_attribute where attisdropped='t' and attrelid=;
这种情况下,通常 attname 不是真实的列名, atttypid 通常为 0
3.找到丢失列的真实名称, 以及 丢失之前的真实类型 oid(在 pg_type 这个表中根据 typname 查找 oid)
4.上述步骤都完成后,开启进行元数据的修改,
show allow_system_table_mods; (默认为 NONE) set allow_system_table_mods = 'DML';
5.通过修改 pg_attribute 将丢失的列恢复
update pg_attribute set attname=original_name, atttypid=original_id attisdropped='f' where attrelid=*** and attnum=original_col_num and attisdropped='t';
6.查询原先丢失的列是否已经恢复
6.1 查询表结构: \d table_name
6.2 查询表数据: select * from table_name limit 10;
7.关闭元数据修改模式:set allow_system_table_mods='none';
8.根据需要最好重新做一下 analyze table_name;