达梦8-表空间管理

本文内容来自官方文档《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 过程已成功完成

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值