postgresql中根据oid和filenode去找表的物理文件的位置

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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值