表空间
最大的逻辑存储单位是表空间,数据库中创建的对象都保存在表空间
中 ,例如表、索引和整个数据库都可以被分配到特定的表空间 。 在创建数据库对象时,可以指定数据库对象的表空间,如果不指定则使用默认表空间,也就是数据库对象的文件的位置。 初始化数据库目录时会自动创建 pg_default 和 pg_global 两个表空间 。
postgres=# \db
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
pg_global 表空间的物理文件位置在数据目录的 global 目录中,它用来保存系统表 。
pg_default 表空间的物理文件位 置在数据目录中的 base 目录,是 template0 和template1 数据库的默认表空间,创建数据库时,默认从 template1数据库进行克隆,因此除非特别指定了新建数据库的表空 间 ,默认使用template1的表空间 , 也就是 pg_default。
除 了两个默认表空 间 , 用户还可以创建自定义表空间 。 使用自定义表空 间有两个典型的场景 :
通过创建表空间解决已有表空间磁盘不足并无法逻辑扩展的 问题 ;
将索引、 WAL 、数据文件分配在性能不同的磁盘上,使硬件利用率和性能最大化 。
由于现在固态存储已经很普遍,这种文件布局方式反倒会增加维护成本 。
要创建一个表空间,先用操作系统的 postgres 用户创建一个目录,然后连接到数据库,使用 CREATE TABLESPACE 命令创建表空间,如下所示:
[postgres@localhost data]$ mkdir -p /usr/local/pgsql/data/mytblspc
[postgres@localhost data]$ psql
psql (14.5)
Type "help" for help.
postgres=# create tablespace myspc location '/usr/local/pgsql/data/mytblspc';
WARNING: tablespace location should not be inside the data directory
CREATE TABLESPACE
postgres=# \db
List of tablespaces
Name | Owner | Location
------------+----------+--------------------------------
myspc | postgres | /usr/local/pgsql/data/mytblspc
pg_default | postgres |
pg_global | postgres |
(3 rows)
创建新的数据库或表时,可以指定创建的表空 间
create table t(id serial primary key,ival int) tablespace myspc;
由于表空间定义了存储的位置 ,在创建数据库对象时,会在当前的表空 间 目录创建一个以数据库 OID 命名的目录,该数据库的所有对象将保存在这个目录中,除非单独指定表空 间 。
postgres=# select oid,datname from pg_database where datname='postgres';
oid | datname
-------+----------
13892 | postgres
(1 row)
[postgres@localhost data]$ ll $PGDATA/base/13892
total 1723404
-rw-------. 1 postgres postgres 8192 Oct 21 22:35 112
-rw-------. 1 postgres postgres 8192 Oct 21 22:35 113
-rw-------. 1 postgres postgres 122880 Oct 24 20:18 1247
-rw-------. 1 postgres postgres 24576 Oct 21 23:32 1247_fsm
[postgres@localhost data]$ ll $PGDATA/mytblspc/PG_14_202107181/13892
total 0
-rw-------. 1 postgres postgres 0 Oct 24 20:16 24639
通过以上查询可知 postgres 的 OID 为13892 ,postgres 的表、索引都会保存
在 $PGDATA/base/13892 这个目录中
原文链接:https://blog.csdn.net/qq961573863/article/details/127482874




