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

本文介绍了在highgo数据库中如何通过OID和FileNode定位表的物理文件位置,并展示了实际操作过程,包括创建表、查询OID与FileNode以及通过truncate操作后的变化。
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>我们正在处理关于Greenplum数据库中空间、文件空间对应关系看方法的问题。根据提供的引用信息,我们可以总结如下:引用[1]展示了空间大小的方法,涉及`pg_tablespace`系统`pg_tablespace_size`函数。引用[2]提到了使用`pg_relation_filepath`函数来获取对应的文件路径(在PostgreSQL9.0及以上版本)。引用[4]给出了一个Greenplum中从找对应数据文件的SQL询,涉及`pg_class``pg_namespace`。在Greenplum中,空间(tablespace)文件空间(filespace)是两个相关但不同的概念:-文件空间(filespace)定义了一个存储位置,通常对应于文件系统上的一个目录,用于存储数据文件。-空间(tablespace)则是一个逻辑概念,它映射到一个文件空间,从而允许数据库对象(如、索引)存储到特定的文件空间中。因此,一个空间会关联到一个文件空间,而一个文件空间可以有多个空间(但通常一个空间只对应一个文件空间)。要空间文件空间的对应关系,我们可以询系统`pg_tablespace``pg_filespace`(注意:在较新的Greenplum版本中,文件空间的概念可能已被空间直接替代,或者有变化。但根据问题,我们假设使用的是有文件空间的版本)。###空间文件空间的对应关系1.**看所有空间及其对应的文件空间**:```sqlSELECTspcnameAStablespace_name,fspcnameASfilespace_nameFROMpg_tablespacetsJOINpg_filespacefsONts.spcfsoid=fs.oid;```2.**看某个特定空间对应的文件空间**:将上述询加上WHERE条件,例如:```sqlSELECTspcnameAStablespace_name,fspcnameASfilespace_nameFROMpg_tablespacetsJOINpg_filespacefsONts.spcfsoid=fs.oidWHEREspcname='your_tablespace_name';```###空间对应的物理路径在Greenplum中,文件空间对应的物理路径存储在系统`pg_filespace_entry`中。可以通过以下看每个文件空间的详细存储位置(包括每个segment的路径):```sqlSELECTfspcnameASfilespace_name,fsedbidASdbid,fselocationASlocationFROMpg_filespace_entryJOINpg_filespacefsONfsefsoid=fs.oid;```###或索引所在的空间文件空间要看某个或索引所在的空间(从而知道其文件空间),可以询`pg_class``pg_tablespace`:```sqlSELECTc.relnameASobject_name,t.spcnameAStablespace_name,f.fspcnameASfilespace_nameFROMpg_classcLEFTJOINpg_tablespacetONc.reltablespace=t.oidJOINpg_filespacefONt.spcfsoid=f.oidWHEREc.relname='your_table_name';```注意:如果没有指定空间,则它位于数据库的默认空间中。可以通过询`pg_database`获取数据库的默认空间,然后再关联到文件空间。###对应的物理文件引用[2][4]提供了对应物理文件的方法:-使用`pg_relation_filepath`函数(在Greenplum中也可用):```sqlSELECTpg_relation_filepath('schema_name.table_name');```这将返回该文件系统中的路径(相对于数据目录)。-或者使用引用[4]中的询(需要知道模式名):```sqlSELECTb.nspname||'.'||a.relnameASfull_name,a.relfilenodeASfile_node,pg_relation_filepath(a.oid)ASfile_pathFROMpg_classa,pg_namespacebWHEREa.relnamespace=b.oidANDa.relname='your_table_name'ANDb.nspname='your_schema_name';```###注意事项-在Greenplum中,由于是分布式数据库,每个在master每个segment上都有对应的文件。上述`pg_relation_filepath`函数在master节点上执行返回的是master节点上该文件路径(通常只是一个空,因为数据在segment上)。要看segment上的文件,需要在segment上执行该函数,或者通过系统`gp_segment_configuration``pg_filespace_entry`来获取所有segment的位置。###总结通过上述询,我们可以获得空间与文件空间的对应关系,以及对应的物理文件路径。这些信息对于数据库管理、数据存储优化故障排都非常有用。§§相关问题§§1.如何看Greenplum中每个segment的空间使用情况?2.Greenplum中如何创建新的空间并指定文件空间?3.在Greenplum中,如何将移动到另一个空间?4.Greenplum的文件空间空间有什么关系?</think>### Greenplum 空间与文件空间对应关系看方法 在 Greenplum 中,**空间(Tablespace)** 是逻辑存储单元,而**文件空间(Filespace)** 是物理存储位置。它们通过系统关联,以下是看对应关系的方法: #### 1. 空间与文件空间映射关系 ```sql SELECT spcname AS tablespace_name, pg_get_userbyid(spcowner) AS owner, pg_tablespace_location(oid) AS location, fspcname AS filespace_name FROM pg_tablespace JOIN pg_filespace ON pg_tablespace.spcfsoid = pg_filespace.oid; ``` **说明**: - `spcname`:空间名称 - `fspcname`:关联的文件空间名称 - `location`:物理存储路径 - 通过 `spcfsoid` 字段关联系统 `pg_filespace`[^4] #### 2. 对应的物理文件路径 ```sql SELECT pg_relation_filepath('schema_name.table_name') AS file_path; ``` 或使用 OID 询: ```sql SELECT pg_relation_filepath(oid) AS file_path FROM pg_class WHERE relname = 'your_table_name'; ``` **结果示例**: `base/16384/12345` 数据存储在 `$PGDATA/base/16384/12345`[^2] #### 3. 文件空间物理位置 ```sql SELECT fspcname AS filespace_name, fselocation AS physical_path FROM pg_filespace_entry JOIN pg_filespace ON pg_filespace.oid = fsefsoid; ``` #### 4. 所在的空间 ```sql SELECT relname AS table_name, spcname AS tablespace_name FROM pg_class c LEFT JOIN pg_tablespace t ON c.reltablespace = t.oid WHERE relname = 'your_table_name'; ``` ### 关键概念说明 1. **层级关系**: 文件空间 → 空间 → 数据库对象(/索引) *物理存储 → 逻辑分组 → 具体数据* 2. **默认配置**: - 系统默认空间:`pg_default` - 系统默认文件空间:`pg_system` - 新建未指定空间时,使用数据库默认空间 3. **文件存储规则**: - 每个对应独立的物理文件 - TOAST 大对象存储在关联的 `*_toast` 文件中[^2] - 分区每个分区有独立文件 > **注意**:在分布式环境中,每个 Segment 节点都会存储对应文件的副本,需在**所有节点**执行路径询才能获取完整信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值