注册
DM8数据库表空间与数据文件管理
专栏/技术分享/ 文章详情 /

DM8数据库表空间与数据文件管理

BigQ 2026/08/28 213 0 0
摘要

一 表空间基础概念

1.1 表空间定义

表空间是 DM8 数据库最大的逻辑存储单元,是所有数据库对象的统一归属容器,数据库中所有用户表、索引、系统元数据、回滚事务数据、临时运算数据,都必须存储在对应的表空间中。

表空间核心作用:实现数据分层隔离,区分系统数据、业务数据、临时数据、事务回滚数据,支持独立扩容、收缩、离线、备份恢复等精细化运维操作,极大提升数据库存储管理的灵活性与安全性。

1.2 表空间分类

DM8 数据库根据存储特性与适配数据表类型,可将表空间划分为普通表空间混合表空间两类,二者核心差异为是否支持存储 HUGE 超大表,具体特性如下:

  • 普通表空间:为 DM8 默认表空间类型,仅支持存储普通非 HUGE 数据表、索引、LOB 常规字段等业务对象,无法存储 HUGE 超大表,适用于绝大多数常规业务场景。
  • 混合表空间:是兼容型表空间,可同时存储普通非 HUGE 表HUGE 超大表,适配海量超大数据存储场景。混合表空间中的 HUGE 数据会独立存储在表空间定义时指定的 HUGE 专属数据文件路径下,与普通数据物理隔离,优化超大表读写性能与存储管理。同时 DM8 支持平滑升级,可通过为已有普通表空间新增指定 HUGE 数据文件路径的方式,将普通表空间直接升级为混合表空间,无需重建表空间、迁移原有业务数据。

1.3 表空间状态

数据库依据表空间状态控制读写权限、运维权限、故障恢复逻辑,是日常运维巡检、故障排查的核心依据。DM8 共定义 4 种标准表空间状态,包含联机状态、手动脱机状态、还原脱机状态、介质损坏状态四大状态,具体分类及详细说明如下:

  • ONLINE(联机状态): 该状态下的表空间可以正常执行增删改查、建表、建索引、扩容、增加数据文件等全部操作。处于 ONLINE 状态的表空间,数据库可正常触发全量备份、增量备份。
  • OFFLINE(手动脱机状态):该状态为手动触发,表空间停止所有IO读写,无法执行增删改查及各类业务操作,如果该表空间存在未提交活动事务,脱机直接失败,必须等待事务结束。仅用户自定义表空间支持该操作,SYSTEM、ROLL、TEMP 不能脱机。
  • RES_OFFLINE(还原脱机状态):该状态为数据库故障或物理还原后的专属中间状态,表空间禁止所有业务读写与新增备份操作。一般执行RMAN还原数据文件后自动进入该状态,需通过介质恢复补齐归档与事务数据,修复完成后可切换为联机状态。
  • CORRUPT(介质损坏状态):该状态为表空间故障状态,表空间及关联数据文件存在物理损坏、文件丢失或元数据异常。该状态下表空间无法读写、无法直接备份、无法手动联机,仅能通过RMAN备份集还原或重建表空间的方式修复。

1.4 表空间缓存模式

表空间缓存(CACHE)属性用于控制表空间的数据页加载至哪一类数据缓冲区,决定内存页面淘汰策略,是热点业务调优、内存规划的核心配置项。与表空间相关的缓冲区包含 NORMAL、KEEP、RECYCLE 三类,其中仅 NORMAL、KEEP 可通过表空间语法手动指定,具体分类及详细说明如下:

  • NORMAL(普通缓冲区):该模式为表空间默认缓存模式,数据页使用BUFFER参数配置的普通内存池,采用标准 LRU 冷热页淘汰算法,冷页会被置换出内存。处于 NORMAL 模式的表空间,支持完整的 DML、DDL 业务操作,适用于绝大多数普通业务表空间。语法书写直接写CACHE=NORMAL,不需要添加引号。
  • KEEP(保留缓冲区):该模式面向高频热点业务场景,数据页使用KEEP参数独立配置的内存池,会尽量保留热点数据页,减少页面被内存置换淘汰,提升热点数据访问性能。KEEP 为数据库保留字,语法书写必须使用双引号CACHE="KEEP"
  • RECYCLE(回收缓冲区):该缓冲区用户无法通过 CREATE/ALTER TABLESPACE 语法手动指定,专门供 TEMP 临时表空间内部使用,排序、分组、临时结果集产生的数据页放入该缓冲区,使用完成后快速回收,避免挤占业务缓冲区内存。

1.5 系统预置表空间

在创建 DM8 数据库实例时,系统会自动初始化创建 5 个基础表空间,分别为 SYSTEM 表空间、ROLL 表空间、RLOG 表空间、MAIN 表空间和 TEMP 表空间,覆盖系统元数据、事务回滚、日志存储、默认业务数据、临时运算数据全场景,各表空间核心作用如下:

  • SYSTEM 系统表空间:存储数据库数据字典、系统元数据、内核配置、用户权限等核心系统信息,是数据库启动运行的核心基础,不可删除、不可离线,禁止存放业务数据。
  • ROLL 回滚表空间:对应传统 UNDO 机制,存储事务 DML 操作修改前的原始数据,支撑事务回滚、多版本并发控制(MVCC)、读写一致性等核心事务功能。
  • RLOG 日志表空间:专门存储数据库联机重做日志数据,记录所有数据变更操作,用于数据库故障重启恢复、事务重做,保障数据持久化与一致性。
  • MAIN 默认用户表空间:数据库默认的用户永久表空间,普通用户创建数据表、索引等业务对象时,若未指定表空间,默认存储在 MAIN 表空间中。
  • TEMP 临时表空间:专门承载数据库排序、分组、哈希连接、临时结果集等运算产生的临时数据,仅服务于瞬时运算,实例重启后自动清空数据,无持久化存储需求。

二 数据文件基础概念

2.1 数据文件定义

数据文件是DM8数据库的物理存储单元,后缀默认.dbf,是表空间数据的实际载体。所有表空间的逻辑数据,最终都会以数据块的形式写入对应的数据文件中,是数据库持久化存储的核心文件。

数据文件与表空间强绑定关系:一个表空间可包含多个数据文件,一个数据文件只能隶属于一个表空间,二者归属关系固定,是数据库存储运维的核心关联依据。所有表空间扩容、迁移、修复、收缩操作,最终都会转化为对数据文件的物理操作。

2.2 数据文件分类

DM8数据文件按照存储数据类型、功能定位、生命周期差异,可划分为普通数据文件、UNDO回滚数据文件、TEMP临时数据文件三类。三类文件各司其职、相互配合,分别承载业务持久化存储、事务一致性保障、临时运算支撑的核心能力,是数据库完整运行的物理存储基础,具体分类说明如下:

  • 普通数据文件:归属用户自定义表空间、MAIN表空间,存储业务表、索引、常量数据等持久化业务数据。
  • UNDO数据文件:归属ROLL表空间,专门存储事务回滚段数据,是事务一致性、数据回滚的核心载体。
  • TEMP临时数据文件:归属TEMP表空间,仅存储临时运算数据,无持久化,数据库重启后自动清空。

2.3 数据文件属性

2.3.1 自动扩展

DM8核心空间自动管理属性,包含开关状态(AUTOEXTEND)、单次扩展步长(NEXT)、最大扩容上限(MAXSIZE)三个子参数,适配业务数据动态增长场景:

  • 开启自动扩展(AUTOEXTEND ON)后,当数据文件剩余空闲空间不足时,数据库会自动按照NEXT设定值扩容,直至达到MAXSIZE最大容量上限。
  • 关闭自动扩展(AUTOEXTEND OFF)后,文件容量固定,空间耗尽后直接抛出表空间已满报错。

2.3.2 FILE ID

文件ID是数据文件在所属表空间内的全局唯一标识,由数据库自动分配,是DM8管理多数据文件、文件排序、合法性校验、删除管控的核心索引,全程无需人工干预,且具备永久固化特性。

DM8对数据文件ID存在严格的强制管控规则,文件ID的分配、删除、复用均有固定机制,具体约束分类说明如下:

  • 文件ID分配规则:表空间内首个创建的数据文件ID固定为0,作为表空间的基础锚点文件,严禁执行删除、迁移、缩容至最小容量等高危操作;后续新增的数据文件将按照递增规则自动分配唯一文件ID,保证同表空间内文件ID有序、不重复。
  • 文件ID删除规则:运维删除数据文件时,必须严格遵守「ID从大到小」倒序删除原则,不允许跨ID、跳序删除。若跳过中间ID直接删除小号ID文件,会造成数据文件索引结构紊乱、表空间状态异常,严重时导致数据库启动失败。
  • 文件ID复用规则:文件ID具备永久固化特性,一经分配便永久占用,即便对应数据文件已删除、移除,该ID资源也无法释放、无法重复复用。

2.3.3 数据文件状态

数据文件状态用于标识物理数据文件的当前运行有效性,通过 V$DATAFILE 视图 STATUS 字段数值判定文件健康状态,包含 0、1 两种合法取值。该属性会根据操作系统平台、文件完整性、文件恢复状态动态变化,是数据库巡检文件是否丢失、是否异常、是否处于恢复流程的核心判断依据,不同平台判定规则存在明显差异,具体标准释义如下:

  • 0:数据文件状态异常:当前数据文件处于异常状态,包含两种场景:物理文件被操作系统删除、数据文件正在执行恢复操作(句柄恢复/介质恢复)。 平台触发规则:仅 Linux/Unix 类平台可出现该状态;Windows 平台无法触发该状态值。
  • 1:数据文件状态正常 :数据文件物理存在、文件校验正常、无删除标记、无正在执行的恢复任务,数据库可正常读写该数据文件。 平台触发规则:所有平台文件完好时均返回1;

Windows 平台特殊约束:Windows 系统对正在被进程占用的文件存在保护机制,不支持在操作系统层面直接删除运行中的数据文件,因此 Windows 平台下数据文件 STATUS 取值恒为1,不会出现0异常状态。

三 表空间和数据文件维护管理

3.1 表空间维护管理

3.1.1 创建表空间

理论上达梦数据库最大支持 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 ; 操作已执行

3.1.2 扩展表空间

表空间由一个或多个数据文件组成,表空间总大小等于其下属全部数据文件的大小之和。因此,实现表空间扩容有两种方式:一是向表空间中新增数据文件;二是对表空间内已存在的数据文件进行容量扩展。

示例:

--TBS_DATA 表空间添加一个 128M 的数据文件 SQL> alter tablespace TBS_DATA add datafile 'TBS_DATA_03.DBF' size 128; 操作已执行

3.1.3 删除表空间

仅支持删除用户创建的表空间,且要求待删除表空间处于未被使用的状态。删除表空间的同时,会移除其所包含的全部数据文件。SYSTEMRLOGROLLTEMP这四类系统表空间不允许执行删除操作。

示例:

--删除 TBS_DATA 表空间 SQL> DROP TABLESPACE TBS_DATA; 操作已执行 --如果表空间非空,删除会报 -3412 错误 SQL> DROP TABLESPACE TBS_DATA; DROP TABLESPACE TBS_DATA; [-3412]:试图删除已经使用的表空间.

3.1.4 修改表空间名称

重命名仅修改数据库元数据中的表空间名称,不会变更磁盘上的数据文件文件名。系统表空间 SYSTEMRLOGROLLTEMP不支持重命名;若业务脚本中硬编码旧表空间名称,重命名后需要同步修改相关脚本。

示例:

--把 TBS_DATA 表空间改名为 TBS_DATA_NEW SQL> ALTER TABLESPACE TBS_DATA RENAME TO TBS_DATA_NEW; 操作已执行

3.1.5 修改表空间状态

用户表空间支持联机(ONLINE)与脱机(OFFLINE)两种状态。系统表空间 SYSTEMRLOGROLLTEMP不允许设置为脱机状态。执行表空间脱机操作时,如果该表空间存在未提交的活动事务,脱机操作将会失败并返回报错。表空间脱机之后,可以针对其数据文件开展备份操作。

示例:

--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'; 操作已执行

3.2 数据文件维护管理

3.2.1 添加数据文件

新增数据文件的最小容量为 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; 操作已执行

3.2.2 删除数据文件

删除表空间内的数据文件时,必须遵循文件 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号文件.

3.2.3 修改数据文件大小

数据库支持通过 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; 操作已执行

3.2.4 修改数据文件扩展属性

数据文件自动扩展属性是管控文件动态扩容的核心参数,包含扩展开关、单次扩展大小、最大限制大小三个核心配置项,详细释义与生效规则如下:

  1. 扩展开关(AUTOEXTEND):分为 ON 和 OFF 两种状态,OFF 表示文件关闭自动扩展,容量固定不可动态扩容,空间耗尽后业务写入报错;ON 表示文件开启自动扩展,空间不足时数据库自动扩容,适配业务数据持续增长场景。
  2. 单次扩展大小(NEXT):文件空间不足时单次扩容的增量大小,取值范围为 1~2048,单位为 MB。实际生效的扩容大小并非完全等于指定值,需结合 dm.ini 中 TS_AUTO_EXTEND_SIZE 参数联动判定:最终扩展大小需同时满足大于等于 TS_AUTO_EXTEND_SIZE、且为手动指定 NEXT 值。
  3. 默认扩展规则(未指定NEXT场景):创建或修改文件属性时若未手动指定扩展大小,系统将自动适配默认扩容步长,分两类场景差异化生效:
    • 自定义新建表空间:默认扩展大小取创建时刻的 TS_AUTO_EXTEND_SIZE 参数值,参数后续修改不会改变该表空间已固化的扩展步长,参数相互独立;
    • 系统预定义表空间(SYSTEM、ROLL、TEMP、MAIN等):默认扩展大小始终跟随 TS_AUTO_EXTEND_SIZE 参数动态变化,INI参数更新后,系统表空间扩容步长实时同步更新。
  4. 最大限制大小(MAXSIZE):用于限定数据文件可扩容的最大空间上限,单位为 MB。取值为 0 或 UNLIMITED 时,表示文件无扩容上限,可无限扩容,系统默认配置为无限制。生产环境建议合理设置最大容量,避免单文件无限扩容占满磁盘导致数据库故障。

示例:

--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; 操作已执行

3.2.5 修改数据文件路径

支持修改用户表空间下已有数据文件的存储路径。执行路径修改操作时,待修改数据文件所属的表空间必须处于脱机(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'; 操作已执行

3.2.6 添加HUGE 数据文件路径

普通表空间可以通过添加 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 删除,但数据库进程仍然持有该文件句柄;一旦数据库重启,文件句柄被操作系统释放,该方法失效,只能依靠备份进行恢复。

4.1 实验环境说明

本次故障修复基于如下环境进行操作:

环境参数 参数详情
CPU架构 x86_64
操作系统 Kylin Linux Advanced Server V10 (Sword)
数据库版本 03134284552-20260414-322369-20221
归档状态 未开启

4.2 模拟误操作删除数据文件

  1. 创建业务表,模拟业务操作
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, '修越');
  1. 服务器物理删除数据文件
[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*': 没有那个文件或目录
  1. 删除后业务影响

被误删除数据文件的表空间上的对象可以正常进行查询、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. 检查表空间和数据文件状态
--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

4.3 误操作恢复

  1. 表空间文件失效检查

调用系统存储过程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
  1. 执行恢复准备

调用存储过程SP_TABLESPACE_PREPARE_RECOVER(表空间名),进入表空间恢复准备状态。

SQL> SP_TABLESPACE_PREPARE_RECOVER('TBS_DATA'); DMSQL 过程已成功完成
  1. 查找数据库服务进程号

通过 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
  1. 定位已删除文件句柄,复制还原数据文件

进入/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
  1. 执行表空间恢复完成操作

调用SP_TABLESPACE_RECOVER(表空间名)完成失效文件恢复。

SQL> SP_TABLESPACE_RECOVER('TBS_DATA'); DMSQL 过程已成功完成
  1. 校验恢复结果

数据文件被删除期间的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 保珊嫦

⚠️重要注意事项

  1. 必须严格按顺序执行,SP_TABLESPACE_PREPARE_RECOVER需要在操作系统复制文件之前调用,SP_TABLESPACE_RECOVER在复制文件之后调用。
  2. 数据库一旦重启,操作系统释放已删除文件句柄,本套非备份恢复流程不再生效,只能使用备份恢复。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服