postgres安装后下面有个base目录,目录下的文件通常是一串数字组成,这串数字是什么呢?他是如何和表对应关联起来的?
SQL操作
create table test(c int4);
select oid,* from pg_class where relname ='test'
"oid";"relname";"relnamespace";"reltype";"reloftype";"relowner";"relam";"relfilenode";"reltablespace";"relpages";"reltuples";"relallvisible";"reltoastrelid";"reltoastidxid";"relhasindex";"relisshared";"relpersistence";"relkind";"relnatts";"relchecks";"relhasoids";"relhaspkey";"relhasrules";"relhastriggers";"relhassubclass";"relispopulated";"relfrozenxid";"relminmxid";"relacl";"reloptions"
410265;"test";2200;410267;0;10;0;410265;0;0;0;0;0;0;f;f;"p";"r";1;0;f;f;f;f;f;t;61603587;1929;"";""
由于oid是隐藏列,必须明确指定才可以显示出来,类似ctid,xmin,xmax,cmin,cmax等等。
Linux操作
[root@R720 base]# find ./ -name 410265
./98983/410265
[root@R720 base]# ll ./98983/410265
-rw------- 1 postgres postgres 0 8月 6 15:49 ./98983/410265
SQL操作
insert into test values(1);
Linux操作
[root@R720 base]# ll ./98983/410265
-rw------- 1 postgres postgres 8192 8月 6 15:49 ./98983/410265
我们发现文件大小被改变,所以可以判定这个文件和表的关系。
SQL操作
truncate test ;
select oid,* from pg_class where relname ='test'
"oid";"relname";"relnamespace";"reltype";"reloftype";"relowner";"relam";"relfilenode";"reltablespace";"relpages";"reltuples";"relallvisible";"reltoastrelid";"reltoastidxid";"relhasindex";"relisshared";"relpersistence";"relkind";"relnatts";"relchecks";"relhasoids";"relhaspkey";"relhasrules";"relhastriggers";"relhassubclass";"relispopulated";"relfrozenxid";"relminmxid";"relacl";"reloptions"
410265;"test";2200;410267;0;10;0;410271;0;0;0;0;0;0;f;f;"p";"r";1;0;f;f;f;f;f;t;61603590;1929;"";""
我们发现oid没有改变,但是relfilenode被改变了,relfilenode是什么呢?
Linux操作
[root@R720 base]# ll ./98983/410265
ls: 无法访问./98983/410265: 没有那个文件或目录
[root@R720 base]# find ./ -name 410265
[root@R720 base]# find ./ -name 410271
./98983/410271
[root@R720 base]# ll ./98983/410271
-rw------- 1 postgres postgres 0 8月 6 15:56 ./98983/410271
以上Linux操作可以看出,truncate表之后文件被物理删除了,而新建的文件名字对应的就是relfilenode字段值。