暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgresql逻辑结构之表空间(三)

原创 江湖小虾米 2024-01-21
218

表空间是物理上存储数据的地方,在操作系统表现上就是一个目录。可以有多个表空间。一个数据库的对象可以存放于多个表空间,一个表空间也可以存放多个数据库的对象。

  1. 系统默认的表空间
    每个数据库都有一个表空间,如果未明确指定,默认为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)
  1. 用户自定义表空间
    用户自定义的表空间可以位于任何目录,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论