在DM7中,有两个与数据文件恢复有关的特性。
数据文件失效检查
在DM.ini中参数FIL_CHECK_INTERVAL的值指定dm7系统检查数据文件还存在的时间间隔,设为0表示不检查。
也可通过系统过程SP_FILE_SYS_CHECK()进行手工检查。
数据文件失效恢复
Linux系统中被删除的文件,在没有重启的情况下,文件句柄还没有关闭,可以在/proc/ /fd 中找到其对应的文件副本。
利用此办法,结合os命令,在DM7中可以通过调用系统过程SP_TABLESPACE_PREPARE_RECOVER
和SP_TABLESPACE_RECOVER来恢复被误删除的数据文件。
1、准备测试环境
SQL> create tablespace cc datafile'/dmdata/data/DM01/cc01.dbf' size 100,'/dmdata/data/DM01/cc02.dbf' size 100;
操作已执行
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ------------------------------ ---------
1 BOOKSHOP /dmdata/data/DM01/BOOKSHOP.DBF AVAILABLE
2 CC /dmdata/data/DM01/cc02.dbf AVAILABLE
3 CC /dmdata/data/DM01/cc01.dbf AVAILABLE
4 DMHR /dmdata/data/DM01/DMHR.DBF AVAILABLE
5 MAIN /dmdata/data/DM01/MAIN.DBF AVAILABLE
6 ROLL /dmdata/data/DM01/ROLL.DBF AVAILABLE
7 SYSTEM /dmdata/data/DM01/SYSTEM.DBF AVAILABLE
8 TEMP /dmdata/data/DM01/TEMP.DBF AVAILABLE
8 rows got
SQL> create tablespace cc datafile'/dmdata/data/DM01/cc01.dbf' size 100,'/dmdata/data/DM01/cc02.dbf' size 100;
操作已执行
已用时间: 24.231(毫秒). 执行号:6.
SQL> create user test identified by dameng123 default tablespace cc;
操作已执行
已用时间: 10.973(毫秒). 执行号:7.
SQL> grant dba,resource to test;
操作已执行
已用时间: 7.763(毫秒). 执行号:8.
SQL> conn test/dameng123
SQL> create table t1 as select * from dba_data_files;
操作已执行
已用时间: 19.126(毫秒). 执行号:9.
SQL> select count(*) from t1;
行号 COUNT(*)
---------- --------------------
1 8
2、模拟删除文件
[dmdba@localhost ~]$ rm -rf /dmdata/data/DM01/cc01.dbf
SQL> select count(*) from t1;
行号 COUNT(*)
---------- --------------------
1 8
已用时间: 0.553(毫秒). 执行号:12.
执行失效检查系统进程
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.458(毫秒). 执行号:13.
SQL> select count(*) from t1;
select count(*) from t1;
[-3430]:表空间[CC]中文件[/dmdata/data/DM01/cc01.dbf]已被删除.
已用时间: 0.230(毫秒). 执行号:0
3、恢复数据文件
执行准备恢复过程
SQL> call sp_tablespace_prepare_recover('CC');
DMSQL 过程已成功完成
已用时间: 0.351(毫秒). 执行号:15.
查看DM7进程ID
[dmdba@localhost ~]$ ps -ef|grep dmserver
dmdba 2304 1 0 08:25 ? 00:00:02 /dm7/bin/dmserver /dmdata/data/DM01/dm.ini -noconsole
dmdba 2885 2817 0 08:35 pts/0 00:00:00 grep dmserver
查看被删除文件,以下可知对应的文件号是14
[dmdba@localhost ~]$ ls /proc/2304/fd -l
总用量 0
lr-x------ 1 dmdba dinstall 64 11月 16 08:36 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 11月 16 08:36 1 -> /dm7/log/S98DmServiceTEST01.log
lrwx------ 1 dmdba dinstall 64 11月 16 08:36 10 -> /dmdata/data/DM01/BOOKSHOP.DBF
lrwx------ 1 dmdba dinstall 64 11月 16 08:36 11 -> /dmdata/data/DM01/DMHR.DBF
lrwx------ 1 dmdba dinstall 64 11月 16 08:36 12 -> /dmdata/data/DM01/ROLL.DBF
lrwx------ 1 dmdba dinstall 64 11月 16 08:36 13 -> /dmdata/data/DM01/MAIN.DBF
lrwx------ 1 dmdba dinstall 64 11月 16 08:36 14 -> /dmdata/data/DM01/cc01.dbf (deleted)
lrwx------ 1 dmdba dinstall 64 11月 16 08:36 15 -> /dmdata/arch/ARCHIVE_LOCAL1_20191116082533913_0.log
........以下省略
复制文件到原来的位置
[dmdba@localhost ~]$ cp /proc/2304/fd/14 /dmdata/data/DM01/cc01.dbf
执行恢复过程
SQL> call sp_tablespace_recover('CC');
DMSQL 过程已成功完成
已用时间: 9.973(毫秒). 执行号:16.
再次执行失效检查系统进程,验证恢复,无报错
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.182(毫秒). 执行号:19.
SQL> select count(*) from t1;
行号 COUNT(*)
---------- --------------------
1 8
已用时间: 0.150(毫秒). 执行号:17.
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ------------------------------ ---------
1 BOOKSHOP /dmdata/data/DM01/BOOKSHOP.DBF AVAILABLE
2 CC /dmdata/data/DM01/cc02.dbf AVAILABLE
3 CC /dmdata/data/DM01/cc01.dbf AVAILABLE
4 DMHR /dmdata/data/DM01/DMHR.DBF AVAILABLE
5 MAIN /dmdata/data/DM01/MAIN.DBF AVAILABLE
6 ROLL /dmdata/data/DM01/ROLL.DBF AVAILABLE
7 SYSTEM /dmdata/data/DM01/SYSTEM.DBF AVAILABLE
8 TEMP /dmdata/data/DM01/TEMP.DBF AVAILABLE
8 rows got
已用时间: 47.629(毫秒). 执行号:18.
误删除数据文件恢复完成。