2023-02-23  ·  日常运维

数据文件误删后的恢复方案

日常运维

📋 想照着做?这篇有 交互操作版——左侧步骤卡片导航、命令一键复制,现场照着敲更方便:打开交互操作版 →

方法1:DTS迁移到新实例

数据文件删除之后只要未做数据文件检查,数据文件中对应的表数据还是可以正常访问的,可以使用不同的端口重新初始化一个参数一致的数据库,然后启动新实例,将应用停掉后,再使用迁移工具将数据完整迁移过来。

方法2:利用操作系统命令cp

创建测试环境(可选)

创建测试表空间

SQL> create tablespace TEST_RM datafile 'TEST_RM01.DBF' size 128 autoextend on next 128 CACHE = NORMAL;
操作已执行
已用时间: 13.499(毫秒). 执行号:53300.
SQL>  create user TEST_RM identified by 123456789 default tablespace TEST_RM;
操作已执行
已用时间: 5.172(毫秒). 执行号:53301.
SQL>  grant "PUBLIC","RESOURCE","SOI","VTI" to TEST_RM;
操作已执行
已用时间: 3.186(毫秒). 执行号:53302.
SQL> create table TEST_RM.T1 as select * from v$sessions;
操作已执行
已用时间: 10.411(毫秒). 执行号:53303.
SQL> select tablespace_name, file_name, status from dba_data_files;

行号     TABLESPACE_NAME FILE_NAME                                STATUS   
---------- --------------- ---------------------------------------- ---------
1          SYSTEM          /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF    AVAILABLE
2          TEST_RM         /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF AVAILABLE
3          MAIN            /home/dmdba/TEST_RM/DAMENG/MAIN.DBF      AVAILABLE
4          TEMP            /home/dmdba/TEST_RM/DAMENG/TEMP.DBF      AVAILABLE
5          ROLL            /home/dmdba/TEST_RM/DAMENG/ROLL.DBF      AVAILABLE

已用时间: 7.356(毫秒). 执行号:53304.
SQL> select * from TEST_RM.T1;

模拟删除表空间数据文件

[dmdba@RH6 bin]$ cd /home/dmdba/TEST_RM/DAMENG/
[dmdba@RH6 DAMENG]$ mv TEST_RM01.DBF /tmp

未做数据文件校验仍可查询

SQL> select * from TEST_RM.T1;

SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";

行号     GROUP_ID    PATH                                                               CLIENT_PATH
---------- ----------- ------------------------------------------------------------------ -----------
1          0           /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF                              SYSTEM.DBF
2          1           /home/dmdba/TEST_RM/DAMENG/ROLL.DBF                                ROLL.DBF
3          3           /home/dmdba/TEST_RM/DAMENG/TEMP.DBF                                TEMP.DBF
4          4           /home/dmdba/TEST_RM/DAMENG/MAIN.DBF                                MAIN.DBF
5          NULL        文件或目录[/home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF]不存在 NULL

已用时间: 0.669(毫秒). 执行号:53308.
SQL> 

校验之后无法查询数据

SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.861(毫秒). 执行号:53309.
SQL>  select * from TEST_RM.T1;

[-3430]:表空间[TEST_RM]中文件[/home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF]已被删除.

开始操作系统恢复

恢复准备

SQL> call sp_tablespace_prepare_recover('TEST_RM');
DMSQL 过程已成功完成
已用时间: 1.018(毫秒). 执行号:53311.

定位删除进程句柄(带deleted字眼)

# 找到dmserver进程号27296
[dmdba@RH6 DAMENG]$ ps -ef|grep TEST_RM
dmdba    **27296**     1  0 16:01 pts/4    00:00:03 /home/dmdba/dm46/bin/dmserver path=/home/dmdba/TEST_RM/DAMENG/dm.ini -noconsole
dmdba    27444 26219  0 16:20 pts/5    00:00:00 grep TEST_RM

# 根据上面的dmserver进程号,切换到相应句柄目录
[dmdba@RH6 DAMENG]$ cd /proc/27296/fd
[dmdba@RH6 fd]$ ls -ltr|grep deleted
total 0
**lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 45 -> /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF (deleted)**

# 记录删除句柄号45

使用句柄复制到源目录(dmdba用户)

# 根据上面找到到删除句柄45,使用cp命令复制数据文件到原始目录
[dmdba@RH6 fd]$ cp 45 /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF

执行数据文件恢复

SQL> call sp_tablespace_recover('TEST_RM');
DMSQL 过程已成功完成
已用时间: 6.302(毫秒). 执行号:53312.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.254(毫秒). 执行号:53313.

验证数据

SQL> select * from TEST_RM.T1;
微信扫码添加 JC 微信扫码加我
备注「达梦」

卡在某一步了?

先对着 交互版 过一遍,每一步都有实测输出。还对不上,把卡在第几步、报错原文、版本号发我 —— 这三样就够判断了,不用发 dm.ini 或任何配置文件。

邮件:jiang-chuang@qq.com

现象和这几步都对不上?说明可能是版本或环境差异,把已经试过的命令和结果说一下,我能判断是文档该补,还是得单独看。
想让答案别人也能查到?在 Gitee 仓库 提 issue,回复公开可查。

← 返回目录