PostgreSQL教程FG209-PG数据库物理存储:文件结构与目录组织
本文档风哥主要介绍PostgreSQL数据库的物理存储结构,包括文件结构、目录组织、表空间存储等内容,风哥教程参考PostgreSQL官方文档Physical Storage内容,适合数据库管理员和开发者在学习和测试中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 PostgreSQL物理存储概念
PostgreSQL物理存储是指PostgreSQL数据库在磁盘上的存储结构,包括数据文件、日志文件、配置文件等。PostgreSQL使用文件系统来存储数据,通过目录和文件的层次结构来组织数据。
- 基于文件系统存储
- 层次化的目录结构
- 支持表空间
- 预写式日志(WAL)
- 数据文件和元数据分离
1.2 PostgreSQL存储层次结构
PostgreSQL的存储层次结构从上到下依次为:
- 数据库集群:包含多个数据库
- 数据库:包含多个模式
- 模式:包含多个表和其他数据库对象
- 表:包含多个数据页
- 数据页:最小存储单位,通常为8KB
- 行:数据记录
1.3 PostgreSQL文件类型
PostgreSQL的主要文件类型包括:
- 数据文件:存储表和索引数据
- WAL文件:预写式日志文件
- 配置文件:postgresql.conf、pg_hba.conf等
- 控制文件:存储数据库集群的元数据
- 日志文件:错误日志、查询日志等
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吞吐量、延迟等指标
- 文件系统:监控文件系统健康状态
- 表空间:监控表空间使用情况
- 数据文件:监控数据文件大小和增长趋势
Part03-生产环境项目实施方案
3.1 PostgreSQL目录结构
3.1.1 数据库集群目录结构
# 主目录
/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 数据库目录结构
/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目录
/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;
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 /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存储常见问题及解决方法:
# 错误信息
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文件(谨慎操作)
Part05-风哥经验总结与分享
5.1 PostgreSQL存储最佳实践
PostgreSQL存储最佳实践:
- 存储硬件选择:使用SSD存储提高性能
- RAID配置:使用RAID 10提高可靠性和性能
- 文件系统选择:使用XFS或ext4文件系统
- 表空间规划:根据数据类型和访问模式合理规划表空间
- 存储监控:建立完善的存储监控体系
- 定期维护:执行VACUUM和ANALYZE操作
- 备份策略:建立完善的备份策略
- 性能优化:根据存储类型调整参数
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
