LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除,因此存在 DM 数据文件可能被误删的风险。如果数据文件被删除,DM 系统能够及时检测出来,并立刻停止对其继续使用并通知用户。在 dm.ini 中参数FIL_CHECK_INTERVAL 的值指定 DM 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
如:
SQL> create table tt (id number) tablespace tbs1_new;
操作已执行
SQL> select tablespace_name,file_name from dba_data_files;
行号
TABLESPACE_NAME FILE_NAME
---------- --------------- ---------------------------------
1 SYSTEM /opt/dm8/data/DAMENG/SYSTEM.DBF
2 TBS1_NEW /opt/dm8/data/DAMENG/tbs102.dbf
3 TBS1_NEW /opt/dm8/data/DAMENG/tbs101.dbf
...
SQL> host rm -f /opt/dm8/data/DAMENG/tbs101.dbf
SQL> host rm -f /opt/dm8/data/DAMENG/tbs102.dbf
SQL> SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.985(毫秒). 执行号:10.
SQL> select * from tt;
select * from tt;
[-3430]:表空间[TBS1_NEW]中文件[/opt/dm8/data/DAMENG/tbs101.dbf]已被删除.
已用时间: 0.845(毫秒). 执行号:0.
LINUX 系统中被删除的文件,只要其句柄没有被关闭,可以在/proc/<pid>/fd 中找到其对应的文件副本。其中<pid>指打开该文件的进程 id。利用该方法,结合 OS 命令,DM 提供失效文件的恢复方案如下:
1、 调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复;
SQL> SP_TABLESPACE_PREPARE_RECOVER('TBS1_NEW');
DMSQL 过程已成功完成
已用时间: 1.650(毫秒). 执行号:12.

2、 如果使用过程中 DM 报错表空间数据文件被删除, 通过操作系统的 ps 命令找到当前 dmserver 的
PID:
[dmdba@enmoedu1 log]$ ps -ef | grep dmserver
dmdba 27971 1 0 19:14 pts/3 00:00:04 /opt/dm8/bin/dmserver /opt/dm8/data/DAMENG/dm.ini -noconsole
3、 使用操作系统 ls 命令查看被删除文件对应的副本:ls /proc/<PID>/fd–l,会发现被删除的文件后有(deleted)字样;
[dmdba@enmoedu1 log]$ ll /proc/27971/fd
总用量 0
lr-x------ 1 dmdba dinstall 64 8月 28 19:25 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 8月 28 19:25 1 -> /opt/dm8/log/DmServiceDMSERVER.log
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 10 -> /opt/dm8/data/DAMENG/MAIN.DBF
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 11 -> /opt/dm8/data/DAMENG/test01.dbf
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 12 -> /opt/dm8/data/DAMENG/tbs101.dbf (deleted)
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 13 -> /opt/dm8/data/DAMENG/ROLL.DBF
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 14 -> /opt/dm8/data/DAMENG/DMHR.DBF
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 15 -> /home/dmdba/test101.dbf
lrwx------ 1 dmdba dinstall 64 8月 28 19:25 16 -> /opt/dm8/data/DAMENG/tbs102.dbf (deleted)

4、 使 用 操 作 系 统 的 cp 命 令 将 文 件 复 制 到 原 位 置 cp bak_fildata_file_path_dir;
[dmdba@enmoedu1 log]$ cp /proc/27971/fd/12 /opt/dm8/data/DAMENG/tbs101.dbf
[dmdba@enmoedu1 log]$ cp /proc/27971/fd/16 /opt/dm8/data/DAMENG/tbs102.dbf

5、 复制成功后, 调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。
SQL> SP_TABLESPACE_RECOVER('TBS1_NEW');
DMSQL 过程已成功完成
已用时间: 32.743(毫秒). 执行号:13.
验证结果:
SQL> SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 4.244(毫秒). 执行号:14.
SQL> select * from tt;
行号
ID
---------- --
1
注意:要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER 后进行数据文件的复制。




