表空间是 DM8 数据库最大的逻辑存储单元,是所有数据库对象的统一归属容器,数据库中所有用户表、索引、系统元数据、回滚事务数据、临时运算数据,都必须存储在对应的表空间中。
表空间核心作用:实现数据分层隔离,区分系统数据、业务数据、临时数据、事务回滚数据,支持独立扩容、收缩、离线、备份恢复等精细化运维操作,极大提升数据库存储管理的灵活性与安全性。
DM8 数据库根据存储特性与适配数据表类型,可将表空间划分为普通表空间和混合表空间两类,二者核心差异为是否支持存储 HUGE 超大表,具体特性如下:
数据库依据表空间状态控制读写权限、运维权限、故障恢复逻辑,是日常运维巡检、故障排查的核心依据。DM8 共定义 4 种标准表空间状态,包含联机状态、手动脱机状态、还原脱机状态、介质损坏状态四大状态,具体分类及详细说明如下:
表空间缓存(CACHE)属性用于控制表空间的数据页加载至哪一类数据缓冲区,决定内存页面淘汰策略,是热点业务调优、内存规划的核心配置项。与表空间相关的缓冲区包含 NORMAL、KEEP、RECYCLE 三类,其中仅 NORMAL、KEEP 可通过表空间语法手动指定,具体分类及详细说明如下:
BUFFER参数配置的普通内存池,采用标准 LRU 冷热页淘汰算法,冷页会被置换出内存。处于 NORMAL 模式的表空间,支持完整的 DML、DDL 业务操作,适用于绝大多数普通业务表空间。语法书写直接写CACHE=NORMAL,不需要添加引号。KEEP参数独立配置的内存池,会尽量保留热点数据页,减少页面被内存置换淘汰,提升热点数据访问性能。KEEP 为数据库保留字,语法书写必须使用双引号CACHE="KEEP"。在创建 DM8 数据库实例时,系统会自动初始化创建 5 个基础表空间,分别为 SYSTEM 表空间、ROLL 表空间、RLOG 表空间、MAIN 表空间和 TEMP 表空间,覆盖系统元数据、事务回滚、日志存储、默认业务数据、临时运算数据全场景,各表空间核心作用如下:
数据文件是DM8数据库的物理存储单元,后缀默认.dbf,是表空间数据的实际载体。所有表空间的逻辑数据,最终都会以数据块的形式写入对应的数据文件中,是数据库持久化存储的核心文件。
数据文件与表空间强绑定关系:一个表空间可包含多个数据文件,一个数据文件只能隶属于一个表空间,二者归属关系固定,是数据库存储运维的核心关联依据。所有表空间扩容、迁移、修复、收缩操作,最终都会转化为对数据文件的物理操作。
DM8数据文件按照存储数据类型、功能定位、生命周期差异,可划分为普通数据文件、UNDO回滚数据文件、TEMP临时数据文件三类。三类文件各司其职、相互配合,分别承载业务持久化存储、事务一致性保障、临时运算支撑的核心能力,是数据库完整运行的物理存储基础,具体分类说明如下:
DM8核心空间自动管理属性,包含开关状态(AUTOEXTEND)、单次扩展步长(NEXT)、最大扩容上限(MAXSIZE)三个子参数,适配业务数据动态增长场景:
文件ID是数据文件在所属表空间内的全局唯一标识,由数据库自动分配,是DM8管理多数据文件、文件排序、合法性校验、删除管控的核心索引,全程无需人工干预,且具备永久固化特性。
DM8对数据文件ID存在严格的强制管控规则,文件ID的分配、删除、复用均有固定机制,具体约束分类说明如下:
数据文件状态用于标识物理数据文件的当前运行有效性,通过 V$DATAFILE 视图 STATUS 字段数值判定文件健康状态,包含 0、1 两种合法取值。该属性会根据操作系统平台、文件完整性、文件恢复状态动态变化,是数据库巡检文件是否丢失、是否异常、是否处于恢复流程的核心判断依据,不同平台判定规则存在明显差异,具体标准释义如下:
Windows 平台特殊约束:Windows 系统对正在被进程占用的文件存在保护机制,不支持在操作系统层面直接删除运行中的数据文件,因此 Windows 平台下数据文件 STATUS 取值恒为1,不会出现0异常状态。
理论上达梦数据库最大支持 65535 个表空间。其中用户可创建的表空间 ID 取值范围为0~32767;ID 大于 32767 的表空间仅允许系统内部使用,由数据库自动分配。表空间 ID 不可复用,即便删除已有表空间,其对应的 ID 也不会回收重用。因此,当累计创建表空间的次数达到 32768 次后,用户将无法继续新建用户表空间。
示例:
--创建 TBS_DATA 表空间 包含2个128 M 数据文件
SQL> create tablespace TBS_DATA datafile 'TBS_DATA_01.DBF' size 128, 'TBS_DATA_02.DBF' size 128 ;
操作已执行
表空间由一个或多个数据文件组成,表空间总大小等于其下属全部数据文件的大小之和。因此,实现表空间扩容有两种方式:一是向表空间中新增数据文件;二是对表空间内已存在的数据文件进行容量扩展。
示例:
--TBS_DATA 表空间添加一个 128M 的数据文件
SQL> alter tablespace TBS_DATA add datafile 'TBS_DATA_03.DBF' size 128;
操作已执行
仅支持删除用户创建的表空间,且要求待删除表空间处于未被使用的状态。删除表空间的同时,会移除其所包含的全部数据文件。SYSTEM、RLOG、ROLL、TEMP这四类系统表空间不允许执行删除操作。
示例:
--删除 TBS_DATA 表空间
SQL> DROP TABLESPACE TBS_DATA;
操作已执行
--如果表空间非空,删除会报 -3412 错误
SQL> DROP TABLESPACE TBS_DATA;
DROP TABLESPACE TBS_DATA;
[-3412]:试图删除已经使用的表空间.
重命名仅修改数据库元数据中的表空间名称,不会变更磁盘上的数据文件文件名。系统表空间 SYSTEM、RLOG、ROLL、TEMP不支持重命名;若业务脚本中硬编码旧表空间名称,重命名后需要同步修改相关脚本。
示例:
--把 TBS_DATA 表空间改名为 TBS_DATA_NEW
SQL> ALTER TABLESPACE TBS_DATA RENAME TO TBS_DATA_NEW;
操作已执行
用户表空间支持联机(ONLINE)与脱机(OFFLINE)两种状态。系统表空间 SYSTEM、RLOG、ROLL、TEMP不允许设置为脱机状态。执行表空间脱机操作时,如果该表空间存在未提交的活动事务,脱机操作将会失败并返回报错。表空间脱机之后,可以针对其数据文件开展备份操作。
示例:
--1. 把 TBS_DATA 表空间 OFFLINE
SQL> ALTER TABLESPACE TBS_DATA OFFLINE;
操作已执行
--2. 把 TBS_DATA 表空间 ONLINE
SQL> ALTER TABLESPACE TBS_DATA ONLINE;
操作已执行
--3. 表空间存在活跃事务,无法进行OFFLINE
--表空间上的表执行事务未提交
SQL> DELETE from APP_USER.TEMP_INFO where id=100;
--执行表空间OFFLINE操作
SQL> ALTER TABLESPACE TBS_DATA OFFLINE;
[-6407]:锁超时.
--4. 表空间 OFFLINE 状态下,进行数据库备份
SQL> ALTER TABLESPACE TBS_DATA OFFLINE;
操作已执行
SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='TBS_DATA';
行号 TABLESPACE_NAME STATUS
---------- --------------- -------
1 TBS_DATA OFFLINE
已用时间: 0.354(毫秒). 执行号:1711.
SQL> backup database full to "DB_DAMENG_FULL" backupset '/dmbak/DB_DAMENG_FULL';
操作已执行
新增数据文件的最小容量为 4096 × 页大小。例如数据库页大小为 8KB 时,数据文件最小可设置为 4096 × 8KB = 32MB。 在同一个表空间内,数据文件与镜像文件的总数量,不能超过 dm.ini 参数TS_FIL_MAX_ID所配置的上限值。
示例:
-- TBS_DATA 表空间添加 128M的数据文件
SQL> alter tablespace TBS_DATA add datafile '/dm/data/DAMENG/TBS_DATA_03.DBF' size 128;
操作已执行
删除表空间内的数据文件时,必须遵循文件 ID 从大到小的原则,需要优先删除文件 ID 最大的数据文件。同时,表空间中文件 ID 为 0 的数据文件不允许执行删除操作。
示例:
--1. 删除TBS_DATA_03数据文件
SQL> alter tablespace TBS_DATA drop datafile '/dm/data/DAMENG/TBS_DATA_03.DBF';
操作已执行
--2.无法删除非ID最大的数据文件
SQL> alter tablespace TBS_DATA drop datafile '/dm/data/DAMENG/TBS_DATA_02.DBF';
[-3463]:只允许删除ID最大的文件.
--3. 无法删除空间0号文件
SQL> alter tablespace TBS_DATA drop datafile '/dm/data/DAMENG/TBS_DATA_01.DBF';
[-3462]:禁止删除表空间0号文件.
数据库支持通过 RESIZE 方式修改数据文件大小,既可以对数据文件进行扩容扩展,也可以对数据文件执行缩容缩小。缩小数据文件存在两项限制:调整后的文件大小不能小于该数据文件当前已占用的实际空间,同时不能小于数据文件最小容量下限(4096 × 页大小),若设置的目标大小低于上述阈值,缩容操作将会报错失败。
示例:
--1. 对 TBS_DATA_02.DBF 数据文件进行扩容
SQL> alter TABLESPACE TBS_DATA resize DATAFILE '/dm/data/DAMENG/TBS_DATA_02.DBF' TO 56;
操作已执行
--2. 对 TBS_DATA_02.DBF 数据文件进行缩容
SQL> alter TABLESPACE TBS_DATA resize DATAFILE '/dm/data/DAMENG/TBS_DATA_02.DBF' TO 42;
操作已执行
数据文件自动扩展属性是管控文件动态扩容的核心参数,包含扩展开关、单次扩展大小、最大限制大小三个核心配置项,详细释义与生效规则如下:
示例:
--1. 开启自动扩展,自定义步长20MB、最大上限2048MB
SQL> ALTER TABLESPACE TBS_DATA DATAFILE '/dm/data/DAMENG/TBS_DATA_02.DBF' AUTOEXTEND ON NEXT 20 MAXSIZE 2048;
操作已执行
--2. 关闭自动扩展
SQL> ALTER TABLESPACE TBS_DATA DATAFILE '/dm/data/DAMENG/TBS_DATA_02.DBF' AUTOEXTEND OFF;
操作已执行
支持修改用户表空间下已有数据文件的存储路径。执行路径修改操作时,待修改数据文件所属的表空间必须处于脱机(OFFLINE)状态,并且仅允许修改用户创建的表空间内的数据文件路径,系统表空间的数据文件路径不支持修改。
示例:
--1.数据文件所属表空间 TBS_DATA OFFLINE
SQL> alter tablespace TBS_DATA offline;
操作已执行
--2. 修改 TBS_DATA_02.DBF 的数据文件路径
SQL> alter TABLESPACE TBS_DATA rename DATAFILE '/dm/data/DAMENG/TBS_DATA_02.DBF' TO '/dmdata/TBS_DATA_02.DBF';
操作已执行
普通表空间可以通过添加 HUGE 数据文件路径升级为混合表空间;混合表空间也可继续新增 HUGE 数据文件路径。单个混合表空间最多支持添加 127 个 HUGE 数据文件路径。
示例:
--为普通表空间 TBS_DATA 添加 HUGE 数据文件路径,执行命令前 /dmdata/tbs_data_huge 路径需在服务器上不存在
SQL> ALTER TABLESPACE TBS_DATA ADD HUGE PATH '/dmdata/tbs_data_huge';
操作已执行
该恢复方式仅适用于Linux 环境,数据库进程尚未重启的场景。文件被 rm 删除,但数据库进程仍然持有该文件句柄;一旦数据库重启,文件句柄被操作系统释放,该方法失效,只能依靠备份进行恢复。
本次故障修复基于如下环境进行操作:
| 环境参数 | 参数详情 |
|---|---|
| CPU架构 | x86_64 |
| 操作系统 | Kylin Linux Advanced Server V10 (Sword) |
| 数据库版本 | 03134284552-20260414-322369-20221 |
| 归档状态 | 未开启 |
create table APP_USER.TEMP_USER(ID INT,NAME VARCHAR(30)) TABLESPACE TBS_DATA;
insert into APP_USER.TEMP_USER(ID, NAME) values(0, '邵意歌');
insert into APP_USER.TEMP_USER(ID, NAME) values(1, '成绮琼');
insert into APP_USER.TEMP_USER(ID, NAME) values(2, '郑滢');
insert into APP_USER.TEMP_USER(ID, NAME) values(3, '卓朗');
insert into APP_USER.TEMP_USER(ID, NAME) values(4, '鲍甫');
insert into APP_USER.TEMP_USER(ID, NAME) values(5, '卓贵');
insert into APP_USER.TEMP_USER(ID, NAME) values(6, '常衡冲');
insert into APP_USER.TEMP_USER(ID, NAME) values(7, '浦启杨');
insert into APP_USER.TEMP_USER(ID, NAME) values(8, '卞保');
insert into APP_USER.TEMP_USER(ID, NAME) values(9, '修越');
[dmdba@dm8 DAMENG]$ ll TBS_DATA_0*
-rw-r--r-- 1 dmdba dinstall 134217728 8月 26 14:02 TBS_DATA_01.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 8月 26 14:02 TBS_DATA_02.DBF
[dmdba@dm8 DAMENG]$ rm -f TBS_DATA_0*
[dmdba@dm8 DAMENG]$ ll TBS_DATA_0*
ls: 无法访问 'TBS_DATA_0*': 没有那个文件或目录
被误删除数据文件的表空间上的对象可以正常进行查询、DML操作。
SQL> SELECT COUNT(*) from APP_USER.TEMP_USER;
行号 COUNT(*)
---------- --------------------
1 10
SQL> insert into APP_USER.TEMP_USER(ID, NAME) values(10, '柳礼');
影响行数 1
SQL> update APP_USER.TEMP_USER set NAME='保珊嫦' where id =9;
影响行数 1
SQL> delete from APP_USER.TEMP_USER where id=8;
影响行数 1
SQL> commit;
操作已执行
--1. 表空间状态
SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='TBS_DATA';
行号 TABLESPACE_NAME STATUS
---------- --------------- ------
1 TBS_DATA ONLINE
--2. 数据文件状态
SQL> SELECT FILE_NAME,FILE_ID,TABLESPACE_NAME,STATUS from DBA_DATA_FILES WHERE TABLESPACE_NAME='TBS_DATA';
行号 FILE_NAME FILE_ID TABLESPACE_NAME STATUS
---------- --------------------------------- ----------- --------------- ---------
1 /data/dmdata/mydb/TBS_DATA_01.DBF 0 TBS_DATA AVAILABLE
2 /data/dmdata/mydb/TBS_DATA_02.DBF 1 TBS_DATA AVAILABLE
调用系统存储过程SP_FILE_SYS_CHECK(),可用于检测数据库中是否存在被误删除的失效数据文件。若该存储过程检测到某表空间的数据文件已被删除,后续针对该表空间的所有操作均会执行失败,并抛出报错,提示该表空间存在已被删除的数据文件。
注意:该操作后,业务对该表空间上的对象操作将执行异常。
--表空间文件失效检查
SQL> SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
此时数据库运行日志检测到数据文件丢失:
checkpoint end, 0 pages flushed, used_space[270336], free_space[536592384].
fil_sys check file [/data/dmdata/DAMENG/TBS_DATA_01.DBF] error, Can't find file
fil_sys check file [/data/dmdata/DAMENG/TBS_DATA_02.DBF] error, Can't find file
checkpoint requested by INI_INTERVAL, rlog free space[536555520], used space[307200]
继续进行业务操作提示表空间文件已损坏:
SQL> SELECT COUNT(*) from APP_USER.TEMP_USER;
[-3469]:表空间文件已被删除或已损坏.
SQL> insert into APP_USER.TEMP_USER(ID, NAME) values(11, '祁鲁顺');
[-3469]:表空间文件已被删除或已损坏.
检查表空间和数据文件状态
--1. 表空间状态
SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='TBS_DATA';
行号 TABLESPACE_NAME STATUS
---------- --------------- ------
1 TBS_DATA ONLINE
--2. 数据文件状态
SQL> SELECT FILE_NAME,FILE_ID,TABLESPACE_NAME,STATUS from DBA_DATA_FILES WHERE TABLESPACE_NAME='TBS_DATA';
行号 FILE_NAME FILE_ID TABLESPACE_NAME STATUS
---------- --------------------------------- ----------- --------------- -------
1 /data/dmdata/mydb/TBS_DATA_01.DBF 0 TBS_DATA INVALID
2 /data/dmdata/mydb/TBS_DATA_02.DBF 1 TBS_DATA INVALID
调用存储过程SP_TABLESPACE_PREPARE_RECOVER(表空间名),进入表空间恢复准备状态。
SQL> SP_TABLESPACE_PREPARE_RECOVER('TBS_DATA'); DMSQL 过程已成功完成
通过 ps 命令查询数据库服务进程ID号。
[dmdba@dm8 DAMENG]$ ps -ef|grep dmserver dmdba 2673 2478 0 13:47 pts/2 00:00:13 dmserver path=/data/dmdata/DAMENG/dm.ini
进入/proc/2673/fd/目录,找到标记为(deleted)的对应文件句柄,使用cp命令,将句柄副本复制还原至数据文件原始路径。复制完成后,确认还原文件的属主、权限,与其他数据文件保持一致。
[dmdba@dm8 DAMENG]$ cd /proc/2673/fd
[dmdba@dm8 fd]$ ll |grep delete
lrwx------ 1 dmdba dinstall 64 8月 26 14:56 29 -> /data/dmdata/DAMENG/TBS_DATA_01.DBF (deleted)
lrwx------ 1 dmdba dinstall 64 8月 26 14:57 30 -> /data/dmdata/DAMENG/TBS_DATA_02.DBF (deleted)
[dmdba@dm8 fd]$ cp 29 /data/dmdata/DAMENG/TBS_DATA_01.DBF
[dmdba@dm8 fd]$ cp 30 /data/dmdata/DAMENG/TBS_DATA_02.DBF
[dmdba@dm8 fd]$ ll /data/dmdata/DAMENG/TBS_DATA*
-rw-r--r-- 1 dmdba dinstall 134217728 8月 26 15:07 /data/dmdata/DAMENG/TBS_DATA_01.DBF
-rw-r--r-- 1 dmdba dinstall 134217728 8月 26 15:08 /data/dmdata/DAMENG/TBS_DATA_02.DBF
调用SP_TABLESPACE_RECOVER(表空间名)完成失效文件恢复。
SQL> SP_TABLESPACE_RECOVER('TBS_DATA'); DMSQL 过程已成功完成
数据文件被删除期间的DML操作,数据文件恢复后,可以查询出更改的数据。
--1. 查看表空间和数据文件状态
SQL> select NAME,STATUS$ from V$TABLESPACE WHERE NAME ='TBS_DATA';
行号 NAME STATUS$
---------- -------- -----------
1 TBS_DATA 0
SQL> SELECT TABLESPACE_NAME,STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='TBS_DATA';
行号 TABLESPACE_NAME STATUS
---------- --------------- ------
1 TBS_DATA ONLINE
SQL> SELECT FILE_NAME,FILE_ID,TABLESPACE_NAME,STATUS from DBA_DATA_FILES WHERE TABLESPACE_NAME='TBS_DATA';
行号 FILE_NAME FILE_ID TABLESPACE_NAME STATUS
---------- --------------------------------- ----------- --------------- ---------
1 /data/dmdata/mydb/TBS_DATA_01.DBF 0 TBS_DATA AVAILABLE
2 /data/dmdata/mydb/TBS_DATA_02.DBF 1 TBS_DATA AVAILABLE
--2. 测试业务操作
SQL> insert into APP_USER.TEMP_USER(ID, NAME) values(11, '祁鲁顺');
影响行数 1
SQL> commit;
操作已执行
SQL> select * from APP_USER.TEMP_USER where id = 8;
未选定行
已用时间: 2.328(毫秒). 执行号:3804.
SQL> select * from APP_USER.TEMP_USER where id = 9;
行号 ID NAME
---------- ----------- ---------
1 9 保珊嫦
⚠️重要注意事项
SP_TABLESPACE_PREPARE_RECOVER需要在操作系统复制文件之前调用,SP_TABLESPACE_RECOVER在复制文件之后调用。文章
阅读量
获赞
