好的,阿杰,我们来系统梳理一下 PostgreSQL 的表空间(Tablespace),包括概念、用途、管理方法和实践操作。
🧩 PostgreSQL 表空间详解
一、概念
- 表空间(Tablespace) 是 PostgreSQL 用来 管理数据库对象存储位置 的逻辑抽象。
- 简单理解:
- 默认情况下,所有数据库对象(表、索引等)存放在 默认表空间 pg_default
- 通过创建自定义表空间,可以将不同数据库对象存储在不同磁盘或目录上
二、表空间的作用
- 分散 I/O 压力
- 将大表、索引放到不同磁盘,提高读写性能
- 灵活存储管理
- 不同表空间可以位于不同文件系统或磁盘分区
- 支持大数据存储
- 避免单个磁盘空间不足
- 备份与迁移方便
- 可以单独备份或迁移表空间
三、默认表空间
表空间名 | 说明 |
---|---|
pg_default | 默认表空间,普通表和索引默认存储位置 |
pg_global | 存储全局对象,例如全局序列(Global Sequence) |
自定义表空间 | 用户创建的表空间,可以指定目录 |
四、表空间的目录结构
- 表空间对应操作系统目录:
- Linux 示例:
/var/lib/pgsql/15/data/base/ # pg_default /pgdata/tablespace/myspace/ # 自定义表空间
- Linux 示例:
- PostgreSQL 内部通过 OID 关联数据库对象和表空间目录
五、创建表空间
-- 创建一个表空间
CREATE TABLESPACE fastspace
OWNER postgres
LOCATION '/mnt/fastdisk/pgsql_tablespace';
说明:
OWNER
→ 表空间所有者LOCATION
→ 操作系统目录路径(必须 PostgreSQL 服务器进程有读写权限)- 注意:目录必须为空且 PostgreSQL 用户可访问
六、创建对象指定表空间
1️⃣ 创建表时指定表空间
CREATE TABLE big_table (
id SERIAL PRIMARY KEY,
data TEXT
) TABLESPACE fastspace;
2️⃣ 创建索引时指定表空间
CREATE INDEX idx_big_table_data
ON big_table(data)
TABLESPACE fastspace;
如果不指定,表或索引将使用 pg_default
七、查看表空间
-- 查看所有表空间
\dT+ -- 查看类型信息
\db -- 查看表空间
SELECT spcname, pg_tablespace_location(oid) AS location
FROM pg_tablespace;
输出示例:
spcname | location |
---|---|
pg_default | |
pg_global | |
fastspace | /mnt/fastdisk/pgsql_tablespace |
八、修改表空间
- 移动表到新表空间:
-- 移动表
ALTER TABLE big_table SET TABLESPACE fastspace;
-- 移动索引
ALTER INDEX idx_big_table_data SET TABLESPACE fastspace;
注意:
- 移动表或索引会在后台复制数据 → 大表操作耗时较长
- 不能移动系统表
九、删除表空间
DROP TABLESPACE fastspace;
注意:
- 表空间内必须没有对象
- 否则会报错
十、实践建议
- 大表或高 I/O 表放到单独磁盘的表空间
- 索引可以放到不同表空间,提高查询性能
- 系统表默认使用 pg_default,不要随意移动
- 定期监控表空间使用情况:
SELECT tablespace, pg_size_pretty(pg_tablespace_size(oid)) AS size
FROM pg_tablespace;
总结
- 表空间 = 数据库对象的存储位置抽象
- 默认表空间:
pg_default
和pg_global
- 可以创建自定义表空间,提高性能和存储灵活性
- 可以单独为表或索引指定表空间,也可以移动已有对象
发表回复