highgo=# create table tian (id int primary key, name varchar(50));
注意: CREATE TABLE / PRIMARY KEY 将要为表 "tian" 创建隐含索引 "tian_pkey"
CREATE TABLE
highgo=# select oid,relfilenode from pg_class where relname='tian';
oid | relfilenode
-------+-------------
16384 | 16384
(1 row)
oid和filenode对应的值是一样的,去找一下对应表的物理文件
highgo=# select oid,datname from pg_database ;
1 | template1
12872 | template0
12877 | highgo
或者
[highgo@node1 12877]$ oid2name
All databases:
Oid Database Name Tablespace
----------------------------------
12877 highgo pg_default
12872 template0 pg_default
1 template1 pg_default
【
如果没有oid2name则需要去postgresql解压目录下的contrib安装一下,make, make install
】
[highgo@node1 12877]$ pwd
/usr/local/cluster/hgdb/data/base/12877
[highgo@node1 12877]$ ls -l 16384
-rw-------. 1 highgo highgo 0 Mar 20 10:13 16384
我们在对表进行过truncate或者vacuum操作以后(无论表中是不是有数据),oid是不变的,而filenode是发生变化的
highgo=# truncate table tian;
TRUNCATE TABLE
highgo=# select oid,relfilenode from pg_class where relname='tian';
16384 | 16389
[highgo@node1 12877]$ ls -l 16384
ls: cannot access 16384: No such file or directory
[highgo@node1 12877]$ ls -l 16389
-rw-------. 1 highgo highgo 0 Mar 20 10:29 16389
可以看出来我们根据oid找不到对应的物理文件,而根据filenode就找到了,因此根据oid查找其物理文件的位置是不靠谱的。
highgo@node1 12877]$ oid2name -d highgo 【查看某数据库中的所有表】
From database "highgo":
Filenode Table Name
----------------------
16389 tian