原作者:杨有田
表空间,在文件系统中定义用来存放表示数据库对象的文件的位置,简单来说,一个表空间在操作系统上对应一个目录(没有指向具体的真正的数据文件),用来存放数据库对象。数据库初始化,自动创建两个默认表空间,pg_global和pg_default,对应的OID分别为1664和1663(具体每个版本或者环境不一样),所有数据库默认表空间为pg_default。
MogDB=# select oid,spcname,spcowner from pg_tablespace;
oid | spcname | spcowner
------±-----------±---------
1663 | pg_default | 10
1664 | pg_global | 10
MogDB=# select oid,datname,datdba,dattablespace from pg_database;
oid | datname | datdba | dattablespace
-------±----------±-------±--------------
1 | template1 | 10 | 1663
16384 | leo | 10 | 1663
15935 | template0 | 10 | 1663
15940 | postgres | 10 | 1663
其中,pg_global表空间用于共享系统目录,对象存放在data目录下面的global(eg:/opt/mogdb/install/data/dn/global);pg_default表空间是数据库postgres、template1和template0的默认表空间,因此也将是所有其他数据库的默认表空间,除非被一个CREATE DATABASE中的TABLESPACE子句覆盖,对象存放在DATA目录下面的base文件夹(eg:/opt/mogdb/install/data/dn/base),而该文件夹base下面OID对应每个数据库。
[root@mogdb01 base]# ls
1 15935 15940 16384 pgsql_tmp
用户自定义的表空间,默认DATA目录下的pg_tblspc(eg:/opt/mogdb/install/data/dn/pg_tblspc),包含指向表空间的符号连接。如果使用相对路径创建表空间,实际的存储位置为DATA目录下的pg_location里面。
- 查看表空间信息
两种方式查看表空间信息,分别使用元命令(\db)和视图(pg_tablespace)。
MogDB=# \db
List of tablespaces
Name | Owner | Location
------------+-------+----------
pg_default | omm |
pg_global | omm |
(2 rows)
MogDB=# select oid,spcname,spcowner from pg_tablespace;
oid | spcname | spcowner
------+------------+----------
1663 | pg_default | 10
1664 | pg_global | 10
(2 rows)
每个表空间当前使用大小可以通过函数(pg_tablespace_size),也就是磁盘挂载的目录大小。
MogDB=# select pg_tablespace_size('pg_global');
pg_tablespace_size
--------------------
537962789
(1 row)
MogDB=# select pg_tablespace_size('pg_default');
pg_tablespace_size
--------------------
53296000
(1 row)
MogDB=#
- 创建表空间
详细的表空间创建命令选项可以通过元命令\h create tablespace查看。
MogDB=# \h create tablespace
Command: CREATE TABLESPACE
Description: define a new tablespace
Syntax:
CREATE TABLESPACE tablespace_name
[ OWNER user_name ] [ RELATIVE ] LOCATION 'directory' [ MAXSIZE 'space_size' ]
[with_option_clause];
where option_clause can be:
WITH ( filesystem= { 'systemtype '| " systemtype " | systemtype }
[ { , address = { ' ip:port [ , ... ] ' | " ip:port [ , ... ] "} } ]
, cfgpath = { 'path '| " path " } ,storepath = { 'rootpath '| " rootpath "}
[{, random_page_cost = { 'value '| " value " | value }}]
[{,seq_page_cost = { 'value '| " value " | value }}])
每个表空间对应一个目录,创建表空间的时候可以指定相对路径或者绝对路径。
如果使用绝对路径,需要提前确保表空间对应目录的上级目录存在,且有读写权限,否则创建失败,例如
MogDB=# create tablespace tsd_leo01 location '/opt/huawei/data/master1/tsd_leo01';
ERROR: could not create tablespace directory "/opt/huawei/data/master1/tsd_leo01": Permission denied
MogDB=# \q
[omm@mogdb01 base]$ cd /opt/
[omm@mogdb01 opt]$ ls
mogdb rh software VBoxGuestAdditions-6.1.14
[omm@mogdb01 mogdb]$ mkdir data
[omm@mogdb01 mogdb]$ cd data/
[omm@mogdb01 data]$ pwd
/opt/mogdb/data
[omm@mogdb01 data]$ g
gsql ((MogDB 3.0.4 build cc068866) compiled at 2023-03-03 17:47:05 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type “help” for help.
MogDB=# create tablespace tsd_leo01 location ‘/opt/mogdb/data/tsd_leo01’;
CREATE TABLESPACE
MogDB=# \q
[omm@mogdb01 data]$ cd /opt/mogdb/install/data/dn/pg_tblspc/
[omm@mogdb01 pg_tblspc]$ ls -l
total 0
lrwxrwxrwx 1 omm dbgrp 25 Apr 23 17:35 16389 -> /opt/mogdb/data/tsd_leo01
[omm@mogdb01 pg_tblspc]$
执行创建表空间命令,指定相对路径,数据库在pg_tblspc里面创建目录链接文件,指向pg_location文件夹,实际生产环境建议使用绝对路径。
MogDB=# create tablespace tsd_leo02 relative location 'tsd_leo02';
CREATE TABLESPACE
MogDB=# \q
[omm@mogdb01 pg_tblspc]$ ll
total 0
lrwxrwxrwx 1 omm dbgrp 25 Apr 23 17:35 16389 -> /opt/mogdb/data/tsd_leo01
lrwxrwxrwx 1 omm dbgrp 48 Apr 23 17:38 16390 -> /opt/mogdb/install/data/dn/pg_location/tsd_leo02
- 删除表空间
用户必须是表空间的owner或者系统管理员才能删除表空间,但是上层目录需要手动清理。
MogDB=# \h drop tablespace
MogDB=# \h drop tablespace
Command: DROP TABLESPACE
Description: remove a tablespace
Syntax:
DROP TABLESPACE [ IF EXISTS ] tablespace_name;
MogDB=# \db
List of tablespaces
Name | Owner | Location
------------+-------+---------------------------
pg_default | omm |
pg_global | omm |
tsd_leo01 | omm | /opt/mogdb/data/tsd_leo01
tsd_leo02 | omm | tsd_leo02
(4 rows)
MogDB=# drop tablespace tsd_leo02;
DROP TABLESPACE
MogDB=# \q
[omm@mogdb01 PG_9.2_201611171_dn_6001_6002]$ cd ..
[omm@mogdb01 tsd_leo02]$ ls
[omm@mogdb01 tsd_leo02]$ pwd
/opt/mogdb/install/data/dn/pg_location/tsd_leo02
[omm@mogdb01 tsd_leo02]$ 如果表空间存在对象,删除表空间报错:MogDB=# create table t(i number) tablespace tsd_leo02;CREATE TABLEMogDB=# insert into t values(1);INSERT 0 1MogDB=# commit;WARNING: there is no transaction in progressCOMMITMogDB=# drop tablespace tsd_leo02;ERROR: tablespace "tsd_leo02" is not emptyMogDB=#




