暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

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

原创 szrsu 2022-09-22
2036

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论