版本:latest

表空间管理

表空间(TABLESPACE)是数据库中用于管理物理存储空间的逻辑容器。它是数据库对象与磁盘文件之间的桥梁。OGRAC的表空间由一个或者多个数据文件组成,一个数据文件专属于一个表空间,从数据库的存储逻辑上看,数据库中所有的数据对象都存在表空间中,从物理存储上看,其均存储在对应的数据文件上。数据库中可以存在多个表的空间,表空间满足创建、删除、扩容等基本功能需求,一个表空间也专属于一个数据库。

表空间类型

  • SYSTEM表空间:存放数据库的元数据,不支持自动扩展,不建议在SYSTEM表空间存储用户数据,如果SYSTEM表空间已满,需要扩展表空间以满足需求。
  • TEMP表空间:数据库自动维护。主要用于执行产生大量临时数据的SQL语句时,使用该表空间分配临时段进行换入换出,比如创建索引、无法在内存中完成的排序操作、SQL语句的中间结果集等。
  • UNDO表空间:存放Undo数据。执行增删改等DML操作时,将执行前的旧数据写入UNDO表空间,主要用于MVCC的可见性判断、事务回滚、一致性读等操作。
  • USERS表空间:默认的用户表空间,如果创建某新用户后没有明确指定表空间,新用户的所有信息将存放在USERS表空间中。
  • SYSAUX表空间:数据库创建时自动新建,主要存储WSR表、CBO统计信息表的相关数据。
  • TEMP2:存放NOLOGING表的数据
  • TEMP2_UNDO:存放NOLOGING表的Undo数据

表空间操作

表空间创建

​ 用户可使用 CREATE TABLESPACE 命令创建表空间:

sql
CREATE TABLESPACE TABLESPACE_NAME EXTENTS PAGE_NUM DATAFILE 'DATA_FILE_NAME' SIZE FILE_SIZE AUTOEXTEND ON NEXT EXTEND_SIZE;
  • EXTENTS参数标识一个EXTENT中包含的PAGE数量,取值范围为[8,8192],改制必须为2的整次幂,该参数不指定时默认为8。
  • EXTENTS是表存储行数据向表空间申请空间的基本单位,适当增大可以提升IO性能,但是小表可能会造成空间浪费。
  • DETAFILE 'DATA_FILE_NAME' SIZE FILE_SIZE标识指定的数据文件的名称,其初始文件大小为FILE_SIZE
  • AUTOEXTEND ON NEXT EXTEND_SIZE设置自动扩展,既表空间数据插满FILE_SIZE后自动扩展EXTEND_SIZE

示例:

创建一个名为openGaussSpace的表空间,一个EXTENTS包含16PAGE,指定其数据文件为openGaussSpace1,数据文件的初始大小为128M,比设置自动扩展64M

sql
CREATE TABLESPACE openGaussSpace EXTENTS 16 DATAFILE 'openGaussSpace1' SIZE 128M AUTOEXTEND ON NEXT 64M;
-- 在该表空间上创建表结构并插入数据
CREATE TABLE DEPT(f1 INT, f2 INT, f3 INT) TABLESPACE OPENGAUSSSPACE;
INSERT INTO DEPT VALUES(1, 2, 3),(2, 3, 4),(null, 4, 5);
COMMIT;

表空间信息查看

DBA可通过ADM_TABLESPACES以及ADM_SEGMENTS查看表空间的相关信息,示例如下:

sql
SQL> SELECT PAGE_SIZE, EXTENT_PAGES, DATAFILE_COUNT, TOTAL_SIZE, USED_SIZE FROM ADM_TABLESPACES WHERE TABLESPACE_NAME = 'OPENGAUSSSPACE';
PAGE_SIZE            EXTENT_PAGES DATAFILE_COUNT TOTAL_SIZE           USED_SIZE           
-------------------- ------------ -------------- -------------------- --------------------
8192                 16           1              134217728            147456              
                                               
SQL> SELECT SEGMENT_NAME, SEGMENT_TYPE, PAGES, EXTENTS FROM ADM_SEGMENTS WHERE TABLESPACE_NAME = 'OPENGAUSSSPACE';
SEGMENT_NAME                                                     SEGMENT_TYPE PAGES                EXTENTS             
---------------------------------------------------------------- ------------ -------------------- --------------------
DEPT                                                             TABLE        16                   1

表空间修改

​ 用户可使用 ALTER TABLESPACE 命令修改表空间的名称,扩展或缩小表空间

sql
-- 表空间名称修改
ALTER TABLESPACE TABLESPACE_NAME RENAME TO TABLESPACE_NAME_NEW;
-- 表空间扩展 增加DATAFILE
ALTER TABLESPACE TABLESPACE_NAME ADD DATAFILE 'FILE_NAME' SIZE FILE_SIZE;
-- 表空间删除DATAFILE
ALTER TABLESPACE TABLESPACE_NAME DROP DATAFILE 'FILE_NAME';
-- AUTOEXTEND的开启与关闭
ALTER TABLESPACE TABLESPACE_NAME AUTOEXTEND OFF[ON];
-- 表空间缩小
ALTER TABLESPACE TABLESPACE_NAME SHRINK SPACE KEEP FILE_SIZE;

示例:

sql
-- 表空间名称修改
ALTER TABLESPACE openGaussSpace RENAME TO openGaussSpaceNew;
-- 扩展表空间增加DATAFILE
ALTER TABLESPACE openGaussSpace ADD DATAFILE 'openGaussSpace2' SIZE 128M;
-- 删除表空间的DATAFILE
ALTER TABLESPACE openGaussSpace DROP DATAFILE 'openGaussSpace2';
-- 自动扩展的开启与关闭
ALTER TABLESPACE openGaussSpace AUTOEXTEND OFF[ON];
-- 缩小表空间
ALTER TABLESPACE openGaussSpace SHRINK SPACE KEEP 200M;

表空间删除

用户可使用 DROP TABLESPACE 命令删除手动创建的表空间,不能删除SYSTEMTEMPUNDOUSERSSYSAUX表空间。

删除表空间前应查看表空间的使用情况,清空表空间的数据,最后再执行 DROP TABLESPACE 操作。

sql
SELECT * FROM ADM_TABLESPACES WHERE TABLESPACE_NAME = 'OPENGAUSSSPACE';
SELECT * FROM ADM_SEGMENTS WHERE TABLESPACE_NAME = 'OPENGAUSSSPACE';
sql
-- 删除表
DROP TABLE TABLE_NAME;
-- 清空表空间
PURGE TABLESPACE TABLESPACE_NAME;
-- 删除表空间
DROP TABLESPACE TABLESPACE_NAME;