达梦数据库,数据文件被误删除,无备份,如何恢复?

注意:

1.本文误删除是指操作系统级别的rm 误删除,不是 drop tablesapce 误删除。
2.rm 误删除数据文件后,如果数据库实例没有关闭,可以通过文件句柄进行恢复。
3.恢复过程中,达梦有一些特有的命令,和其他数据库恢复方式略有有区别:
sp_file_sys_check();
sp_tablespace_prepare_recover('chen');
sp_tablespace_recover('chen');

完整步骤如下:

一:创建测试数据

disql cjc/***:5238
create tablespace chen datafile '/dm8/data/CJC/chen.dbf' size 128;
create tablespace chen datafile '/dm8/data/CJC/chen.dbf' size 128;
create user chen identified by "******" default tablespace chen default index tablespace chen;
grant dba to chen;
exit;
disql chen/******:5238
create table t1(id int);
insert into t1 values(1),(2),(3);
commit;
select * from t1;
行号     id         
---------- -----------
1          1
2          2
3          3
已用时间: 1.032(毫秒). 执行号:604.

二:查看信息

select owner,tablespace_name from dba_tables where table_name='t1';
行号     owner tablespace_name
---------- ----- ---------------
1          CJC   CJC
2          CHEN  chen
已用时间: 71.929(毫秒). 执行号:605.
select file_name from dba_data_files where tablespace_name='chen';
行号     file_name             
---------- ----------------------
1          /dm8/data/CJC/chen.dbf
已用时间: 9.127(毫秒). 执行号:606.

三:模拟误删除

SQL> host rm -f /dm8/data/CJC/chen.dbf
SQL> host ls -l /dm8/data/CJC/chen.dbf
ls: cannot access /dm8/data/CJC/chen.dbf: No such file or directory

四:影响范围

数据文件被删除,短时间内,还可以继续查看和写入数据

SQL> select * from chen.t1;
行号     id         
---------- -----------
1          1
2          2
3          3
已用时间: 0.490(毫秒). 执行号:607.
SQL> insert into chen.t1 values(4),(5);
影响行数 2
已用时间: 0.723(毫秒). 执行号:608.
SQL> commit;
操作已执行
已用时间: 0.963(毫秒). 执行号:609.
SQL> select * from chen.t1;
行号     id         
---------- -----------
1          1
2          2
3          3
4          4
5          5
已用时间: 0.281(毫秒). 执行号:610.

五:检查数据文件

SQL> sp_file_sys_check();
DMSQL 过程已成功完成
已用时间: 3.113(毫秒). 执行号:612.

后台日志报错:

[dmdba@cjc-db-11 log]$ tail -10f dm_CJC_202605.log 
......
2026-05-22 10:12:55.917 [ERROR] database P0000001995 T0000000000000002328  [EID:49]fil_sys check file [/dm8/data/CJC/chen.dbf] fail, Can't find file

无法查看数据:

SQL> select * from chen.t1;
select * from chen.t1;
[-3433]:表空间处于脱机状态.
已用时间: 0.177(毫秒). 执行号:0.

六:解决方案

1.准备恢复

SQL> sp_tablespace_prepare_recover('chen');
DMSQL 过程已成功完成
已用时间: 0.414(毫秒). 执行号:613.

2.拷贝句柄文件

[root@cjc-db-11 ~]# ps -ef|grep dms|grep -v grep
dmdba     1995     1  0 09:59 pts/0    00:00:03 /dm8/dbms/bin/dmserver path=/dm8/data/CJC/dm.ini -noconsole
[root@cjc-db-11 ~]# ls -lrth /proc/1995/fd|grep dele
lrwx------ 1 dmdba dinstall 64 May 22 10:04 46 -> /dm8/data/CJC/chen.dbf (delted)
[root@cjc-db-11 ~]# cp /proc/1995/fd/46 /dm8/data/CJC/chen.dbf
[root@cjc-db-11 ~]# chown dmdba:dinstall /dm8/data/CJC/chen.dbf

3.恢复

SQL> sp_tablespace_recover('chen');
DMSQL 过程已成功完成
已用时间: 9.308(毫秒). 执行号:614.

4.再次检查数据文件

SQL> sp_file_sys_check();
DMSQL 过程已成功完成
已用时间: 3.196(毫秒). 执行号:615.

5.恢复正常,可以正常读写数据

SQL> select * from chen.t1;
行号     id         
---------- -----------
1          1
2          2
3          3
4          4
5          5
已用时间: 0.260(毫秒). 执行号:616.
SQL> insert into chen.t1 values(6);
影响行数 1
已用时间: 0.779(毫秒). 执行号:617.
SQL> commit;
操作已执行
已用时间: 0.952(毫秒). 执行号:618.

欢迎关注我的公众号《 IT小Chen


请使用浏览器的分享功能分享到微信等