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

本文介绍了在highgo数据库中如何通过OID和FileNode定位表的物理文件位置,并展示了实际操作过程,包括创建表、查询OID与FileNode以及通过truncate操作后的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

highgo=# create table tian (id int primary key, name varchar(50));
注意: CREATE TABLE / PRIMARY KEY 将要为表 "tian" 创建隐含索引 "tian_pkey"
CREATE TABLE
highgo=# select oid,relfilenode from pg_class where relname='tian';
oid | relfilenode
-------+-------------
16384 | 16384
(1 row)
oid和filenode对应的值是一样的,去找一下对应表的物理文件 



highgo=# select oid,datname from pg_database ;
1 | template1
12872 | template0
12877 | highgo
或者
[highgo@node1 12877]$ oid2name
All databases:
Oid Database Name Tablespace
----------------------------------
12877 highgo pg_default
12872 template0 pg_default
1 template1 pg_default
如果没有oid2name则需要去postgresql解压目录下的contrib安装一下,make,    make install  

[highgo@node1 12877]$ pwd
/usr/local/cluster/hgdb/data/base/12877
[highgo@node1 12877]$ ls -l 16384
-rw-------. 1 highgo highgo 0 Mar 20 10:13 16384

我们在对表进行过truncate或者vacuum操作以后(无论表中是不是有数据),oid是不变的,而filenode是发生变化的 
highgo=# truncate table tian;
TRUNCATE TABLE
highgo=# select oid,relfilenode from pg_class where relname='tian';
16384 | 16389

[highgo@node1 12877]$ ls -l 16384
ls: cannot access 16384: No such file or directory
[highgo@node1 12877]$ ls -l 16389
-rw-------. 1 highgo highgo 0 Mar 20 10:29 16389

可以看出来我们根据oid找不到对应的物理文件,而根据filenode就找到了,因此根据oid查找其物理文件的位置是不靠谱的。

highgo@node1 12877]$ oid2name -d highgo 【查看某数据库中的所有表】
From database "highgo":
Filenode Table Name
----------------------
16389 tian
 
<think>好的,我需要详细解释数据库的存储位置文件名、文件个数大小等信息。首先,我得考虑不同数据库系统的差异,比如MySQL、PostgreSQL、OracleSQLite,它们各自的存储方式可能不同。 对于存储位置,一般来说,默认路径在不同操作系统下也不一样。例如,MySQL在Linux下通常是/var/lib/mysql,而Windows可能在ProgramData目录下。要提醒用户具体路径可能因安装配置而异,建议看配置文件。 接下来是文件个数。不同的数据库系统有不同的文件类型。比如InnoDB引擎使用.ibd文件PostgreSQL有base目录下的子目录,Oracle涉及数据文件、控制文件日志文件等。需要分点说明每个系统的常见文件类型命名规则。 文件大小方面,影响因素包括存储引擎、结构、索引、数据量等。需要提到初始大小自动扩展机制,比如MySQL的自动扩展,PostgreSQL的分段存储,以及SQLite的单个文件特点。 最后要总结注意事项,比如路径可能变化,文件操作需谨慎,备份的重要性等。需要确保信息准确,同时语言要口语化,避免使用Markdown格式,保持自然。</think>以下从数据库通用结构及常见数据库系统的角度,分步说明存储相关信息: 一、存储位置 1. 默认路径 - MySQL:Linux下通常为 `/var/lib/mysql`,Windows下为 `C:\ProgramData\MySQL` - PostgreSQL:Linux下 `/var/lib/pgsql`,Windows下 `C:\Program Files\PostgreSQL` - Oracle:由参数文件控制,默认 `ORACLE_BASE/oradata` - SQLite:应用程序当前目录(单文件存储) 2. 路径验证方法 通过数据库客户端执行: ```sql -- MySQL SHOW VARIABLES LIKE 'datadir'; -- PostgreSQL SHOW data_directory; -- Oracle SELECT name FROM v$datafile; ``` 二、文件组成与命名 1. MySQL(InnoDB引擎) - 结构文件:`${database}/${table}.frm` - 数据文件:`ibdata1`(系统空间),`${table}.ibd`(独立空间) - 日志文件:`ib_logfile0`, `ib_logfile1`(重做日志) 2. PostgreSQL - 基础数据:`base/${database_oid}/${table_filenode}` - 事务日志:`pg_wal` 目录下的分段文件(如`000000010000000000000001`) - 配置文件:`postgresql.conf`, `pg_hba.conf` 3. Oracle - 数据文件:`SYSTEM01.DBF`, `USERS01.DBF` 等 - 控制文件:`control01.ctl`, `control02.ctl` - 日志文件:`redo01.log`, `redo02.log` 4. SQLite - 单一文件:`database_name.db`(主文件) - 临时文件:`database_name.db-journal`(WAL模式) 三、文件大小特征 1. 动态扩展 - MySQL:默认自动扩展(`innodb_autoextend_increment` 控制步长) - PostgreSQL:8KB页大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值