今天在网上看到有人问误删pg_filenode.map该如何恢复或者重建,解决这个问题前我们先来了解下pg_filenode.map文件。
对于PostgreSQL中的每张表在磁盘上都有与之相关的文件,而这些文件的名字便是relfilenode,我们可以通过pg_class的relfilenode字段去查询。
但是有一部分特殊的表我们会发现其对应的该字段为0,官方文档的解释为:0表示这是一个“映射”关系,其磁盘文件名取决于低层状态。那么哪些表的relfilenode字段会是0呢?这些relfilenode为0的表对应的文件又该如何去查找呢?
我们都知道对于一张普通表,其relfilenode和oid默认是一样的,例如:
bill=# create table t(id int);
CREATE TABLE
bill=# select oid,relname,relfilenode from pg_class where relname = 't';
oid | relname | relfilenode
-------+---------+-------------
24919 | t | 24919
(1 row)
但是当我们对该表进行了例如vacuum full、truncate之类的操作后,那么relfilenode便会发生变化:
bill=# vacuum FULL t;
VACUUM
bill=# select oid,relname,relfilenode from pg_class where relname = 't';
oid | relname | relfilenode
-------+---------+-------------
24919 | t | 24922
(1 row)
那么我们再来看看那些relfilenode为0的表:
bill=# select oid, relname, relfilenode,reltablespace
bill-# from pg_class
bill-# where relfilenode = 0 and relkind = 'r'
bill-# order by reltablespace;
oid | relname | relfilenode | reltablespace
------+-----------------------+-------------+-----------