- 表空间管理
提示:
1)表空间管理的命令所涉及的大小的单位都是MB,且命令中不需要加上单位。
2)创建一个表空间最小需要分配32MB(4096*8)的空间,否则将无法创建成功。
DM表空间是对达梦数据库的逻辑划分,一个数据库有多个表空间,一个表空间对应着磁盘上的一个或多个数据文件。从物理存储结构上讲,数据库的对象,如表、视图、索引、序列、存储过程等存储在磁盘的数据文件中 ,从逻辑存储结构上讲,这些数据对象都存储在表空间当中,因此表空间是创建其他数据库对象的基础。
根据表空间的用途不同,表空间又可以细分为基本表空间(数据表空间)、临时表空间、大表空间等。
附加说明:
- 创建表空间的用户必须具有DBA权限。
- 表空间在服务器中必须唯一。
- 一个表空间最多可以拥有256个数据文件。
-
- 数据表空间
简单来说,创建表空间的过程就是在磁盘上创建一个或多个数据文件的过程,这些数据文件被DM数据库管理系统管制和使用,这些数据文件所占用的磁盘存储空间归数据库所有,这些数据文件将用于存储表、视图、索引等内容,这些数据文件可以占据固定的磁盘空间,也可以随着存储数据量的增加而不断扩展。
语法格式:
CREATE TABLESPACE <表空间名> <数据文件子句> [<数据页缓冲池子句>] [<存储加密子句>];
其中,各子句语法如下:
- <表空间名>::=指定表空间的名称
- <数据文件子句>::=DATAFILE <文件说明项>{,<文件说明项>}
- <文件说明项>::=<文件路径>[MIRROR<文件路径>] SIZE <文件大小>[<自动扩展子句>]
- <自动扩展子句>::=AUTOEXTEND <ON [<每次扩展大小子句>][<最大大小子句>]|OFF>
- <每次扩展大小子句>::=NEXT<扩展大小>
- <最大大小子句>::=MAXSIZE<文件最大大小>
- <数据页缓冲池子句>::=CACHE=<缓冲池名>,可选项,默认值为NORMAL。
- <存储加密子句>::=ENCRYPT WITH <加密算法> BY <加密密码>,可选项,默认不加密。
扩展说明:
- <>:表示一个语法对象。
- ::=:表示定义符,用来定义一个语法对象。定义符左边为语法对象,右边为相应的语法描述。
- |:表示语法选项在实际的语句中只能出现一个。
- {}:表示语法选项在实际的语句中可以出现0~N次(N为大于0的自然数)。
- []:表示语法选项在实际的语句中可以出现0或1次。
参数说明:
- <表空间名>:表空间名称最大长度为128字节。
- <文件路径>:指定新生成的数据文件在操作系统下的路径+新数据文件名。数据文件的存储路径符合DM安装路径的规则,且该路径必须是已经存在的。
- <MIRROR>:数据库文件镜像,用于在数据文件出现损坏时替代数据文件进行服务。<文件路径>必须是绝对路径,必须在建库时开启页校验的参数page_check。
- <文件大小>:整数值,指定新增数据文件的大小(单位为MB),取值为4096*页大小~2147483647*页大小。
提示:在SQL语句书写过程中,标点符号均为英文标点符号,关键字通常大写,语法对象通常小写。文件大小的默认单位为MB,在命令中只写数据文件大小的阿拉伯数据即可,不需要带单位。
创建表空间:
create tablespace tbs datafile '/dm/dmdb/tbs01.dbf' size 30720 autoextend off; #30GB
create tablespace tbs datafile '/dm/dmdb/tbs01.dbf' size 30720 autoextend off,'/dm/dmdb/tbs02.dbf' size 30720 autoextend off; #创建tbs表空间,同时指定两个数据文件。
create tablespace tbs datafile '/dm/dmdb/tbs01.dbf' size 5120 autoextend on next 100 maxsize 30720;
查看表空间的状态:
select name,status$ from v$tablespace;
表空间在线/离线:
alter tablespace tbs online/offline; #如果表空间有未提交的事务,表空间不能修改为offline状态。
重命名表空间:
alter tablepace tbs rename to tbs02;
修改表空间的缓冲区类别:
alter tablespace tbs cache="KEEP"; #注意:KEEP要大写,并加上双引号
删除表空间:
由于表空间中存储了表、视图、索引等数据对象,删除表空间必然会带来数据损失,所以DM数据库对删除表空间有严格的限制。
- SYSTEM、RLOG、ROLL和TEMP表空间不允许删除。
- 删除表空间的用户必须具有DBA权限。
- 系统处于SUSPEND或MOUNT状态时不允许删除表空间,系统只有处于OPEN状态下才允许删除表空间。
- 如果表空间存放了数据,则不允许删除表空间,如果确实要删除表空间,则必须先删除表空间中的对象。
语法:
drop tablespace tablespace_name;
-
- 大表空间
大表空间HTS(Huge Table Space),HTS表空间是专门用来存放HFS(Huge File System)表的,如果不创建HTS表空间,就只能使用系统表空间HMAIN。为了尽量少使用系统表空间HMAN,通常需要另外创建大表空间。
HTS表空间ID取值为0~32767,ID由系统自动分配,ID不能重复使用,即使删除已有的HTS表空间,也无法重复使用已使用过的ID,也就是说,创建32768次HTS表空间后,就无法再创建HTS表空间了。
HTS表空间与普通的表空间不同,普通的表空间,数据是通过段、簇、页来管理的,并且以固定大小(4KB、8KB、16KB、32KB)的页面为管理单位;而HTS表空间相当于一个简单的文件系统,创建一个HTS,其实就是创建一个空的目录(系统中有一个默认HTS,目录名为HMAN),HTS表空间的相关信息存储在动态视图v$huge_tablespace中。
语法:
SQL> CREATE HUGE TABLESPACE <表空间名> PATH <表空间路径>;
语法格式中,<表空间路径>是指新创建的表空间在操作系统下的路径。
附加说明:
- 表空间中在服务器中必须唯一。
- 创建大表空间的用户必须具有DBA权限。
- 删除大表空间时,大表空间中必须没有数据才能被删除。
示例:创建两个大表空间,一个名称为HTS0路径为/dm/dmdb/hts0,另一个名称为HTS1,路径为/dm/dmdb/hts1
create huge tablespace hts0 path '/dm/dmdb/hts0';
create huge tablespace hts1 path '/dm/dmdb/hts1';
删除大表空间:
如果大表空间没有被使用,那么这个大表空间可以被删除。
语法:
drop huge tablespace hts0; #大表空间hts0中没有数据才能被删除。
-
- 回滚表空间
相关参数:undo_retention
回滚表空间大小的单位:页
select para_name,para_value from v$dm_ini where para_name like '%ROLL%';
创建回滚表空间:
create tablespace roll datafile '/dm/dmdata/dmdb/roll01.dbf' size 10240;
回滚表空间添加数据文件:
alter tablespace roll add datafile '/dm/dmdata/dmdb/roll02.dbf' size 10240;
resize回滚表空间数据文件的大小:
alter tablespace roll resize datafile '/dm/dmdata/dmdb/roll02.dbf' to 20480;
-
- 临时表空间
select para_name,para_value from v$dm_ini where para_name like '%TEMP%';
修改临时表空间的大小:
sp_set_para_value(2,'TEMP_SIZE',1024);
alter tablespace temp resize datafile '/dm8/data/dmdb/TEMP.DBF' to 1024;
-
- 表空间等空间大小查询方法
1、查看所有表空间大小及其使用情况
SELECT F.TABLESPACE_NAME,
round(T.TOTAL_SPACE / 1024,2) "TOTAL(GB)",
round((T.TOTAL_SPACE - F.FREE_SPACE) / 1024,2) "USED (GB)",
round(F.FREE_SPACE / 1024,2) "FREE (GB)",
(ROUND((F.FREE_SPACE / T.TOTAL_SPACE) * 100)) || '% ' PER_FREE
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BLOCKS *
(SELECT PARA_VALUE / 1024
FROM V$DM_INI
WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME;
2、查看指定表空间大小及其使用情况,如查看DMHR开头的表空间大小及其使用情况
SELECT F.TABLESPACE_NAME,
(T.TOTAL_SPACE - F.FREE_SPACE) / 1024 "USED (GB)",
F.FREE_SPACE / 1024 "FREE (GB)",
T.TOTAL_SPACE / 1024 "TOTAL(GB)",
(ROUND((F.FREE_SPACE / T.TOTAL_SPACE) * 100)) || '% ' PER_FREE
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BLOCKS *
(SELECT PARA_VALUE / 1024
FROM V$DM_INI
WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT TABLESPACE_NAME, ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME AND T.TABLESPACE_NAME LIKE 'DMHR%';
3、查看指定用户占用的空间大小,如查看SYSDBA用户占用的空间大小
SELECT USER_USED_SPACE('SYSDBA') * PARA_VALUE / 1024 / 1024 "USER_USED_SPACE(MB)"
FROM V$DM_INI
WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';
4、查看指定表占用的空间大小,如查看DMHR用户下CITY表占用的空间大小
SELECT TABLE_USED_PAGES('DMHR', 'CITY') * PARA_VALUE / 1024 / 1024 "USER_USED_SPACE(MB)"
FROM V$DM_INI
WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';
5、查看指定表已使用的空间大小,如查看DMHR用户下CITY表已使用的空间大小
SELECT TABLE_USED_SPACE('DMHR', 'CITY') * PARA_VALUE / 1024 / 1024 "USER_USED_SPACE(MB)"
FROM V$DM_INI
WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';
6、查看指定索引占用的空间大小,如查看DMHR用户下EMPLOYEE表已上的索引INDEX33555541占用的空间大小,达梦数据库查询索引空间占用是以索引的ID为传入参数,可以通过以下SQL查询索引的ID
SELECT NAME, ID
FROM SYSOBJECTS
WHERE NAME IN (SELECT INDEX_NAME
FROM DBA_INDEXES
WHERE OWNER = 'DMHR'
AND TABLE_NAME = 'EMPLOYEE')
AND INDEX_NAME = 'INDEX33555541';
然后根据上面查到的ID来查询对应的索引占用的空间大小
SELECT INDEX_USED_PAGES(33555524) * PARA_VALUE / 1024 / 1024 "USER_USED_SPACE(MB)"
FROM V$DM_INI
WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';
7、查看指定索引已使用的空间大小,如查看DMHR用户下EMPLOYEE表已上的索引INDEX33555541使用的空间大小,达梦数据库查询索引空间占用是以索引的ID为传入参数,可以通过以下SQL查询索引的ID
SELECT NAME, ID
FROM SYSOBJECTS
WHERE NAME IN (SELECT INDEX_NAME
FROM DBA_INDEXES
WHERE OWNER = 'DMHR'
AND TABLE_NAME = 'EMPLOYEE')
AND INDEX_NAME = 'INDEX33555541';
然后根据上面查到的ID来查询对应的索引使用的空间大小
SELECT INDEX_USED_SPACE(33555524) * PARA_VALUE / 1024 / 1024 "USER_USED_SPACE(MB)"
FROM V$DM_INI
WHERE PARA_NAME LIKE 'GLOBAL_PAGE_SIZE';