一 前言

我们在DM逻辑结构的学习中已经知道,表空间是一个逻辑概念,其对应oracle逻辑关系图如下:

从上图可以看出其关系:
数据库-- tablespace -- segement--extent(cluster)-block (page)
簇:数据库申请空间的最小逻辑单位
页:数据库存储数据的最小逻辑单位

二 表空间管理

表空间的管理操作需要 DM 服务器处于打开状态下。

2.1 创建表空间

DM Server 的内存池指的是共享内存池,根据内存使用情况的不同,对共享内存池的使用采用了两种工作方式:HEAP 和 VPOOL。
创建表空间时需要指定表空间名和其拥有的数据文件列表。比如创建名为 bookshop 的表空间,并指定该空间上拥有 2 个数据文件,每个数据文件的大小为 128M。
CREATE TABLESPACE bookshop DATAFILE 'd:\bookshop1.dbf' SIZE 128,'d:\bookshop2.dbf' SIZE 128;
理论上最多允许有 65535 个表空间,但用户允许创建的表空间 ID 取值范围为0~32767,超过 32767 的只允许系统使用,ID 由系统自动分配,ID 不能重复使用,即使删除掉已有表空间,也无法重复使用已用 ID 号,也就是说只要创建 32768 次表空间后,用户将无法再创建表空间。
创建表空间语法格式:
CREATE TABLESPACE <表空间名> <数据文件子句>[<数据页缓冲池子句>][<存储加密子句>]
<数据文件子句> ::= DATAFILE <文件说明项>{,<文件说明项>}
<文件说明项> ::= <文件路径> [ MIRROR <文件路径>] SIZE <文件大小>[<自动扩展子句>]
<自动扩展子句> ::= AUTOEXTEND ][<最大大小子句> |OFF>
<每次扩展大小子句> ::= NEXT <扩展大小>
<最大大小子句> ::= MAXSIZE <文件最大大小>
<数据页缓冲池子句> ::= CACHE = <缓冲池名>
<存储加密子句> ::= ENCRYPT WITH <加密算法> [[BY] <加密密码>]
参数

  1. <表空间名> 表空间的名称,表空间名称最大长度 128 字节;
  2. <文件路径> 指明新生成的数据文件在操作系统下的路径+新数据文件名。数据文
    件的存放路径符合 DM 安装路径的规则,且该路径必须是已经存在的;
  3. MIRROR 数据文件镜像,用于在数据文件出现损坏时替代数据文件进行服务。
    MIRROR 数据文件的<文件路径>必须是绝对路径。MIRROR 要使用数据文件镜像,
    必须在建库时开启页校验的参数 page_check。
  4. <文件大小> 整数值,指明新增数据文件的大小(单位 MB),取值范围 4096页大
    小~2147483647
    页大小;
  5. <缓冲池名> 系统数据页缓冲池名 NORMAL 或 KEEP。缓冲池名 KEEP 是达梦的保
    留关键字,使用时必须加双引号;
  6. <加密算法> 可通过查看动态视图 V$CIPHERS 获取算法名;
  7. <加密密码> 最大长度 128 字节,若未指定,由 DM 随机生成。
    使用说明
  8. 表空间名在服务器中必须唯一;
  9. 一个表空间中,数据文件和镜像文件一起不能超过 256 个;
  10. 如果全库已经加密,就不再支持表空间加密。

    2.2 扩展表空间

    表空间通过数据文件来扩展,表空间的大小等于构成该表空间的所有数据文件的大小之和。所以要扩展表空间可以通过添加新的数据文件或者扩展表空间中已有的数据文件完成。
    扩展表空间方式:
    注:管理数据文件的操作需要 DM 服务器处于打开状态下。
    1) 添加数据文件
    可以在用户表空间中添加数据文件。添加的数据文件大小最小为 4096页大小,如页大小为 8K,则可添加的文件最小值为 40968k=32M。比如在 bookshop 表空间中添加大小为 64M 的数据文件。
    ALTER TABLESPACE bookshop ADD DATAFILE 'd:\book.dbf' SIZE 64;
    一个表空间中,数据文件和镜像文件一起不能超过 256 个。例如,如果创建表空间的时候已经指定了 1 个数据文件,那么添加数据文件的时候,最多只能添加 255 个了。
    2) 扩展现有数据文件大小
    可以扩展用户表空间中已存在的数据文件的大小。比如扩展 bookshop 表空间中数据文件 book.dbf 大小至 128M。
    ALTER TABLESPACE bookshop RESIZE DATAFILE 'd:\book.dbf' TO 128;
    3) 指定数据文件的扩展属性
    可以指定数据文件是否可以扩展,每次扩展的空间大小以及数据文件可扩展到的最大空间大小,子句的语法为:
    AUTOEXTEND OFF|ON [NEXT <文件扩展大小>] [MAXSIZE <文件限制大小>]
    OFF 表示文件不可扩展,ON 表示文件可扩展。文件扩展大小表示当需要扩展文件时,文件一次增大的空间大小,取值范围是 0—2048,单位是 M。文件限制大小表示文件可扩展的最大空间大小,为 0 或者 UNLIMITED 表示无限制,单位是 M。缺省情况下,文件扩展大小是 1M,文件的最大大小是无限制的。
    创建表空间时可指定文件的扩展属性。如创建表空间时指定数据文件的扩展属性为可自动扩展,每次扩展大小为 10M,最大可扩展到 100M:
    CREATE TABLESPACE bookshop DATAFILE 'd:\book.dbf' SIZE 32 AUTOEXTEND ON NEXT 10 MAXSIZE 100;
    在表空间中添加文件时可指定文件的扩展属性。如添加数据文件时指定扩展属性为不可自动扩展:
    ALTER TABLESPACE bookshop ADD DATAFILE 'd:\book.dbf' SIZE 1024 AUTOEXTEND OFF;
    可修改表空间中已存在的数据文件的扩展属性。如修改数据文件的扩展属性为可自动扩展:
    ALTER TABLESPACE bookshop DATAFILE 'd:\book.dbf' AUTOEXTEND ON;

    2.3 删除表空间

    只可以删除用户创建的表空间并且只能删除未使用过的表空间。删除表空间时会删除其拥有的所有数据文件。例如删除 bookshop 表空间。
    DROP TABLESPACE bookshop;
    删除表空间语法:
    DROP TABLESPACE <表空间名>
    参数
    <表空间名> 所要删除的表空间的名称。
    使用说明

  11. SYSTEM、RLOG、ROLL 和 TEMP 表空间不允许删除;
  12. 系统处于 SUSPEND 或 MOUNT 状态时不允许删除表空间,系统只有处于 OPEN 状态下才允许删除表空间。

    2.4 修改表空间

    语法:
    ALTER TABLESPACE <表空间名> [ONLINE|OFFLINE|CORRUPT|<表空间重命名子句>|<数据文件重命名子句>|<增加数据文件子句>|<修改文件大小子句>|<修改文件自动扩展子句>|<数据页缓冲池子句>
    <表空间重命名子句> ::= RENAME TO <表空间名>
    <数据文件重命名子句>::= RENAME DATAFILE <文件路径>{,<文件路径>} TO <文件路径>{,<文件路径>}
    <增加数据文件子句> ::= ADD <数据文件子句>
    <数据文件子句>见上一节表空间定义语句
    <修改文件大小子句> ::= RESIZE DATAFILE <文件路径> TO <文件大小>
    <修改文件自动扩展子句> ::= DATAFILE <文件路径>{,<文件路径>}[<自动扩展子句>]
    <自动扩展子句> ::= AUTOEXTEND ][<最大大小子句> |OFF>
    <数据页缓冲池子句> ::= CACHE = <缓冲池名>
    参数

  13. <表空间名> 表空间的名称;
  14. <文件路径> 指明数据文件在操作系统下的路径+新数据文件名。数据文件的存放路径符合 DM 安装路径的规则,且该路径必须是已经存在的;
  15. <文件大小> 整数值,指明新增数据文件的大小(单位 MB);
  16. <缓冲池名> 系统数据页缓冲池名 NORMAL 或 KEEP。
    使用说明
  17. 不论 dm.ini 的 DDL_AUTO_COMMIT 设置为自动提交还是非自动提交,ALTER TABLESPACE 操作都会被自动提交;
  18. 修改表空间数据文件大小时,其大小必须大于自身大小;
  19. 如果表空间有未提交事务时,表空间不能修改为 OFFLINE 状态;
  20. 重命名表空间数据文件时,表空间必须处于 OFFLINE 状态,修改成功后再将表空间修改为 ONLINE 状态;
  21. 表空间如果发生损坏(表空间还原失败,或者数据文件丢失或损坏)的情况下,允许将表空间切换为 CORRUPT 状态,并删除损坏的表空间,如果表空间上定义有对象,需要先将所有对象删除,再删除表空间。

    2.4.1 修改表空间名

    可修改已存在的由用户创建的表空间的名称。比如可修改 bookshop 表空间名为books。
    ALTER TABLESPACE bookshop RENAME TO books;

    2.4.2 修改表空间状态

    用户表空间有联机和脱机两种状态。系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许脱机。设置表空间状态为脱机状态时,如果该表空间有未提交的事务,则脱机失败报错。脱机后可对表空间的数据进行备份。例如修改 bookshop 表空间状态为脱机。
    ALTER TABLESPACE bookshop OFFLINE;
    修改 bookshop 表空间状态为联机。
    ALTER TABLESPACE bookshop ONLINE;
    注意:MPP 环境下,可能发现节点间的表空间不一致情况,如:EP01 为 ONLINE 状态,EP02 为 OFFLINE 状态,这个时候,如论执行 ONLINE 还是 OFFLINE 都是报错。需要用户介入才可解决问题。用户LOCAL方式登录实例 , 并 执 行SP_SET_SE$$ION_LOCAL_TYPE(1),使得该会话可以执行 DDL 操作,再执行 ONLINE 或者 OFFLINE 即可。

    2.4.3 修改表空间数据缓冲区

    用户表空间可以切换使用的数据缓冲区,系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许修改数据缓冲区。可以使用的数据缓冲区有 NORMAL 和 KEEP。表空间修改成功后,并不会立即生效,而是需要服务器重启。缓冲池名 KEEP 是达梦的保留关键字,使用时必须加双引号。例如将 bookshop 表空间绑定到 KEEP 缓冲区。
    ALTER TABLESPACE bookshop CACHE= "KEEP";

    2.4.4 指定数据文件的扩展属性

    参考2.2扩展表空间中指定数据文件的扩展属性的说明。

    2.4.5 修改数据文件的路径

    可以修改用户表空间中已存在数据文件的路径,待修改的数据文件所在表空间必须处于脱机状态并且只可修改用户创建的表空间中文件的路径。如修改 bookshop 表空间中文件book.dbf 的路径为 e:\ book.dbf。
    ALTER TABLESPACE bookshop RENAME DATAFILE 'd:\book.dbf' TO 'e:\book.dbf';

    2.4.6 查询表空间与数据文件对应关系

    可以通过查询动态视图 V$TABLESPACE 得到系统中所有表空间的信息,通过查询动态视图 V$DATAFILE 得到系统中所有数据文件的信息。将两个动态视图以表空间 ID 为连接条件,通过以下查询可以得到表空间上对应的数据文件。
    SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID = df.GROUP_ID;

    2.4.7 表空间文件失效检查

    LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除,因此存在 DM7 数据文件可能被误删的风险。如果数据文件被删除,DM7 系统能够及时检测出来,并立刻停止对其继续使用并通知用户。
    在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM7 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
    也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。
    系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
    表空间恢复失效文件的检查
    语法格式
    SP_FILE_SYS_CHECK ();
    语句功能
    在 LINUX 操作系统下,检查是否有数据文件被删除。
    使用说明
    该过程只在 LINUX 下有效。
    举例说明
    SP_FILE_SYS_CHECK ();

    2.4.8 表空间失效文件恢复

    LINUX 系统中被删除的文件,只要其句柄没有被关闭,可以在/pr0c//fd 中找到其对应的文件副本。其中指打开该文件的进程 id。
    利用该方法,结合 OS 命令,DM7 提供失效文件的恢复方案如下:
    1、 调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复;
    2、 如果使用过程中 DM 报错表空间数据文件被删除,通过操作系统的 ps 命令找到当前dmserver 的 PID:ps –ef|grepdmserver;
    3、 使用操作系统 ls 命令查看被删除文件对应的副本:ls /pr0c//fd–l,会发现被删除的文件后有(deleted)字样;
    4、 使 用 操 作 系 统 的 cp 命 令 将 文 件 复 制 到 原 位 置cpbak_fildata_file_path_dir;
    5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。
    注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。
    1)表空间恢复失效文件的准备
    语法格式
    SP_TABLESPACE_PREPARE_RECOVER(<表空间名>);
    语句功能
    在 LINUX 操作系统下,如果出现了正在使用数据文件被删除的情况,该过程完成失效文件恢复的准备工作。
    使用说明
    该过程只在 LINUX 下有效。
    举例说明
    SP_TABLESPACE_PREPARE_RECOVER('MAIN');
    2)表空间失效文件的恢复
    语法格式
    SP_TABLESPACE_RECOVER(<表空间名>);
    语句功能
    在 LINUX 操作系统下,如果出现了正在使用数据文件被删除的情况,在调用了恢复准备的 SP_TABLESPACE_PREPARE_RECOVER 及在 OS 系统内完成了数据文件的复制后,调用该过程完成文件的恢复工作。表空间失效文件恢复的详细步骤可查阅系统管理员手册。
    使用说明

  22. 该过程只在 LINUX 下有效;
  23. 在 SP_TABLESPACE_PREPARE_RECOVER 及在 OS 系统内完成了数据文件的复制后调用。
    举例说明
    SP_TABLESPACE_RECOVER('MAIN');