本篇文章主要来介绍达梦8 数据库中存储管理的逻辑存储结构,表空间的管理。
此篇文章主要内容如下脑图:
一 表空间的概述
在 DM 数据库中,表空间由一个或者多个数据文件组成。DM 数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
在创建 DM 数据库时,会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN表空间、TEMP 表空间和 HMAIN 表空间。
- SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。
- ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致
性视图。 - MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件
MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表 空间为用户默认的表空间。 - TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP
表空间。 - HMAIN 表空间属于 HTS 表空间,完全由 DM 数据库自动维护,用户无需干涉。当用户在创建 HUGE 表时,未指定 HTS 表空间的情况下,充当默认 HTS 表空间。
每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默 认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
通过实验方式查看表空间信息:
相关的数据字典:
SQL> desc v$tablespace; 行号 NAME TYPE$ NULLABLE ---------- ------------- ------------ -------- 1 ID INTEGER Y 2 NAME VARCHAR(128) Y 3 CACHE VARCHAR(20) Y 4 TYPE$ TINYINT Y 5 STATUS$ TINYINT Y 6 MAX_SIZE BIGINT Y 7 TOTAL_SIZE BIGINT Y 8 FILE_NUM INTEGER Y 9 ENCRYPT_NAME VARCHAR(128) Y 10 ENCRYPTED_KEY VARCHAR(500) Y 11 COPY_NUM INTEGER Y 行号 NAME TYPE$ NULLABLE ---------- --------- ------------ -------- 12 SIZE_MODE VARCHAR(128) Y 12 rows got SQL> desc dba_tablespaces; 行号 NAME TYPE$ NULLABLE ---------- --------------- ------------ -------- 1 TABLESPACE_NAME VARCHAR(128) Y 2 BLOCK_SIZE BIGINT Y 3 INITIAL_EXTENT VARCHAR(1) Y 4 NEXT_EXTENT VARCHAR(1) Y 5 MIN_EXTENTS VARCHAR(1) Y 6 MAX_EXTENTS VARCHAR(1) Y 7 MAX_SIZE BIGINT Y 8 PCT_INCREASE VARCHAR(1) Y 9 MIN_EXTLEN VARCHAR(1) Y 10 STATUS INTEGER Y 11 CONTENTS VARCHAR(9) Y 行号 NAME TYPE$ NULLABLE ---------- ------------------------ ---------- -------- 12 LOGGING VARCHAR(1) Y 13 FORCE_LOGGING VARCHAR(1) Y 14 EXTENT_MANAGEMENT VARCHAR(1) Y 15 ALLOCATION_TYPE VARCHAR(1) Y 16 PLUGGED_IN VARCHAR(1) Y 17 SEGMENT_SPACE_MANAGEMENT VARCHAR(1) Y 18 DEF_TAB_COMPRESSION VARCHAR(8) Y 19 RETENTION VARCHAR(1) Y 20 BIGFILE VARCHAR(1) Y 21 PREDICATE_EVALUATION VARCHAR(1) Y 22 ENCRYPTED VARCHAR(1) Y 行号 NAME TYPE$ NULLABLE ---------- ------------ ---------- -------- 23 COMPRESS_FOR VARCHAR(1) Y 23 rows got
复制
查询数据库中的表空间:
SQL> select name,cache,file_num,status$ from v$tablespace; 行号 NAME CACHE FILE_NUM STATUS$ ---------- -------- ------ ----------- ----------- 1 SYSTEM 1 0 2 ROLL 1 0 3 TEMP 1 0 4 MAIN 1 0 5 BOOKSHOP NORMAL 1 0 6 DMHR NORMAL 1 0 6 rows got SQL> select tablespace_name,contents,status from dba_tablespaces; 行号 TABLESPACE_NAME CONTENTS STATUS ---------- --------------- --------- ----------- 1 SYSTEM PERMANENT 0 2 ROLL UNDO 0 3 TEMP TEMPORARY 0 4 MAIN PERMANENT 0 5 BOOKSHOP PERMANENT 0 6 DMHR PERMANENT 0 7 HMAIN PERMANENT NULL 7 rows got
复制
二 创建表空间
理论上最多允许有 65535 个表空间,但用户允许创建的表空间 ID 取值范围为
0~32767,超过 32767 的只允许系统使用,ID 由系统自动分配,ID 不能重复使用,即使删除掉已有表空间,也无法重复使用已用 ID 号,也就是说只要创建 32768 次表空间后,用户将无法再创建表空间。
创建表空间的语法:
实操创建表空间:
tbs表空间,有一个数据文件大小为50M。
注:数据文件在定义时不要加单位,默认为M。
SQL> create tablespace tbs datafile '/dm8/data/DAMENG/tbs01.dbf' size 50; 操作已执行
复制
三 修改表空间
语法:
ALTER TABLESPACE <表空间名> [ONLINE|OFFLINE|CORRUPT|<表空间重命名子句>|<数据文件重命名子句>|<增加数据文件子句>|<修改文件大小子句>|<修改文件自动扩展子句>|<数据页缓冲池子句>]
复制
3.1 修改表空间状态
注意:
MPP 环境下,可能发现节点间的表空间不一致情况,如:EP01 为 ONLINE 状态,
EP02 为 OFFLINE 状态,这个时候,无论执行 ONLINE 还是 OFFLINE 都是报错。需要用户介入 , 才 可 以 解 决 问 题 。 用 户 LOCAL 方 式 登 陆 实 例 , 并 执 行SP_SET_SESSION_LOCAL_TYPE(1),使得该会话可以执行 DDL 操作,再执行 ONLINE 或者 OFFLINE 即可
查看bookshop表空间状态,然后更改状态为offline:
ALTER TABLESPACE bookshop OFFLINE/online;
3.2 修改表空间名
可修改已存在的由用户创建的表空间的名称。比如可修改 bookshop 表空间名为books。
ALTER TABLESPACE bookshop RENAME TO books;
3.3 修改表空间数据缓冲区
用户表空间可以切换使用的数据缓冲区,系统表空间、回滚表空间、重做日志表空间和
临时文件表空间不允许修改数据缓冲区。可以使用的数据缓冲区有 NORMAL 和 KEEP。表空间修改成功后,并不会立即生效,而是需要服务器重启。缓冲池名 KEEP 是达梦的保留关键字,使用时必须加双引号。例如将 bookshop 表空间绑定到 KEEP 缓冲区。
ALTER TABLESPACE bookshop CACHE= “KEEP”;
四 表空间和数据文件的对应关系
SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID= df.GROUP_ID; ALTER TABLESPACE bookshop RENAME TO books; SQL> select tablespace_name,file_name from dba_data_files; 行号 TABLESPACE_NAME FILE_NAME ---------- --------------- ----------------------------- 1 SYSTEM /dm8/data/DAMENG/SYSTEM.DBF 2 DMHR /dm8/data/DAMENG/DMHR.DBF 3 BOOKSHOP /dm8/data/DAMENG/BOOKSHOP.DBF 4 MAIN /dm8/data/DAMENG/MAIN.DBF 5 TEMP /dm8/data/DAMENG/TEMP.DBF 6 ROLL /dm8/data/DAMENG/ROLL.DBF 6 rows got
复制
五 表空间文件失效检查
如果数据文件被删除,DM8 系统能够及时检测出来,并立刻停止对其继续使用并通知用户。
在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM8 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
也可以通过系统过程 SP_FILE_SYS_CHECK来手动的进行检查系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除.
在误操作删除数据文件之后,可以通过执行此系系统过程,让数据库自行检查OS上的数据文件是否正常,如果检查失败,文件已不存在,那么在关闭数据库之前发现问题,可以利用句柄完成恢复。
当然如果有备份也可以用备份来恢复。