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