一、以下内容摘自《DM8系统管理员手册》
表空间文件失效检查
LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除,因此存在 DM 数据文件可能被误删的风险。如果数据文件被删除,DM 系统能够及时检测出来,并立刻停止对其继续使用并通知用户。
在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
表空间失效文件恢复
LINUX
系统中被删除的文件,只要其句柄没有被关闭,可以在
/proc/<pid>/fd 中找到其对应的文件副本。其中
<pid>
指打开该文件的进程
id
。
利用该方法,结合
OS
命令,
DM
提供失效文件的恢复方案如下:
1
、 调用系统过程
SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复;
2
、 如果使用过程中
DM
报错表空间数据文件被删除,通过操作系统的
ps
命令找到当前
dmserver
的
PID
:
ps –ef|grepdmserver
;
3
、 使用操作系统
ls
命令查看被删除文件对应的副本:
ls /proc/<PID>/fd–l,会发现被删除的文件后有
(deleted)
字样;
4、 使 用 操 作 系 统 的 cp 命 令 将 文 件 复 制 到 原 位 置 cpbak_fildata_file_path_dir
;
5
、 复制成功后,调用系统过程
SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。
注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。
二、实验过程
1、创建测试表空间、测试表
--创建测试表空间
SQL> create tablespace tbs datafile '/dm8/data/DAMENG/tbs.DBF' size 32;
操作已执行
已用时间: 175.973(毫秒). 执行号:507.
--检查数据文件状态
SQL> select path, STATUS$ from v$datafile;
行号 PATH STATUS$
---------- --------------------------- -----------
1 /dm8/data/DAMENG/SYSTEM.DBF 1
2 /dm8/data/DAMENG/ROLL.DBF 1
3 /dm8/data/DAMENG/TEMP.DBF 1
4 /dm8/data/DAMENG/MAIN.DBF 1
5 /dm8/data/DAMENG/tbs.DBF 1
已用时间: 2.458(毫秒). 执行号:509.
--创建测试表
SQL> create table t1 tablespace tbs as select * from dba_objects;
操作已执行
已用时间: 00:00:01.411. 执行号:4.
2、查看dmserver 的 PID、查看测试表空间的数据文件的副本
--查看dmserver 的 PID
[dmdba@localhost DAMENG]$ ps -ef | grep dmserver
dmdba 1122 1 2 09:26 ? 00:00:17 /dm8/bin/dmserver /dm8/data/DAMENG/dm.ini -noconsole
--查看测试表空间的数据文件的副本
[dmdba@localhost DAMENG]$ ll -li /proc/1122/fd | grep tbs
30879 lrwx------ 1 dmdba dinstall 64 8月 3 09:40 12 -> /dm8/data/DAMENG/tbs.DBF
3、删除测试表空间的数据文件、查看测试表空间的数据文件的副本
--删除测试表空间的数据文件
[dmdba@localhost DAMENG]$ rm -rf /dm8/data/DAMENG/tbs.DBF
--查看测试表空间的数据文件的副本,被删除的文件后多了(deleted)字样
[dmdba@localhost DAMENG]$ ll -li /proc/1122/fd | grep tbs
30879 lrwx------ 1 dmdba dinstall 64 8月 3 09:40 12 -> /dm8/data/DAMENG/tbs.DBF (deleted)
--检查数据文件状态,数据文件已提示不存在
SQL> select path, STATUS$ from v$datafile;
行号 PATH STATUS$
---------- -------------------------------------------------- -----------
1 /dm8/data/DAMENG/SYSTEM.DBF 1
2 /dm8/data/DAMENG/ROLL.DBF 1
3 /dm8/data/DAMENG/TEMP.DBF 1
4 /dm8/data/DAMENG/MAIN.DBF 1
5 文件或目录[/dm8/data/DAMENG/tbs.DBF]不存在 NULL
已用时间: 2.292(毫秒). 执行号:6.
4、表空间文件失效检查
--尝试创建表,执行正常
SQL> create table t2 tablespace tbs as select * from dba_objects;
操作已执行
已用时间: 198.690(毫秒). 执行号:8.
--表空间文件失效检查
SQL> SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 2.253(毫秒). 执行号:11.
--尝试创建表,已提示失败
SQL> create table t3 tablespace tbs as select * from dba_objects;
create table t3 tablespace tbs as select * from dba_objects;
[-3430]:表空间[TBS]中文件[/dm8/data/DAMENG/tbs.DBF]已被删除.
已用时间: 24.652(毫秒). 执行号:0.
5、调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复
SQL> call SP_TABLESPACE_PREPARE_RECOVER('TBS');
DMSQL 过程已成功完成
已用时间: 0.701(毫秒). 执行号:13.
6、使用操作系统的 cp 命令将文件复制到原位置
[dmdba@localhost DAMENG]$ cp /proc/1122/fd/12 /dm8/data/DAMENG/tbs.DBF
7、复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复
SQL> call SP_TABLESPACE_RECOVER('TBS');
DMSQL 过程已成功完成
已用时间: 20.831(毫秒). 执行号:14.
8、表空间文件失效检查、建立测试表
--表空间文件失效检查
SQL> SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.615(毫秒). 执行号:16.
--检查数据文件状态,数据文件已存在,状态正常
SQL> select path, STATUS$ from v$datafile;
行号 PATH STATUS$
---------- --------------------------- -----------
1 /dm8/data/DAMENG/SYSTEM.DBF 1
2 /dm8/data/DAMENG/ROLL.DBF 1
3 /dm8/data/DAMENG/TEMP.DBF 1
4 /dm8/data/DAMENG/MAIN.DBF 1
5 /dm8/data/DAMENG/tbs.DBF 1
已用时间: 1.112(毫秒). 执行号:17.
--建立表,执行正常
SQL> create table t3 tablespace tbs as select * from dba_objects;
操作已执行
已用时间: 221.506(毫秒). 执行号:18.
三、分析
1、表空间的数据文件删除后,不能重启dmserver,需要先进行数据文件的恢复后才能重启dmserver;
2、参数FIL_CHECK_INTERVAL默认值为0,如没有进行表空间文件失效检查,dmserver重启前,表空间仍旧能正常读写。
SQL> select name, value from V$PARAMETER where name = 'FIL_CHECK_INTERVAL';
行号 NAME VALUE
---------- ------------------ -----
1 FIL_CHECK_INTERVAL 0
已用时间: 19.943(毫秒). 执行号:21.