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

MogDB基础系列--表空间管理

由迪 2024-02-05
222

原作者:杨有田

​ 表空间,在文件系统中定义用来存放表示数据库对象的文件的位置,简单来说,一个表空间在操作系统上对应一个目录(没有指向具体的真正的数据文件),用来存放数据库对象。数据库初始化,自动创建两个默认表空间,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里面。

  1. 查看表空间信息

两种方式查看表空间信息,分别使用元命令(\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=# 
  1. 创建表空间

​ 详细的表空间创建命令选项可以通过元命令\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
 
  1. 删除表空间

用户必须是表空间的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=# 
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论