本文内容来自官方文档《DM8系统管理员手册》《DM8_SQL语言使用手册》
实验环境
操作系统版本 | 银河麒麟Linux kylin10 4.19.90-24.4.v2101.ky10.x86_64 |
数据库版本 | DM Database Server 64 V8 |
在达梦数据库中,表空间由一个或多个数据文件组成。达梦数据库中的所有对象在逻辑上都放在表空间中,而物理上都存储在所属的数据文件中。
达梦数据库中的表空间分为普通表空间和混合表空间。
--->普通表空间存储普通表
--->混合表空间存储普通表和HUGE表(列式存储表)
在创建达梦数据库时,会创建4个表空间:system表空间、roll表空间、main表空间和temp表空间。
(1)system表空间(系统表空间)
存放关于数据库的字典信息,用户不能再该表空间创建表和索引。
sys、syssso、sysauditor系统用户默认表空间。
(2)roll表空间(回滚表空间)
数据库自行维护。
该表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
(3)main表空间
main表空间为混合表空间,在创建用户时,如果没有指定默认表空间,则系统自动指定mian表空间为用户默认表空间。
sysdba系统用户的默认表空间为main表空间。
(4)temp表空间(临时表空间)
由数据库自动维护。
当用户的 SQL 语句需要磁盘空间来完成某个操作时,数据库会从 temp表空间分配临时段。如创建索引、无法在内存中完成的排序操作、 SQL语句中间结果集以及用户创建的临时表等都会使用到temp表空间。
与表空间相关视图 | V$TABLESPACE |
DBA_TABLESPACE | |
V$HUGE_TABLESPACE | |
与表空间数据文件相关的视图 | V$DATAFILE |
DBA_DATA_FILES |
--示例 查看表空间信息
SQL> select ID,NAME,TYPE$,CACHE, STATUS$ from v$tablespace;
行号 ID NAME TYPE$ CACHE STATUS$
---------- ----------- -------- ----------- ------ -----------
1 0 SYSTEM 1 0
2 1 ROLL 1 0
3 3 TEMP 2 0
4 4 MAIN 1 0
5 5 BOOKSHOP 1 NORMAL 0
6 6 DMHR 1 NORMAL 0
7 7 TEST 1 NORMAL 0
7 rows got
TYPE$ 表空间类型: 1 DB 类型, 2 临时表空间
STATUS$ 状态。 0 ONLINE, 1 OFFLINE, 2 RES_OFFLINE 3 CORRUPT
SQL> select TABLESPACE_NAME,BLOCK_SIZE,CONTENTS from dba_tablespaces;
行号 TABLESPACE_NAME BLOCK_SIZE CONTENTS
---------- --------------- ----------- ---------
1 SYSTEM 8192 PERMANENT
2 ROLL 8192 UNDO
3 TEMP 8192 TEMPORARY
4 MAIN 8192 PERMANENT
5 BOOKSHOP 8192 PERMANENT
6 DMHR 8192 PERMANENT
7 TEST 8192 PERMANENT
8 MAIN NULL PERMANENT
--示例 查看表空间的数据文件信息
SQL> SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID =df.GROUP_ID;
行号 NAME PATH
---------- --------- -----------------------------
1 MAIN /dm8/data/DAMENG/MAIN.DBF
2 BOOKSHOP /dm8/data/DAMENG/BOOKSHOP.DBF
3 TEST1_TBS /dm8/data/DAMENG/TEST_TBS.DBF
4 SYSTEM /dm8/data/DAMENG/SYSTEM.DBF
5 TEST /dm8/data/DAMENG/TEST.DBF
6 DMHR /dm8/data/DAMENG/DMHR.DBF
7 TEMP /dm8/data/DAMENG/TEMP.DBF
8 ROLL /dm8/data/DAMENG/ROLL.DBF
PATH 数据文件路径
SQL> select TABLESPACE_NAME,AUTOEXTENSIBLE,ONLINE_STATUS from dba_data_files;
行号 TABLESPACE_NAME AUTOEXTENSIBLE ONLINE_STATUS
---------- --------------- -------------- -------------
1 MAIN YES ONLINE
2 BOOKSHOP YES ONLINE
3 SYSTEM YES ONLINE
4 TEST YES ONLINE
5 DMHR YES ONLINE
6 TEMP YES ONLINE
7 ROLL YES ONLINE
7 rows got
AUTOEXTENSIBLE
数据文件是否自动扩展 yes自动扩展
1、表空间创建
理论上最多允许由65535个表空间,但是用户允许创建的表空间ID取值范围为0-32767,超过32767 的只允许系统使用,ID由系统自动分配,ID不能重复使用,即使删除掉已有表空间,也无法重复使用已有的ID号,也就是说只要创建32767次表空间后,用户将无法再创建表空间。
--语法格式
CREATE TABLESPACE [IF NOT EXISTS] <表空间名> <数据文件子句>[<数据页缓冲池子句>][<存储加密子句>][<HUGE 路径子句>][<STORAGE 子句>]
<STORAGE 子句> ::=
STORAGE (ON <RAFT 组名>) |
STORAGE (ON <BP 组名>)
<数据文件子句> ::= DATAFILE <文件说明项>{,<文件说明项>}
<文件说明项> ::= <文件路径> [ MIRROR <文件路径>] SIZE <文件大小>[<自动扩展子句>]
<自动扩展子句> ::= AUTOEXTEND <ON [<每次扩展大小子句>][<最大大小子句>] |OFF>
<每次扩展大小子句> ::= NEXT <扩展大小>
<最大大小子句> ::=
MAXSIZE <文件最大大小> |
UNLIMITED
<数据页缓冲池子句> ::= CACHE = <缓冲池名>
<存储加密子句> ::= ENCRYPT WITH <加密算法> [BY <加密密码>]
<HUGE 路径子句> ::= WITH HUGE PATH <HUGE 数据文件路径>
--说明
(1)表空间名在数据库中必须唯一,最大长度128字节;
(2)一个表空间中,数据文件和镜像文件一起不能超过256个;
(3)如果全库加密,就不再支持表空间加密;
(4)SYSTEM表空间不允许关闭自动扩展,且不允许限制空间大小。
--示例 创建test_tbs表空间,数据文件test_tbs.dbf,大小100M,打开自动扩展,每次扩展2M,最大为1G。
SQL> create tablespace test_tbs datafile '/dm8/data/DAMENG/TEST_TBS.DBF' size 100 autoextend on next 2 maxsize 1024;
操作已执行
2、表空间修改
--语法格式
ALTER TABLESPACE <表空间名> [ONLINE| OFFLINE| CORRUPT|<表空间重命名子句>| <数据文件重命名子句>|<增加数据文件子句>|<修改文件大小子句>|<修改文件自动扩展子句>|<数据页缓冲池子句>|<DSC 集群表空间负载均衡子句>|<增加 HUGE 路径子句>|<删除表空间文件>|<缩减表空间大小>]
<表空间重命名子句> ::= RENAME TO <表空间名>
<数据文件重命名子句>::= RENAME DATAFILE <文件路径>{,<文件路径>} TO <文件路径>{,<文件路径>}
<增加数据文件子句> ::= ADD <数据文件子句>
<修改文件大小子句> ::= RESIZE DATAFILE <文件路径> TO <文件大小> [ON RAFT_NAME]
<修改文件自动扩展子句> ::= DATAFILE <文件路径>{,<文件路径>}[<自动扩展子句>]
<数据页缓冲池子句> ::= CACHE = <缓冲池名>
<DSC 集群表空间负载均衡子句> ::= OPTIMIZE <DSC 集群节点号>
<增加 HUGE 路径子句> ::= ADD HUGE PATH <HUGE 数据文件路径>
<删除表空间文件>::=DROP DATAFILE <文件路径>
<缩减表空间大小>::=RESIZE DATAFILE <文件路径> TO <文件大小>
--说明
(1)ONLINE| OFFLINE| CORRUPT 表示表空间的状态。 ONLINE 为联机状态, ONLINE时才允许用户访问该表空间中的数据; OFFLINE 为脱机状态, OFFLINE 时不允许访问该表空间中的数据; CORRUPT 为损坏状态,当表空间处于 CORRUPT 状态时,只有被还原恢复后才 能 提 供 服 务 , 否 则 不 能 使 用 只 能 删 除 。 三 种 状 态 的 相 互 转 换 情 况 :ONLINE<-->OFFLINE->CORRUPT。
(2)不论 DM.INI 的 DDL_AUTO_COMMIT 设置为自动提交还是非自动提交, ALTER TABLESPACE 操作都会被自动提交;
(3)SYSTEM 表空间不允许关闭自动扩展,且不允许限制空间大小;
(4)如果表空间有未提交事务时,表空间不能修改为 OFFLINE 状态;
(5)重命名表空间数据文件时,表空间必须处于 OFFLINE 状态,修改成功后再将表空间修改为 ONLINE 状态;
(6)表空间如果发生损坏(表空间还原失败,或者数据文件丢失或损坏)的情况下,允许将表空间切换为 CORRUPT 状态,并删除损坏的表空间,如果表空间上定义有对象,需要先将所有对象删除,再删除表空间;
--示例1 将表空间TEST_TBS修改为TEST1_TBS
--查看表空间信息
SQL> select NAME,CACHE,TYPE$,STATUS$ from v$tablespace;
行号 NAME CACHE TYPE$ STATUS$
---------- -------- ------ ----------- -----------
1 SYSTEM 1 0
2 ROLL 1 0
3 TEMP 2 0
4 MAIN 1 0
5 BOOKSHOP NORMAL 1 0
6 DMHR NORMAL 1 0
7 TEST NORMAL 1 0
8 TEST_TBS NORMAL 1 0
--修改
SQL> alter tablespace TEST_TBS rename to TEST1_TBS;
操作已执行
--查看修改后名称和数据文件信息
SQL> SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID =df.GROUP_ID;
行号 NAME PATH
---------- --------- -----------------------------
1 MAIN /dm8/data/DAMENG/MAIN.DBF
2 BOOKSHOP /dm8/data/DAMENG/BOOKSHOP.DBF
3 TEST1_TBS /dm8/data/DAMENG/TEST_TBS.DBF
4 SYSTEM /dm8/data/DAMENG/SYSTEM.DBF
5 TEST /dm8/data/DAMENG/TEST.DBF
6 DMHR /dm8/data/DAMENG/DMHR.DBF
7 TEMP /dm8/data/DAMENG/TEMP.DBF
8 ROLL /dm8/data/DAMENG/ROLL.DBF
--示例2 表空间TEST1_TBS增加一个数据文件TEST_TBS02.DBF,大小100M
SQL> alter tablespace TEST1_TBS add datafile '/dm8/data/DAMENG/TEST_TBS02.DBF' size 100;
操作已执行
--查看
SQL> SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID =df.GROUP_ID AND ts.NAME='TEST1_TBS';
行号 NAME PATH
---------- --------- -------------------------------
1 TEST1_TBS /dm8/data/DAMENG/TEST_TBS02.DBF
2 TEST1_TBS /dm8/data/DAMENG/TEST_TBS.DBF
--示例3 修改TEST1_TBS表空间TEST_TBS.DBF数据文件大小为200M
SQL> select FILE_NAME,BYTES/1024/1024 MB from dba_data_files where tablespace_name='TEST1_TBS';
行号 FILE_NAME MB
---------- ------------------------------- --------------------
1 /dm8/data/DAMENG/TEST_TBS02.DBF 100
2 /dm8/data/DAMENG/TEST_TBS.DBF 100
--修改
SQL> alter tablespace TEST1_TBS resize datafile '/dm8/data/DAMENG/TEST_TBS.DBF' to 200;
操作已执行
--查询
SQL> select FILE_NAME,BYTES/1024/1024 MB from dba_data_files where tablespace_name='TEST1_TBS';
行号 FILE_NAME MB
---------- ------------------------------- --------------------
1 /dm8/data/DAMENG/TEST_TBS02.DBF 100
2 /dm8/data/DAMENG/TEST_TBS.DBF 200
--示例4 重命名表空间TEST1_TBS的数据文件TEST_TBS.DBF为TEST_TBS01.DBF
--修改表空间状态
SQL> alter tablespace TEST1_TBS offline;
操作已执行
SQL>
SQL> alter tablespace TEST1_TBS rename datafile '/dm8/data/DAMENG/TEST_TBS.DBF' to '/dm8/data/DAMENG/TEST_TBS01.DBF';
操作已执行
SQL>
SQL> alter tablespace TEST1_TBS online;
操作已执行
SQL>
--示例5 修改表空间TEST1_TBS的缓冲池名称为KEEP
--查询
SQL> select NAME,CACHE from v$tablespace where NAME='TEST1_TBS';
行号 NAME CACHE
---------- --------- ------
1 TEST1_TBS NORMAL
--修改
SQL> alter tablespace TEST1_TBS cache="KEEP";
操作已执行
--查询
SQL> select NAME,CACHE from v$tablespace where NAME='TEST1_TBS';
行号 NAME CACHE
---------- --------- -----
1 TEST1_TBS KEEP
--示例6 修改表空间TEST1_TBS的状态为corrupt,注意只有在表空间处于OFFINE状态或表空间损坏的情况下才允许使用。
SQL> alter tablespace TEST1_TBS corrupt;
alter tablespace TEST1_TBS corrupt;
第1 行附近出现错误[-3440]:表空间[TEST1_TBS]不允许切换CORRUPT状态.
SQL> alter tablespace TEST1_TBS offline;
操作已执行
SQL> alter tablespace TEST1_TBS corrupt;
操作已执行
SQL> select NAME,TYPE$,STATUS$ from v$tablespace where NAME='TEST1_TBS';c
行号 NAME TYPE$ STATUS$
---------- --------- ----------- -----------
1 TEST1_TBS 1 3
STATUS$ 状态。 0 ONLINE, 1 OFFLINE, 2 RES_OFFLINE 3 CORRUPT
--示例7 为表空间TEST1_TBS添加HUGE数据文件路径
SQL> alter tablespace TEST1_TBS add huge path '/dm8/data/DAMENG/TEST1_TBS/HUGE2';
操作已执行
SQL> select * from V$HUGE_TABLESPACE;
行号 ID NAME PATHNAME DIR_NUM
---------- ----------- --------- -------------------------------- -----------
COPY_NUM SIZE_MODE
----------- ---------
1 4 MAIN /dm8/data/DAMENG/HMAIN 1
NULL NULL
2 9 TEST1_TBS /dm8/data/DAMENG/TEST1_TBS/HUGE2 1
NULL NULL
3、表空间删除
--语法格式
DROP TABLESPACE [IF EXISTS] <表空间名>
--说明
(1)删除不存在的表空间会报错。若指定 IF EXISTS 关键字,删除不存在的表空间,不会报错;
(2)SYSTEM、 RLOG、 ROLL 和 TEMP 表空间不允许删除;
(3)系统处于 SUSPEND 或 MOUNT 状态时不允许删除表空间,系统只有处于 OPEN 状态下才允许删除表空间。
--示例 删除表空间TEST1_TBS
SQL> drop tablespace TEST1_TBS;
操作已执行
4、表空间失效文件检查
在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM 系统检查数据文件是否仍存在
的时间间隔。将其设为 0 表示不进行检查。也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。
系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失
败,并报错该表空间内有数据文件被删除。
--语法格式
SP_FILE_SYS_CHECK ();
5、表空间失效文件恢复
5.1 表空间恢复失效文件的准备
--语法格式
SP_TABLESPACE_PREPARE_RECOVER(<表空间名>);
--示例
SP_TABLESPACE_PREPARE_RECOVER('MAIN');
5.2 表空间失效文件恢复
--语法格式
SP_TABLESPACE_RECOVER(<表空间名>);
--示例
SP_TABLESPACE_RECOVER('MAIN');
--示例 删除TEST1_TBS表空间的数据文件‘/dm8/data/DAMENG/TEST_TBS02.DBF’ 进行失效文件恢复测试
--查看TEST_TBS表空间的数据文件
[root@kylin10 DAMENG]# ls TEST_TBS*
TEST_TBS01.DBF TEST_TBS02.DBF
--删除数据文件TEST_TBS02.DBF
[root@kylin10 DAMENG]# rm -rf TEST_TBS02.DBF
[root@kylin10 DAMENG]# ls TEST_TBS*
TEST_TBS01.DBF
--disql进入数据库,失效文件检查
SQL> SP_FILE_SYS_CHECK ();
DMSQL 过程已成功完成
--查看数据库日志
[ERROR] database P0000001523 T0000000000000008915 [EID:94]fil_sys check file [/dm8/data/DAMENG/TEST_TBS02.DBF] error, Can't find file
##日志显示找不到/dm8/data/DAMENG/TEST_TBS02.DBF 数据文件。
--调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(表空间名称)准备进行恢复
SQL> SP_TABLESPACE_PREPARE_RECOVER('TEST1_TBS');
DMSQL 过程已成功完成
--如果使用过程中 DM 报错表空间数据文件被删除,通过操作系统的 ps 命令找到当 前 dmserver 的 PID: ps -ef|grep dmserver;
[dmdba@kylin10 fd]$ ps -ef|grep dmserver | grep -v grep
dmdba 1523 1 0 08:43 ? 00:00:14 /dm8/bin/dmserver path=/dm8/data/DAMENG/dm.ini -noconsole
上述命令找到系统OS的PID信息,PID:1523
--使用操作系统 ls 命令查看被删除文件对应的副本: ls /proc/<PID>/fd,会发现被删除的文件后有(deleted)字样;
[dmdba@kylin10 ~]$ cd /proc/1523/fd
[dmdba@kylin10 fd]$ ls -lrt
lrwx------ 1 dmdba dinstall 64 8月 16 14:35 50 -> 'socket:[137315]'
lrwx------ 1 dmdba dinstall 64 8月 16 14:35 52 -> '/dm8/data/DAMENG/TEST_TBS02.DBF(deleted)'
[dmdba@kylin10 fd]$
--使用操作系统的 cp 命令将文件复制到原位置: cp 源路径 目的路径;
[dmdba@kylin10 fd]$ cp 52 /dm8/data/DAMENG/TEST_TBS02.DBF
#到TEST_TBS表空间的数据文件所在目录,ls查看数据文件信息
[root@kylin10 DAMENG]# ls TEST_TBS*
TEST_TBS01.DBF TEST_TBS02.DBF
--复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(表空间名称)完成表空间失效文件的恢复。
SQL> SP_TABLESPACE_RECOVER('TEST1_TBS');
DMSQL 过程已成功完成