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

1.新建一张表
postgres=# create table a(a int);
CREATE TABLE
postgres=# select oid,relfilenode from pg_class where relname='a';
  oid  | relfilenode 
-------+-------------
 17107 |       17107
(1 row)
我们会发现,oid和filenode对应的值是一样的,去找一下对应表的物理文件
[postgres@node2 13269]$ ls -l 17107
-rw-------. 1 postgres postgres 0 Mar 20 06:43 17107
[postgres@node2 13269]$ pwd
/home/postgres/data/base/13269
可以发现,我们可以找到想对应的物理文件
去看一下,我之前建的一张表
postgres=# select oid,relfilenode from pg_class where relname='test';
  oid  | relfilenode 
-------+-------------
 16478 |       16499
(1 row)
发现oid和filenode对应的值不一样。
先查看数据库的oid
postgres=# select oid,datname from pg_database ;
  oid  |  datname  
-------+-----------
 13269 | postgres
     1 | template1
 13268 | template0
 16466 | test
 17096 | database
(5 rows)
去找一下物理文件
[postgres@node2 13269]$ ls -l  16478
ls: cannot access 16478: No such file or directory
[postgres@node2 13269]$ pwd
/home/postgres/data/base/13269
[postgres@node2 13269]$ ls -l  16499
-rw-------. 1 postgres postgres 229376 Mar 14 13:56 16499
[postgres@node2 13269]$ pwd
/home/postgres/data/base/13269
可以看出来我们根据oid找不到对应的物理文件,而根据filenode就找到了。
原因:
我们在对表进行过truncate或者vacuum操作以后,oid是不变的,而filenode是发生变化的
postgres=# insert into a select generate_series(1,100);
INSERT 0 100
postgres=# select oid,relfilenode from pg_class where relname='a';
  oid  | relfilenode 
-------+-------------
 17107 |       17107
(1 row)

postgres=# truncate a;
TRUNCATE TABLE
postgres=# select oid,relfilenode from pg_class where relname='a';
  oid  | relfilenode 
-------+-------------
 17107 |       17110
(1 row)


postgres=# insert into a select generate_series(101,200);
INSERT 0 100
postgres=# delete from a;
DELETE 100
postgres=# select oid,relfilenode from pg_class where relname='a';
  oid  | relfilenode 
-------+-------------
 17107 |       17110
(1 row)
postgres=# vacuum full a;
VACUUM
postgres=# select oid,relfilenode from pg_class where relname='a';
  oid  | relfilenode 
-------+-------------
 17107 |       17111
(1 row)
所以根据oid去查找表的物理文件的位置是不靠谱的事情。

2.查找表物理文件的方式:
postgres=# select pg_relation_filepath('a');
 pg_relation_filepath 
----------------------
 base/13269/17111
(1 row)
另一种方式为通过oid2name
[postgres@node2 contrib]$ oid2name
All databases:
    Oid  Database Name  Tablespace
----------------------------------
  17096       database  pg_default
  13269       postgres  pg_default
  13268      template0  pg_default
      1      template1  pg_default
  16466           test  pg_default
[postgres@node2 contrib]$ oid2name -d postgres 
From database "postgres":
  Filenode        Table Name
----------------------------
     17111                 a
     16493          lineitem
     17089  pgbench_accounts
     17086  pgbench_branches
     17077   pgbench_history
     17080   pgbench_tellers
     16484                t3
     16499              test
     16490           ticket1
如果没有oid2name则需要去postgresql解压目录下的contrib安装一下,make,    make install




  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值