在之前DM7 的逻辑结构中,我们了解到了表空间的概念:
DM7 达梦数据库的逻辑结构
https://www.cndba.cn/dave/article/3568
在DM7中,逻辑关系如下:
页(4k/8k/16k/32k)—>簇(16或32个连续的页)—>段(表段/索引段:N个簇)
这些页就是在数据文件上分配的空间,数据文件的集合就是表空间。所以表空间一个逻辑的概念。 本篇我们继续来学习DM 表空间的管理。
1理论说明
1.1 创建表空间
语法格式:
CREATE TABLESPACE <表空间名> <数据文件子句>[<数据页缓冲池子句>][<存储加密子句>]
<数据文件子句> ::= DATAFILE <文件说明项>{,<文件说明项>}
<文件说明项> ::= <文件路径> [ MIRROR <文件路径>] SIZE <文件大小>[<自动扩展子句>]
<自动扩展子句> ::= AUTOEXTEND][<最大大小子句> |OFF>
<每次扩展大小子句> ::= NEXT <扩展大小> <最大大小子句> ::= MAXSIZE <文件最大大小> <数据页缓冲池子句> ::= CACHE = <缓冲池名> <存储加密子句> ::= ENCRYPT WITH <加密算法> [[BY] <加密密码>]
参数说明:
- <表空间名> 表空间的名称,表空间名称最大长度 128 字节;
- <文件路径> 指明新生成的数据文件在操作系统下的路径+新数据文件名。数据文件的存放路径符合 DM 安装路径的规则,且该路径必须是已经存在的;
- MIRROR 数据文件镜像,用于在数据文件出现损坏时替代数据文件进行服务。MIRROR 数据文件的<文件路径>必须是绝对路径。MIRROR 要使用数据文件镜像,必须在建库时开启页校验的参数 page_check。
- <文件大小> 整数值,指明新增数据文件的大小(单位 MB),取值范围 4096页大小~2147483647页大小;这里按默认的8k页计算,单个数据文件最小是32M,最大值约16T。
- <缓冲池名> 系统数据页缓冲池名 NORMAL 或 KEEP。缓冲池名 KEEP 是达梦的保留关键字,使用时必须加双引号;
- <加密算法> 可通过查看动态视图 V$CIPHERS 获取算法名;
- <加密密码> 最大长度 128 字节,若未指定,由 DM 随机生成。
注意事项:
- 表空间名在服务器中必须唯一;
- 一个表空间中,数据文件和镜像文件一起不能超过 256 个;
- DM 7中理论上最多允许有 65535 个表空间,但用户允许创建的表空间 ID 取值范围为0~32767,超过 32767 的只允许系统使用,ID 由系统自动分配,ID 不能重复使用,即使删除掉已有表空间,也无法重复使用已用 ID 号,也就是说只要创建 32768 次表空间后,用户将无法再创建表空间。
- 如果全库已经加密,就不再支持表空间加密。
1.2 修改表空间
语法格式:
ALTER TABLESPACE <表空间名> [ONLINE|OFFLINE|CORRUPT|<表空间重命名子句>|<数据
文件重命名子句>|<增加数据文件子句>|<修改文件大小子句>|<修改文件自动扩展子句>|<数据页缓冲
池子句><表空间重命名子句> ::= RENAME TO <表空间名> <数据文件重命名子句>::= RENAME DATAFILE <文件路径>{,<文件路径>} TO <文件路径>{,<
文件路径>}
<增加数据文件子句> ::= ADD <数据文件子句> <数据文件子句>见上一节表空间定义语句
<修改文件大小子句> ::= RESIZE DATAFILE <文件路径> TO <文件大小> <修改文件自动扩展子句> ::= DATAFILE <文件路径>{,<文件路径>}[<自动扩展子句>]
参数说明:
- <表空间名> 表空间的名称;
- <文件路径> 指明数据文件在操作系统下的路径+新数据文件名。数据文件的存
放路径符合 DM 安装路径的规则,且该路径必须是已经存在的;- <文件大小> 整数值,指明新增数据文件的大小(单位 MB);
- <缓冲池名> 系统数据页缓冲池名 NORMAL 或 KEEP。
注意事项:
- 不论 dm.ini 的 DDL_AUTO_COMMIT 设置为自动提交还是非自动提交,ALTER TABLESPACE 操作都会被自动提交;
- 修改表空间数据文件大小时,其大小必须大于自身大小;
- 如果表空间有未提交事务时,表空间不能修改为 OFFLINE 状态;
- 重命名表空间数据文件时,表空间必须处于 OFFLINE 状态,修改成功后再将表空间修改为 ONLINE 状态;
- 表空间如果发生损坏(表空间还原失败,或者数据文件丢失或损坏)的情况下,允许将表空间切换为 CORRUPT 状态,并删除损坏的表空间,如果表空间上定义有对象,需要先将所有对象删除,再删除表空间。
1.3 删除表空间
语法格式
DROP TABLESPACE <表空间名>
注意事项:
- SYSTEM、RLOG、ROLL 和 TEMP 表空间不允许删除;
- 系统处于 SUSPEND 或 MOUNT 状态时不允许删除表空间,系统只有处于 OPEN 状态下才允许删除表空间。
2 操作示例
2.1 创建表空间
#查看现有表空间:
SQL> select tablespace_name from dba_tablespaces;
行号 TABLESPACE_NAME
---------- ---------------
1 SYSTEM
2 ROLL
3 TEMP
4 MAIN
5 BOOKSHOP
6 DMHR
7 HMAIN
7 rows got
#查看数据文件:
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------- ---------
1 BOOKSHOP /dm/dmdbms/data/cndba/BOOKSHOP.DBF AVAILABLE
2 DMHR /dm/dmdbms/data/cndba/DMHR.DBF AVAILABLE
3 MAIN /dm/dmdbms/data/cndba/MAIN.DBF AVAILABLE
4 ROLL /dm/dmdbms/data/cndba/ROLL.DBF AVAILABLE
5 SYSTEM /dm/dmdbms/data/cndba/SYSTEM.DBF AVAILABLE
6 TEMP /dm/dmdbms/data/cndba/TEMP.DBF AVAILABLE
6 rows got
#创建表空间dave:有2个32M的数据文件:
SQL> create tablespace dave datafile '/dm/dmdbms/data/cndba/DAVE01.DBF' size 32, '/dm/dmdbms/data/cndba/DAVE02.DBF' size 32;
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------- ---------
1 BOOKSHOP /dm/dmdbms/data/cndba/BOOKSHOP.DBF AVAILABLE
2 DAVE /dm/dmdbms/data/cndba/DAVE02.DBF AVAILABLE
3 DAVE /dm/dmdbms/data/cndba/DAVE01.DBF AVAILABLE
4 DMHR /dm/dmdbms/data/cndba/DMHR.DBF AVAILABLE
5 MAIN /dm/dmdbms/data/cndba/MAIN.DBF AVAILABLE
6 ROLL /dm/dmdbms/data/cndba/ROLL.DBF AVAILABLE
7 SYSTEM /dm/dmdbms/data/cndba/SYSTEM.DBF AVAILABLE
8 TEMP /dm/dmdbms/data/cndba/TEMP.DBF AVAILABLE
8 rows got
2.2 扩展表空间
表空间的扩展有两种方式:
1)扩展现有数据文件大小
2)增加新的数据文件
#添加数据文件
SQL> alter tablespace dave add datafile '/dm/dmdbms/data/cndba/DAVE03.DBF' size 32;
操作已执行
已用时间: 14.224(毫秒). 执行号:2136.
SQL> select tablespace_name,file_id,bytes/1024/1023 as "size",file_name from dba_data_files where tablespace_name='DAVE';
行号 TABLESPACE_NAME FILE_ID size FILE_NAME
---------- --------------- ----------- -------------------- --------------------------------
1 DAVE 0 32 /dm/dmdbms/data/cndba/DAVE01.DBF
2 DAVE 2 32 /dm/dmdbms/data/cndba/DAVE03.DBF
3 DAVE 1 32 /dm/dmdbms/data/cndba/DAVE02.DBF
已用时间: 10.822(毫秒). 执行号:2141.
#扩展现有数据文件的大小:
SQL> alter tablespace dave resize datafile '/dm/dmdbms/data/cndba/DAVE01.DBF' to 64;
操作已执行
已用时间: 13.610(毫秒). 执行号:2142.
SQL>
SQL> select tablespace_name,file_id,bytes/1024/1023 as "size",file_name from dba_data_files where tablespace_name='DAVE';
行号 TABLESPACE_NAME FILE_ID size FILE_NAME
---------- --------------- ----------- -------------------- --------------------------------
1 DAVE 0 64 /dm/dmdbms/data/cndba/DAVE01.DBF
2 DAVE 2 32 /dm/dmdbms/data/cndba/DAVE03.DBF
3 DAVE 1 32 /dm/dmdbms/data/cndba/DAVE02.DBF
已用时间: 3.943(毫秒). 执行号:2143.
2.3 修改数据文件的扩展属性
子句的语法为:
AUTOEXTEND OFF|ON [NEXT <文件扩展大小>] [MAXSIZE <文件限制大小>]
OFF 表示文件不可扩展,ON 表示文件可扩展。
文件扩展大小表示当需要扩展文件时,文件一次增大的空间大小,取值范围是 0—2048,单位是 M。
文件限制大小表示文件可扩展的最大空间大小,为 0 或者 UNLIMITED 表示无限制,单位是 M。
缺省情况下,文件扩展大小是 1M,文件的最大大小是无限制的。
#创建表空间时可指定文件的扩展属性。
SQL> create tablespace cndba datafile '/dm/dmdbms/data/cndba/CNDBA01.DBF' size 32 autoextend on next 10 maxsize 200;
操作已执行
已用时间: 38.032(毫秒). 执行号:2160.
2.4 修改表空间名
可修改已存在的由用户创建的表空间的名称。
SQL> alter tablespace cndba rename to dave;
操作已执行
已用时间: 12.583(毫秒). 执行号:2161.
SQL> select tablespace_name,file_id,bytes/1024/1023 as "size",file_name from dba_data_files where tablespace_name='DAVE';
行号 TABLESPACE_NAME FILE_ID size FILE_NAME
---------- --------------- ----------- -------------------- ---------------------------------
1 DAVE 0 32 /dm/dmdbms/data/cndba/CNDBA01.DBF
已用时间: 11.746(毫秒). 执行号:2162.
SQL>
2.5 修改表空间状态及移动数据文件
用户表空间有联机和脱机两种状态。系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许脱机。
设置表空间状态为脱机状态时,如果该表空间有未提交的事务,则脱机失败报错。脱机后可对表空间的数据进行备份。
在脱机状态下,还可以修改数据文件的位置。
SQL> alter tablespace dave offline;
操作已执行
已用时间: 107.630(毫秒). 执行号:2163.
SQL> alter tablespace dave rename datafile '/dm/dmdbms/data/cndba/CNDBA01.DBF' TO '/dm/dmdbms/data/CNDBA01.DBF';
操作已执行
已用时间: 102.355(毫秒). 执行号:2164.
SQL> alter tablespace dave online;
操作已执行
已用时间: 8.128(毫秒). 执行号:2165.
SQL> select tablespace_name,file_id,bytes/1024/1023 as "size",file_name from dba_data_files where tablespace_name='DAVE';
行号 TABLESPACE_NAME FILE_ID size FILE_NAME
---------- --------------- ----------- -------------------- ---------------------------
1 DAVE 0 32 /dm/dmdbms/data/CNDBA01.DBF
已用时间: 4.322(毫秒). 执行号:2166.
注意这里的移动是操作系统物理的上移动,这种特性Oracle 直到12c以后才支持:
[dave@www.cndba.cn cndba]$ cd /dm/dmdbms/data/
[dave@www.cndba.cn data]$ ls
cndba CNDBA01.DBF
[dave@www.cndba.cn data]$ cd cndba/
[dave@www.cndba.cn cndba]$ ls CN*
ls: 无法访问CN*: 没有那个文件或目录
[dave@www.cndba.cn cndba]$
2.6 修改表空间数据缓冲区
用户表空间可以切换使用的数据缓冲区,系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许修改数据缓冲区。
可以使用的数据缓冲区有 NORMAL 和 KEEP。表空间修改成功后,并不会立即生效,而是需要服务器重启。缓冲池名 KEEP 是达梦的保留关键字,使用时必须加双引号。
SQL> alter tablespace dave cache= "KEEP";
操作已执行
已用时间: 11.701(毫秒). 执行号:2167.
2.7 标记表空间为CORRUPT 状态
修改表空间为 CORRUPT 状态,注意只有在表空间处于 OFFLINE 状态或表空间损坏的情况下才允许使用。
SQL> alter tablespace dave corrupt;
alter tablespace dave corrupt;
第1 行附近出现错误[-3440]:表空间[DAVE]不允许切换CORRUPT状态.
已用时间: 0.750(毫秒). 执行号:0.
SQL> alter tablespace dave offline;
操作已执行
已用时间: 96.442(毫秒). 执行号:2168.
SQL> alter tablespace dave corrupt;
操作已执行
已用时间: 11.183(毫秒). 执行号:2169.
SQL>
SQL> select name,cache,status$ from v$tablespace where name='DAVE';
行号 NAME CACHE STATUS$
---------- ---- ----- -----------
1 DAVE KEEP 3
已用时间: 1.880(毫秒). 执行号:2175.
这里的状态有4种值:
0 ONLINE,
1 OFFLINE,
2 RES_OFFLINE
3 CORRUPT
2.8 删除表空间
只可以删除用户创建的表空间并且只能删除未使用过的表空间。删除表空间时会删除其拥有的所有数据文件。例如删除 bookshop 表空间。
SQL> drop tablespace dave;
操作已执行
已用时间: 517.283(毫秒). 执行号:2159.
SQL>
版权声明:本文为博主原创文章,未经博主允许不得转载。






