Postgresql oid介绍及如何通过oid找到文件位置

Postgresql所有数据库对象通过oid进行管理,oid是4字节无符号整型。数据库对象与相应的oid之间的关系存储在对应的目录中。

postgres=# select oid,datname from pg_database;
oid | datname
-------±----------
13754 | postgres
1 | template1
13753 | template0
16399 | testdb
16447 | hrdb
(5 行记录)

postgres=# select relname,oid,relfilenode from pg_class where relname=‘t1’;
relname | oid | relfilenode
---------±------±------------
t1 | 16435 | 16435
(1 行记录)

首次创建时oid=relfilenode,relfilenode的指也等于数据文件的命名,数据文件超过1GB会创建出OID名.n的分支文件,以此类推,配置时使用–with-segsize更改表和索引的最大文件大小

postgres=# select pg_relation_filepath('t1');
 pg_relation_filepath
----------------------
 base/13754/16435         ####13754是数据库oid,16435数据文件oid
(1 行记录)


ll $PGDATA/base/13754/16435


当对表或索引执行truncate、reindex、cluster、vacuum full 时relfilenode名称会变化。即oid不等于relfilenode值了,文件被重建了。

postgres=# vacuum full t1;
VACUUM
postgres=# select pg_relation_filepath('t1');
 pg_relation_filepath
----------------------
 base/13754/16667                   ####由原来的 16435 变成 16667
(1 行记录)

ll $PGDATA/base/13754/16667


13587 13587_fsm 13587_vm


主体数据文件 0
_fsm 空闲空间映射文件 1
_vm 可见性映射文件 2

自定义表空间的oid对应

create table test2 (id int) tablespace tbltest;
select pg_relation_filepath('test2');
 pg_relation_filepath
----------------------
 pg_tblspc/16450/PG_12_201909212/13593/16451

16450:表空间oid
13593:数据库oid
16451:表oid


在tbltest表空间下创建新表test2,但是test2属于postgres数据库,postgres数据库创建在base目录下,那么PG会首先在特定的子目录下()创建
名称与现有数据库oid相同的新目录,然后将新表文件放置在刚创建的目录下。

实验如下:
postgres@[local]:5432=#select oid,datname from pg_database;
oid | datname
-------±----------
1 | template1
13891 | template0
13892 | postgres
16454 | mydb
16552 | test
(5 rows)

–创建tablespace存放目录并授权

# mkdir -p /opt/mybs
# chown -R postgres.postgres /opt/mybs/
postgres@[local]:5432=#create tablespace tbltest owner postgres location '/opt/mybs';
CREATE TABLESPACE

postgres@[local]:5432=#create table test2(id int) tablespace tbltest;
CREATE TABLE
postgres@[local]:5432=#select pg_relation_filepath('test2');
            pg_relation_filepath             
---------------------------------------------
 pg_tblspc/16556/PG_14_202107181/13892/16557
(1 row)


[root@pgdkcs 13892]# pwd
/opt/mybs/PG_14_202107181/13892 ####13892是postgres数据库的oid
[root@pgdkcs 13892]# ls
16557


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论