PostgreSQL教程FG072-PG表空间:规划与存储优化
本文档风哥主要介绍PostgreSQL表空间的规划与存储优化,包括表空间的基础概念、生产环境规划、实施方案、实战案例和经验总结。风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL表空间的概念
PostgreSQL表空间是数据存储的物理位置,用于管理数据库对象的存储位置。表空间允许将不同的数据库对象存储在不同的磁盘或存储设备上,从而优化存储和性能。更多视频教程www.fgedu.net.cn
- 表空间是物理存储位置的抽象
- 每个表空间对应一个文件系统目录
- 数据库对象(表、索引等)可以存储在指定的表空间
- 表空间提供了存储管理的灵活性
- 表空间可以跨文件系统和存储设备
1.2 PostgreSQL表空间的类型
PostgreSQL表空间主要分为以下类型:
– pg_default:默认表空间,存储用户创建的数据库对象
– pg_global:全局表空间,存储系统共享的系统表
– 用户自定义表空间:根据业务需求创建的表空间
# 表空间用途分类
– 数据文件表空间:存储表数据
– 索引表空间:存储索引数据
– 临时表空间:存储临时数据
– 日志表空间:存储WAL日志(可选)
– 备份表空间:存储备份数据(可选)
1.3 PostgreSQL表空间的优势
PostgreSQL表空间的主要优势:
学习交流加群风哥微信: itpux-com
- 存储优化:可以根据数据类型和访问模式选择合适的存储设备
- 性能提升:将频繁访问的数据存储在高速存储设备上
- 管理灵活性:可以根据业务需求调整存储布局
- 容量管理:可以在不同存储设备之间分配空间
- 隔离性:不同业务的数据可以存储在不同的表空间
- 备份策略:可以针对不同表空间制定不同的备份策略
Part02-生产环境规划与建议
2.1 PostgreSQL表空间规划
PostgreSQL表空间规划要点:
– 小型系统:1-3个表空间
– 中型系统:3-6个表空间
– 大型系统:6+个表空间
# 表空间命名规范
– 数据文件表空间:data_业务模块
– 索引表空间:index_业务模块
– 临时表空间:temp_实例名
– 日志表空间:log_实例名
– 备份表空间:backup_实例名
# 表空间用途规划
– 系统表空间:使用默认表空间
– 核心业务数据:使用高速存储
– 历史数据:使用大容量存储
– 索引:使用高速存储
– 临时数据:使用高速存储
# 表空间大小规划
– 预估数据量和增长趋势
– 预留足够的存储空间(建议预留30%以上)
– 定期监控表空间使用情况
2.2 存储设备规划
存储设备规划要点:
– SSD:用于频繁访问的数据和索引
– NVMe:用于极高性能要求的场景
– HDD:用于大容量、低访问频率的数据
– SAN:用于企业级存储需求
– NAS:用于备份和归档数据
# 存储设备分配
– 系统表空间:SSD
– 数据文件表空间:根据访问频率选择SSD或HDD
– 索引表空间:SSD
– 临时表空间:SSD
– 日志表空间:SSD
– 备份表空间:HDD或NAS
# 存储RAID级别
– 系统表空间:RAID 10
– 数据文件表空间:RAID 10或RAID 5
– 索引表空间:RAID 10
– 临时表空间:RAID 0或RAID 10
– 日志表空间:RAID 10
– 备份表空间:RAID 5或RAID 6
2.3 性能优化规划
性能优化规划要点:
– 分散I/O负载:将不同表空间分布在不同的存储设备
– 避免I/O竞争:将读写频繁的表空间分离
– 优化存储参数:根据存储设备类型调整参数
# 表空间布局优化
– 表和索引分离:将表和索引存储在不同的表空间
– 热数据和冷数据分离:将频繁访问的数据存储在高速存储
– 临时数据单独存储:将临时表空间存储在高速存储
# 备份策略优化
– 差异备份:针对不同表空间制定不同的备份策略
– 增量备份:减少备份时间和存储空间
– 备份验证:定期验证备份的有效性
Part03-生产环境项目实施方案
3.1 PostgreSQL表空间创建
3.1.1 创建表空间目录
$ mkdir -p /postgresql/fgedutbss/data_business
$ mkdir -p /postgresql/fgedutbss/index_business
$ mkdir -p /postgresql/fgedutbss/temp_business
$ mkdir -p /postgresql/fgedutbss/log_business
$ mkdir -p /postgresql/fgedutbss/backup_business
# 设置目录权限
$ chown -R pgsql: pgsql /postgresql/fgedutbss/
$ chmod -R 700 /postgresql/fgedutbss/
# 验证目录创建
$ ls -la /postgresql/fgedutbss/
total 30
drwx——. 7 pgsql pgsql 4096 Apr 2 10:00 .
drwxr-xr-x. 3 pgsql pgsql 4096 Apr 2 09:00 ..
drwx——. 2 pgsql pgsql 4096 Apr 2 10:00 backup_business
drwx——. 2 pgsql pgsql 4096 Apr 2 10:00 data_business
drwx——. 2 pgsql pgsql 4096 Apr 2 10:00 index_business
drwx——. 2 pgsql pgsql 4096 Apr 2 10:00 log_business
drwx——. 2 pgsql pgsql 4096 Apr 2 10:00 temp_business
3.1.2 创建表空间
$ psql -U pgsql
# 创建数据文件表空间
postgres=# CREATE TABLESPACE data_business
postgres-# OWNER pgsql postgres-# LOCATION ‘/postgresql/fgedutbss/data_business’;
CREATE TABLESPACE
# 创建索引表空间
postgres=# CREATE TABLESPACE index_business
postgres-# OWNER pgsql postgres-# LOCATION ‘/postgresql/fgedutbss/index_business’;
CREATE TABLESPACE
# 创建临时表空间
postgres=# CREATE TABLESPACE temp_business
postgres-# OWNER pgsql postgres-# LOCATION ‘/postgresql/fgedutbss/temp_business’;
CREATE TABLESPACE
# 查看表空间
postgres=# \db
List of fgedutbss
Name | Owner | Location
—————–+———-+———————————-
backup_business | pgsql | /postgresql/fgedutbss/backup_business
data_business | pgsql | /postgresql/fgedutbss/data_business
index_business | pgsql | /postgresql/fgedutbss/index_business
pg_default | pgsql |
pg_global | pgsql |
temp_business | pgsql | /postgresql/fgedutbss/temp_business
(6 rows)
3.2 PostgreSQL表空间管理
3.2.1 修改表空间
postgres=# ALTER TABLESPACE data_business OWNER TO postgres;
ALTER TABLESPACE
# 修改临时表空间参数
postgres=# ALTER SYSTEM SET temp_fgedutbss = ‘temp_business’;
ALTER SYSTEM
# 重新加载配置
postgres=# SELECT pg_reload_conf();
pg_reload_conf
—————-
t
(1 row)
# 查看临时表空间配置
postgres=# SHOW temp_fgedutbss;
temp_fgedutbss
——————
temp_business
(1 row)
3.2.2 监控表空间使用情况
postgres=# SELECT
postgres-# spcname AS fgedutbs_name,
postgres-# pg_size_pretty(pg_fgedutbs_size(spcname)) AS size
postgres-# FROM pg_fgedutbs;
fgedutbs_name | size
—————–+———
pg_default | 8192 kB
pg_global | 4096 kB
data_business | 0 bytes
index_business | 0 bytes
temp_business | 0 bytes
(5 rows)
# 查看表空间使用情况(详细)
postgres=# SELECT
postgres-# schemaname,
postgres-# tablename,
postgres-# fgedutbs,
postgres-# pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size,
postgres-# pg_size_pretty(pg_table_size(c.oid)) AS table_size,
postgres-# pg_size_pretty(pg_indexes_size(c.oid)) AS index_size
postgres-# FROM pg_class c
postgres-# JOIN pg_namespace n ON n.oid = c.relnamespace
postgres-# WHERE c.relkind = ‘r’ AND n.nspname NOT IN (‘pg_catalog’, ‘information_schema’)
postgres-# ORDER BY pg_total_relation_size(c.oid) DESC;
schemaname | tablename | fgedutbs | total_size | table_size | index_size
————+———–+————+————+————+————
(0 rows)
3.3 存储优化实施
3.3.1 在指定表空间创建表和索引
postgres=# \c fgedu_business
You are now connected to fgedudb “fgedu_business” as fgedu “postgres”.
# 在数据文件表空间创建表
fgedu_business=# CREATE TABLE fgedu_orders (
fgedu_business(# id SERIAL PRIMARY KEY,
fgedu_business(# customer_id INTEGER NOT NULL,
fgedu_business(# order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
fgedu_business(# total_amount DECIMAL(10,2) NOT NULL,
fgedu_business(# status VARCHAR(50) NOT NULL
fgedu_business(# ) TABLESPACE data_business;
CREATE TABLE fgedu_# 在索引表空间创建索引
fgedu_business=# CREATE INDEX idx_fgedu_orders_customer_id
fgedu_business-# ON fgedu_orders(customer_id)
fgedu_business-# TABLESPACE index_business;
CREATE INDEX
# 查看表和索引的表空间
fgedu_business=# \d+ fgedu_orders
Table “public.fgedu_orders”
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
————-+—————————–+———–+———-+————————————+———-+————–+————-
id | integer | | not null | nextval(‘fgedu_orders_id_seq’::regclass) | plain | |
customer_id | integer | | not null | | plain | |
order_date | timestamp without time zone | | | CURRENT_TIMESTAMP | plain | |
total_amount | decimal(10,2) | | not null | | plain | |
status | character varying(50) | | not null | | extended | |
Indexes:
“fgedu_orders_pkey” PRIMARY KEY, btree (id) TABLESPACE index_business
“idx_fgedu_orders_customer_id” btree (customer_id) TABLESPACE index_business
# 插入测试数据
fgedu_business=# INSERT INTO fgedu_orders (customer_id, total_amount, status) VALUES
fgedu_business-# (1, 100.50, ‘completed’),
fgedu_business-# (2, 200.75, ‘pending’),
fgedu_business-# (3, 50.25, ‘completed’),
fgedu_business-# (1, 150.00, ‘completed’),
fgedu_business-# (2, 75.50, ‘pending’);
INSERT 0 5
# 验证数据
fgedu_business=# SELECT * FROM fgedu_orders;
id | customer_id | order_date | total_amount | status
—-+————-+—————————-+————–+———–
1 | 1 | 2026-04-02 10:00:00.000000 | 100.50 | completed
2 | 2 | 2026-04-02 10:00:00.000000 | 200.75 | pending
3 | 3 | 2026-04-02 10:00:00.000000 | 50.25 | completed
4 | 1 | 2026-04-02 10:00:00.000000 | 150.00 | completed
5 | 2 | 2026-04-02 10:00:00.000000 | 75.50 | pending
(5 rows)
3.3.2 表空间迁移
postgres=# CREATE TABLESPACE data_business_new
postgres-# OWNER pgsql postgres-# LOCATION ‘/postgresql/fgedutbss/data_business_new’;
CREATE TABLESPACE
# 移动表到新表空间
fgedu_business=# ALTER TABLE fgedu_orders SET TABLESPACE data_business_new;
ALTER TABLE
# 移动索引到新表空间
fgedu_business=# ALTER INDEX idx_fgedu_orders_customer_id SET TABLESPACE index_business;
ALTER INDEX
# 查看表和索引的表空间
fgedu_business=# \d+ fgedu_orders
Table “public.fgedu_orders”
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
————-+—————————–+———–+———-+————————————+———-+————–+————-
id | integer | | not null | nextval(‘fgedu_orders_id_seq’::regclass) | plain | |
customer_id | integer | | not null | | plain | |
order_date | timestamp without time zone | | | CURRENT_TIMESTAMP | plain | |
total_amount | decimal(10,2) | | not null | | plain | |
status | character varying(50) | | not null | | extended | |
Indexes:
“fgedu_orders_pkey” PRIMARY KEY, btree (id) TABLESPACE index_business
“idx_fgedu_orders_customer_id” btree (customer_id) TABLESPACE index_business
Table space: “data_business_new”
Part04-生产案例与实战讲解
4.1 高性能表空间配置案例
4.1.1 案例:为高频交易系统配置表空间
# 1. 创建高速表空间(使用NVMe存储)
$ mkdir -p /nvme/fgedutbss/data_trade
$ mkdir -p /nvme/fgedutbss/index_trade
$ chown -R pgsql: pgsql /nvme/fgedutbss/
# 2. 创建表空间
postgres=# CREATE TABLESPACE data_trade
postgres-# OWNER pgsql postgres-# LOCATION ‘/nvme/fgedutbss/data_trade’;
CREATE TABLESPACE
postgres=# CREATE TABLESPACE index_trade
postgres-# OWNER pgsql postgres-# LOCATION ‘/nvme/fgedutbss/index_trade’;
CREATE TABLESPACE
# 3. 创建交易表
postgres=# CREATE TABLE fgedu_trades (
postgres(# id SERIAL PRIMARY KEY,
postgres(# trade_id VARCHAR(50) UNIQUE NOT NULL,
postgres(# symbol VARCHAR(10) NOT NULL,
postgres(# price DECIMAL(10,2) NOT NULL,
postgres(# quantity INTEGER NOT NULL,
postgres(# trade_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
postgres(# status VARCHAR(20) NOT NULL
postgres(# ) TABLESPACE data_trade;
CREATE TABLE fgedu_# 4. 创建高频访问索引
postgres=# CREATE INDEX idx_fgedu_trades_trade_time
postgres-# ON fgedu_trades(trade_time)
postgres-# TABLESPACE index_trade;
CREATE INDEX
postgres=# CREATE INDEX idx_fgedu_trades_symbol
postgres-# ON fgedu_trades(symbol)
postgres-# TABLESPACE index_trade;
CREATE INDEX
# 5. 优化存储参数
postgres=# ALTER TABLE fgedu_trades SET (fillfactor = 90);
ALTER TABLE
4.2 存储分层案例
4.2.1 案例:为电商系统配置存储分层
# 1. 创建不同存储层级的表空间
# 热数据(SSD)
$ mkdir -p /ssd/fgedutbss/data_hot
$ mkdir -p /ssd/fgedutbss/index_hot
# 温数据(SAS)
$ mkdir -p /sas/fgedutbss/data_warm
# 冷数据(HDD)
$ mkdir -p /hdd/fgedutbss/data_cold
$ chown -R pgsql: pgsql /ssd/fgedutbss/
$ chown -R pgsql: pgsql /sas/fgedutbss/
$ chown -R pgsql: pgsql /hdd/fgedutbss/
# 2. 创建表空间
postgres=# CREATE TABLESPACE data_hot LOCATION ‘/ssd/fgedutbss/data_hot’;
postgres=# CREATE TABLESPACE index_hot LOCATION ‘/ssd/fgedutbss/index_hot’;
postgres=# CREATE TABLESPACE data_warm LOCATION ‘/sas/fgedutbss/data_warm’;
postgres=# CREATE TABLESPACE data_cold LOCATION ‘/hdd/fgedutbss/data_cold’;
# 3. 创建表并分配到不同表空间
# 热数据:订单表(频繁访问)
postgres=# CREATE TABLE fgedu_orders (
postgres(# id SERIAL PRIMARY KEY,
postgres(# customer_id INTEGER NOT NULL,
postgres(# order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
postgres(# total_amount DECIMAL(10,2) NOT NULL,
postgres(# status VARCHAR(50) NOT NULL
postgres(# ) TABLESPACE data_hot;
# 热数据索引
postgres=# CREATE INDEX idx_fgedu_orders_customer_id
postgres-# ON fgedu_orders(customer_id)
postgres-# TABLESPACE index_hot;
# 温数据:用户表(中等访问频率)
postgres=# CREATE TABLE fgedu_fgedus (
postgres(# id SERIAL PRIMARY KEY,
postgres(# name VARCHAR(100) NOT NULL,
postgres(# email VARCHAR(255) UNIQUE NOT NULL,
postgres(# created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
postgres(# ) TABLESPACE data_warm;
# 冷数据:历史订单表(低访问频率)
postgres=# CREATE TABLE fgedu_orders_history (
postgres(# LIKE fgedu_orders INCLUDING ALL
postgres(# ) TABLESPACE data_cold;
4.3 表空间迁移案例
4.3.1 案例:将历史数据迁移到低成本存储
# 1. 创建冷数据存储表空间
$ mkdir -p /hdd/fgedutbss/data_history
$ chown -R pgsql: pgsql /hdd/fgedutbss/
postgres=# CREATE TABLESPACE data_history LOCATION ‘/hdd/fgedutbss/data_history’;
# 2. 创建历史数据表
postgres=# CREATE TABLE fgedu_orders_history (
postgres(# LIKE fgedu_orders INCLUDING ALL
postgres(# ) TABLESPACE data_history;
# 3. 迁移3年前的数据
postgres=# INSERT INTO fgedu_orders_history
postgres-# SELECT * FROM fgedu_orders
postgres-# WHERE order_date < NOW() - INTERVAL '3 years';
# 4. 验证迁移
postgres=# SELECT COUNT(*) FROM fgedu_orders_history;
count
-------
10000
(1 row)
# 5. 删除原表中的历史数据
postgres=# DELETE FROM fgedu_orders
postgres-# WHERE order_date < NOW() - INTERVAL '3 years';
# 6. vacuum原表
postgres=# VACUUM ANALYZE fgedu_orders;
Part05-风哥经验总结与分享
5.1 PostgreSQL表空间管理最佳实践
PostgreSQL表空间管理最佳实践:
- 合理规划表空间:
- 根据数据类型和访问模式选择合适的表空间
- 将表和索引存储在不同的表空间
- 使用存储分层策略,提高存储效率
- 存储设备选择:
- 频繁访问的数据使用高速存储(SSD/NVMe)
- 大容量、低访问频率的数据使用低成本存储(HDD)
- 根据业务需求选择合适的RAID级别
- 性能优化:
- 分散I/O负载,避免I/O竞争
- 优化表空间布局,提高访问效率
- 定期监控表空间使用情况
- 管理维护:
- 定期备份表空间
- 监控表空间使用情况,及时扩容
- 定期进行表空间碎片整理
5.2 PostgreSQL表空间常见问题
PostgreSQL表空间常见问题及解决方案:
- 表空间满:监控表空间使用情况,及时扩容或清理数据
- 权限问题:确保表空间目录权限正确(postgres用户可访问)
- 性能下降:检查存储设备性能,优化表空间布局
- 迁移失败:确保目标表空间存在且权限正确,避免在业务高峰期迁移
- 备份问题:针对不同表空间制定不同的备份策略
5.3 PostgreSQL表空间管理工具推荐
PostgreSQL表空间管理常用工具:
from oracle:www.itpux.com
- psql:命令行工具,用于管理表空间
- pgAdmin4:图形化管理工具,提供直观的表空间管理界面
- PostgreSQL Control Center:企业级管理工具
- 自定义监控脚本:用于监控表空间使用情况
- 存储监控工具:监控存储设备性能和使用情况
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
