表空间是物理上存储数据的地方,在操作系统表现上就是一个目录。可以有多个表空间。一个数据库的对象可以存放于多个表空间,一个表空间也可以存放多个数据库的对象。
- 系统默认的表空间
每个数据库都有一个表空间,如果未明确指定,默认为pg_default,对应于操作系统上的PGDATA/base目录。pg_global表空间用于存放系统目录中全局对象,全局对象不属于任何一个数据库,属于整个集群,例如pg_database,对应操作系统上的global目录。
[postgres@pg14-7 data]$ ls base global pg_dynshmem pg_ident.conf pg_multixact pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION pg_xact postgresql.conf postmaster.pid current_logfiles pg_commit_ts pg_hba.conf pg_logical pg_notify pg_serial pg_stat pg_subtrans pg_twophase pg_wal postgresql.auto.conf postmaster.opts
查询系统中的表空间
mydb=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------+----------+----------------------+-------------------+---------+---------+-------------
myqtbs | myq | /var/postgres/myqtbs | | | 0 bytes |
pg_default | postgres | | | | 42 MB |
pg_global | postgres | | | | 560 kB |
(3 rows)
mydb=# select oid,spcname from pg_tablespace;
oid | spcname
-------+------------
1663 | pg_default
1664 | pg_global
24587 | myqtbs
(3 rows)
- 用户自定义表空间
用户自定义的表空间可以位于任何目录,postgresql会在PGDATA/pg_tblspc创建一个软链接指向表空间目录。
创建一个表空间
mydb=# create tablespace myqtbs owner myq location '/var/postgres/myqtbs';
#表空间的所在的目录必须提前创建好,否则会报路径不存在错误,且目录属主必须为运行pg的用户
mydb=# create tablespace myqtbs owner myq location '/var/postgres/myqtbs';
ERROR: directory "/var/postgres/myqtbs" does not exist
#创建目录后再次创建表空间
[postgres@pg14-7 postgres]$ mkdir myqtbs
[postgres@pg14-7 postgres]$ ls
data logs myqtbs
mydb=# create tablespace myqtbs owner myq location '/var/postgres/myqtbs';
CREATE TABLESPACE
mydb=# \db+
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------+----------+----------------------+-------------------+---------+---------+-------------
myqtbs | myq | /var/postgres/myqtbs | | | 0 bytes |
pg_default | postgres | | | | 42 MB |
pg_global | postgres | | | | 560 kB |
(3 rows)
pg所有的数据文件的入口为PGDATA目录,因此自定义的表空间会自动在PGDATA/pg_tblspc创建一个软链接指向表空间目录。
[postgres@pg14-7 postgres]$ ll $PGDATA/pg_tblspc total 0 lrwxrwxrwx 1 postgres postgres 20 Jan 21 20:56 24625 -> /var/postgres/myqtbs
24625为表空间的OID,及对象标识符。操作系统上并非是以对象名创建目录,而是以对象的OID为目录名。
mydb=# select * from pg_tablespace where spcname='myqtbs';
oid | spcname | spcowner | spcacl | spcoptions
-------+---------+----------+--------+------------
24625 | myqtbs | 16384 | |
(1 row)
#也可以通过内置函数查询表空间在操作系统上的路径
mydb=# select spcname,pg_tablespace_location(oid) from pg_tablespace where spcname='myqtbs';
spcname | pg_tablespace_location
---------+------------------------
myqtbs | /var/postgres/myqtbs
(1 row)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




