查询该表报错:
test=# select count(*) from test;
2021-04-28 11:41:35.783 HKT [36138] ERROR: catalog is missing 10 attribute(s) for relid 30804 at character 22
2021-04-28 11:41:35.783 HKT [36138] STATEMENT: select count(*) from test;
ERROR: XX000: catalog is missing 10 attribute(s) for relid 30804
LINE 1: select count(*) from test;
^
LOCATION: RelationBuildTupleDesc, relcache.c:581
Time: 0.707 ms
一般报这种错就是表有损坏,可以尝试从备份中恢复,或者直接删除,但 删除该表发现报错:
test=# drop table if exists test;
2021-04-28 11:39:50.670 HKT [36138] ERROR: cache lookup failed for attribute 9 of relation 30804
2021-04-28 11:39:50.670 HKT [36138] STATEMENT: drop table if exists test;
ERROR: XX000: cache lookup failed for attribute 9 of relation 30804
LOCATION: get_relid_attribute_name, lsyscache.c:808
Time: 0.870 ms
问题解决思路:
找到test表对应的oid值,然后根据oid值在pg_class和pg_depend表里删除对应的元数据信息。
查test表的oid值:
test=# select oid from pg_class where relname='test';
oid
-------
30804
(1 row)
Time: 0.649 ms
删除pg_class中对应test的元数据信息:
11:41:42 (postgres@127.0.0.1:5432)test=# delete from pg_class where oid =30804;
DELETE 1
Time: 1.189 ms
删除pg_class中对应test的元数据信息:
11:41:55 (postgres@127.0.0.1:5432)test=# delete from pg_depend where objid = 30804;
DELETE 1
test表已正常从数据库里删除:
test=# select count(*) from test;
2021-04-28 11:52:06.483 HKT [36138] ERROR: relation "test" does not exist at character 22
2021-04-28 11:52:06.483 HKT [36138] STATEMENT: select count(*) from test;
ERROR: 42P01: relation "test" does not exist
LINE 1: select count(*) from test;
^
LOCATION: parserOpenTable, parse_relation.c:1180
Time: 0.547 ms
备注:
pg_class元数据表记录表和几乎所有具有列或者像表的东西。这包括索引(但还要参见pg_index)、序列(但还要参见pg_sequence)、视图、物化视图、组合类型和TOAST表。
pg_depend
目录pg_depend元数据表记录数据库对象之间的依赖关系。这些信息允许DROP命令查找必须被DROP CASCADE删除的其他对象,
或者在DROP RESTRICT情况下阻止删除。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15498/viewspace-2770255/ ,如需转载,请注明出处,否则将追究法律责任。