1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG209-PG数据库物理存储:文件结构与目录组织

本文档风哥主要介绍PostgreSQL数据库的物理存储结构,包括文件结构、目录组织、表空间存储等内容,风哥教程参考PostgreSQL官方文档Physical Storage内容,适合数据库管理员和开发者在学习和测试中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 PostgreSQL物理存储概念

PostgreSQL物理存储是指PostgreSQL数据库在磁盘上的存储结构,包括数据文件、日志文件、配置文件等。PostgreSQL使用文件系统来存储数据,通过目录和文件的层次结构来组织数据。

PostgreSQL物理存储的特点:

  • 基于文件系统存储
  • 层次化的目录结构
  • 支持表空间
  • 预写式日志(WAL)
  • 数据文件和元数据分离

1.2 PostgreSQL存储层次结构

PostgreSQL的存储层次结构从上到下依次为:

  • 数据库集群:包含多个数据库
  • 数据库:包含多个模式
  • 模式:包含多个表和其他数据库对象
  • 表:包含多个数据页
  • 数据页:最小存储单位,通常为8KB
  • 行:数据记录

1.3 PostgreSQL文件类型

PostgreSQL的主要文件类型包括:

  • 数据文件:存储表和索引数据
  • WAL文件:预写式日志文件
  • 配置文件:postgresql.conf、pg_hba.conf等
  • 控制文件:存储数据库集群的元数据
  • 日志文件:错误日志、查询日志等
风哥提示:了解PostgreSQL的物理存储结构,有助于理解数据库的工作原理,为存储规划和性能优化提供基础。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 PostgreSQL存储规划

PostgreSQL存储规划建议:

# 存储容量规划
– 数据文件:根据业务数据量估算
– WAL文件:通常为数据文件的10-20%
– 索引:通常为数据文件的20-30%
– 预留空间:至少20%的预留空间

# 存储类型选择
– 数据文件:SSD(推荐)或HDD
– WAL文件:SSD(推荐)
– 备份:HDD或云存储

# 存储配置
– RAID级别:RAID 10(推荐)或RAID 5
– 文件系统:ext4、XFS(推荐)或ZFS
– 挂载选项:noatime, nodiratime

# 表空间规划
– 系统表空间:默认表空间
– 用户表空间:根据业务需求创建
– 索引表空间:单独的表空间存储索引
– 临时表空间:单独的表空间存储临时数据

2.2 PostgreSQL存储优化

PostgreSQL存储优化建议:

# 存储参数优化
– shared_buffers:设置为物理内存的25%
– effective_cache_size:设置为物理内存的50-75%
– random_page_cost:SSD设置为1.1,HDD设置为4.0
– effective_io_concurrency:SSD设置为200,HDD设置为10

# 文件系统优化
– 禁用文件系统日志(如ext4的journal)
– 调整文件系统块大小:与PostgreSQL数据页大小匹配(8KB)
– 使用TRIM命令(SSD)

# 存储布局优化
– 分离数据文件和WAL文件
– 分离不同表空间到不同存储设备
– 使用条带化存储提高I/O性能

2.3 PostgreSQL存储监控

PostgreSQL存储监控建议:

  • 磁盘空间:监控磁盘使用率,设置阈值报警
  • I/O性能:监控I/O吞吐量、延迟等指标
  • 文件系统:监控文件系统健康状态
  • 表空间:监控表空间使用情况
  • 数据文件:监控数据文件大小和增长趋势
风哥教程针对风哥教程针对风哥教程针对生产环境建议:建立完善的存储监控体系,及时发现和解决存储问题。定期分析存储使用情况,优化存储布局和配置。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 PostgreSQL目录结构

3.1.1 数据库集群目录结构

# PostgreSQL数据库集群目录结构

# 主目录
/pgsql/data/
├── PG_VERSION # PostgreSQL版本号
├── base/ # 数据库目录
│ ├── 1/ # template1数据库
│ ├── 13001/ # template0数据库
│ └── 16384/ # 用户数据库
├── global/ # 全局系统表
├── pg_commit_ts/ # 提交时间戳
├── pg_dynshmem/ # 动态共享内存
├── pg_hba.conf # 客户端认证配置
├── pg_ident.conf # 身份映射配置
├── pg_logical/ # 逻辑复制
├── pg_multixact/ # 多事务信息
├── pg_notify/ # 通知机制
├── pg_replslot/ # 复制槽
├── pg_serial/ # 序列信息
├── pg_snapshots/ # 快照信息
├── pg_stat/ # 统计信息
├── pg_stat_tmp/ # 临时统计信息
├── pg_subtrans/ # 子事务信息
├── pg_tblspc/ # 表空间链接
├── pg_twophase/ # 两阶段事务
├── pg_wal/ # WAL日志
├── pg_xact/ # 事务提交状态
├── postgresql.auto.conf # 自动配置文件
├── postgresql.conf # 主配置文件
└── postmaster.opts # 启动选项

3.1.2 数据库目录结构

# 数据库目录结构(以fgedudb为例)

/pgsql/data/base/16384/
├── 1247 # 系统表
├── 1247_fsm # 空闲空间映射
├── 1247_vm # 可见性映射
├── 16385 # 用户表
├── 16385_fsm # 空闲空间映射
├── 16385_vm # 可见性映射
└── …

# 文件命名规则
– 数字:表的OID
– _fsm:空闲空间映射文件
– _vm:可见性映射文件

3.2 PostgreSQL文件组织

3.2.1 数据文件组织

# 数据文件组织

# 表数据文件
– 每个表对应一个或多个数据文件
– 文件名:表的OID
– 文件大小:默认1GB,达到上限后会创建新文件
– 新文件命名:OID.1, OID.2, 等

# 索引文件
– 每个索引对应一个或多个文件
– 文件名:索引的OID
– 文件组织与表数据文件相同

# 空闲空间映射文件
– 文件名:OID_fsm
– 存储表的空闲空间信息
– 用于VACUUM和插入操作

# 可见性映射文件
– 文件名:OID_vm
– 存储表的可见性信息
– 用于索引扫描和VACUUM操作

3.2.2 WAL文件组织

# WAL文件组织

# WAL目录
/pgsql/data/pg_wal/
├── 000000010000000000000001 # WAL段文件
├── 000000010000000000000002 # WAL段文件
└── archive_status/ # 归档状态目录
├── 000000010000000000000001.done
└── 000000010000000000000002.done

# WAL文件特点
– 固定大小:默认16MB
– 循环使用
– 支持归档
– 用于崩溃恢复和复制

3.3 PostgreSQL表空间存储

3.3.1 表空间目录结构

# 表空间目录结构

# 表空间链接
/pgsql/data/pg_tblspc/
├── 16385 -> /pgsql/fgedutbss/fgedutbs # 表空间链接

# 表空间目录
/pgsql/fgedutbss/fgedutbs/
├── PG_18_202507211/
│ ├── 16384/ # 数据库目录
│ │ ├── 16386 # 表数据文件
│ │ ├── 16386_fsm # 空闲空间映射
│ │ └── 16386_vm # 可见性映射
│ └── …

# 表空间创建
CREATE TABLESPACE fgedutbs LOCATION ‘/pgsql/fgedutbss/fgedutbs’;

# 表空间使用
CREATE TABLE fgedu_table (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
) TABLESPACE fgedutbs;

3.3.2 表空间管理

# 表空间管理

# 查看表空间
SELECT spcname, spclocation FROM pg_fgedutbs;

# 创建表空间
CREATE TABLESPACE fgedutbs
OWNER fgedu
LOCATION ‘/pgsql/fgedutbss/fgedutbs’;

# 修改表空间
ALTER TABLESPACE fgedutbs RENAME TO fgedu_fgedutbs;

# 删除表空间
DROP TABLESPACE IF EXISTS fgedu_fgedutbs;

# 表空间权限
GRANT CREATE ON TABLESPACE fgedutbs TO fgedu;

风哥提示:表空间是PostgreSQL存储管理的重要特性,合理使用表空间可以提高存储管理的灵活性和性能。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 PostgreSQL存储实战案例

4.1.1 表空间规划实战

# 表空间规划实战

# 环境信息
– 服务器:4核8GB内存
– 存储:2块SSD(200GB),2块HDD(1TB)

# 表空间规划
1. 系统表空间:默认表空间(SSD1)
2. 用户表空间:fgedu_data(SSD2)
3. 索引表空间:fgedu_index(SSD2)
4. 临时表空间:fgedu_temp(HDD1)
5. 备份表空间:fgedu_backup(HDD2)

# 实施步骤
1. 创建表空间目录
$ mkdir -p /pgsql/fgedutbss/{fgedu_data,fgedu_index,fgedu_temp,fgedu_backup}
$ chown -R pgsql: pgsql /pgsql/fgedutbss/

2. 创建表空间
CREATE TABLESPACE fgedu_data LOCATION ‘/pgsql/fgedutbss/fgedu_data’;
CREATE TABLESPACE fgedu_index LOCATION ‘/pgsql/fgedutbss/fgedu_index’;
CREATE TABLESPACE fgedu_temp LOCATION ‘/pgsql/fgedutbss/fgedu_temp’;
CREATE TABLESPACE fgedu_backup LOCATION ‘/pgsql/fgedutbss/fgedu_backup’;

3. 设置默认表空间
ALTER USER fgedu SET default_fgedutbs = ‘fgedu_data’;

4. 创建表和索引
CREATE TABLE fgedu_customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
) TABLESPACE fgedu_data;

CREATE INDEX idx_fgedu_customers_email
ON fgedu_customers(email)
TABLESPACE fgedu_index;

4.2 PostgreSQL存储工具使用

4.2.1 使用pg_controldata查看控制文件信息

# 使用pg_controldata查看控制文件信息

$ pg_controldata /pgsql/data

pg_control version number: 1300
Catalog version number: 202507211
Database system identifier: 7431234567890123456
Database cluster state: in production
pg_control last modified: Fri Mar 31 10:00:00 2026
Latest checkpoint location: 123/456789
Prior checkpoint location: 122/345678
Latest checkpoint’s REDO location: 123/456789
Latest checkpoint’s REDO WAL file: 000000010000001230000045
Latest checkpoint’s TimeLineID: 1
Latest checkpoint’s PrevTimeLineID: 1
Latest checkpoint’s full_page_writes: on
Latest checkpoint’s NextXID: 0:123456
Latest checkpoint’s NextOID: 16385
Latest checkpoint’s NextMultiXactId: 1
Latest checkpoint’s NextMultiOffset: 0
Latest checkpoint’s oldestXID: 100000
Latest checkpoint’s oldestXID’s DB: 1
Latest checkpoint’s oldestActiveXID: 123456
Latest checkpoint’s oldestMultiXid: 1
Latest checkpoint’s oldestMulti’s DB: 1
Latest checkpoint’s oldestCommitTsXid:0
Latest checkpoint’s newestCommitTsXid:0
Time of latest checkpoint: Fri Mar 31 10:00:00 2026
Fake LSN counter for unlogged rels: 0/1
Minimum recovery ending location: 0/0
Min recovery ending loc’s timeline: 0
Backup start location: 0/0
Backup end location: 0/0
End-of-backup record required: no
wal_level setting: replica
wal_log_hints setting: off
max_connections setting: 100
max_worker_processes setting: 8
max_wal_senders setting: 10
max_prepared_xacts setting: 0
max_locks_per_xact setting: 64
track_commit_timestamp setting: off
Maximum data alignment: 8
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 64
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 1996
Size of a large-object chunk: 2048
Date/time type storage: 64-bit integers
Float4 argument passing: by value
Float8 argument passing: by value
Data page checksum version: 0
Mock authentication nonce: 000000000000000000000000000000000000000000000000

4.3 PostgreSQL存储常见问题

PostgreSQL存储常见问题及解决方法:

# 常见问题1:磁盘空间不足

# 错误信息
ERROR: could not write to file “base/16384/16385”: No space left on device

# 解决方法
– 清理无用数据
– 增加磁盘空间
– 移动表到其他表空间
– 启用自动清理

# 常见问题2:表空间权限问题

# 错误信息
ERROR: permission denied for fgedutbs fgedutbs

# 解决方法
– 授予表空间权限
GRANT CREATE ON TABLESPACE fgedutbs TO fgedu;

# 常见问题3:WAL文件堆积

# 错误现象
pg_wal目录文件数量过多

# 解决方法
– 检查归档配置
– 检查复制状态
– 配置合适的max_wal_size
– 手动清理WAL文件(谨慎操作)

风哥教程针对风哥教程针对风哥教程针对生产环境建议:定期监控存储使用情况,及时发现和解决存储问题。建立存储管理规范,合理规划表空间和存储布局。from PostgreSQL视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 PostgreSQL存储最佳实践

PostgreSQL存储最佳实践:

  • 存储硬件选择:使用SSD存储提高性能
  • RAID配置:使用RAID 10提高可靠性和性能
  • 文件系统选择:使用XFS或ext4文件系统
  • 表空间规划:根据数据类型和访问模式合理规划表空间
  • 存储监控:建立完善的存储监控体系
  • 定期维护:执行VACUUM和ANALYZE操作
  • 备份策略:建立完善的备份策略
  • 性能优化:根据存储类型调整参数
风哥提示:存储是PostgreSQL性能的关键因素之一,合理的存储规划和优化可以显著提高数据库性能。建议根据业务需求和硬件条件,制定合适的存储策略。

5.2 PostgreSQL存储检查清单

# 存储检查清单
– [ ] 磁盘空间使用率是否在合理范围(<80%) - [ ] I/O性能是否满足要求 - [ ] 表空间布局是否合理 - [ ] WAL文件是否正常归档 - [ ] 数据文件是否有异常增长 - [ ] 索引是否合理分布 - [ ] 临时表空间是否足够大 - [ ] 备份空间是否充足 # 存储维护清单 - [ ] 定期执行VACUUM ANALYZE - [ ] 定期检查表碎片 - [ ] 定期检查索引使用情况 - [ ] 定期备份数据库 - [ ] 定期监控存储性能 - [ ] 定期清理无用数据

5.3 PostgreSQL存储工具推荐

PostgreSQL存储工具推荐:

  • pg_controldata:查看控制文件信息
  • pg_size_pretty:查看对象大小
  • pg_stat_file:查看文件信息
  • df:查看磁盘空间使用情况
  • iostat:查看I/O性能
  • iotop:查看进程I/O使用情况
  • lsof:查看文件打开情况
  • du:查看目录大小
持续改进:存储技术在不断发展,新的存储设备和技术不断涌现。建议关注存储技术的发展,及时更新存储策略,提高数据库性能和可靠性。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息