本篇文章主要来介绍达梦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上的数据文件是否正常,如果检查失败,文件已不存在,那么在关闭数据库之前发现问题,可以利用句柄完成恢复。
当然如果有备份也可以用备份来恢复。