在之前的博客里我们看了DM7 表空间的管理,如下:
/dave/article/3570
/dave/article/3570
1 理论说明
1)表空间文件失效检查
LINUX 操作系统中,被进程打开的文件仍可以在 OS 系统中被删除。如果数据文件被删除,DM7 系统能够及时检测出来,并立刻停止对其继续使用并通知用户。
在 dm.ini 中参数 FIL_CHECK_INTERVAL 的值指定 DM7 系统检查数据文件是否仍存在的时间间隔。将其设为 0 表示不进行检查。
也可以通过系统过程 SP_FILE_SYS_CHECK()来手动的进行检查。
系统一旦检测出某个表空间内的数据文件被删除,则与该表空间所有的操作都将会失败,并报错该表空间内有数据文件被删除。
2)表空间失效文件恢复
LINUX 系统中被删除的文件,在操作系统没有重启的情况下,文件的句柄都没有关闭,可以在/proc/
/fd 中找到其对应的文件副本。其中
指打开该文件的进程 id。/dave/article/3570
利用该方法,结合 OS 命令,在DM7 中可以通过以下方法恢复被删除的数据文件:
/dave/article/3570
1、 调用系统过程 SP_TABLESPACE_PREPARE_RECOVER(tablespace_name)准备进行恢复;
2、 如果使用过程中 DM 报错表空间数据文件被删除,通过操作系统的 ps 命令找到当前dmserver 的 PID:ps –ef|grep dmserver;
3、 使用操作系统 ls 命令查看被删除文件对应的副本:ls /proc/
/fd -l,会发现被删除的文件后有(deleted)字样; 4、 使用操作系统的 cp 命令将文件复制到原位置cpbak_fildata_file_path_dir;
5、 复制成功后,调用系统过程 SP_TABLESPACE_RECOVER(ts_name)完成表空间失效文件的恢复。/dave/article/3570
/dave/article/3570/dave/article/3570
注意,要保证数据文件正确修复,需要保证在 SP_TABLESPACE_PREPARE_RECOVER后进行数据文件的复制。
2 操作示例
2.1 准备测试环境
SQL> create tablespace dave datafile '/dm/dmdbms/data/cndba/DAVE01.DBF' size 32, '/dm/dmdbms/data/cndba/DAVE02.DBF' size 32;
操作已执行
已用时间: 54.834(毫秒). 执行号:2177.
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------- ---------
1 BOOKSHOP /dm/dmdbms/data/cndba/BOOKSHOP.DBF AVAILABLE
2 DAVE /dm/dmdbms/data/cndba/DAVE02.DBF AVAILABLE
3 DAVE /dm/dmdbms/data/cndba/DAVE01.DBF AVAILABLE
4 DMHR /dm/dmdbms/data/cndba/DMHR.DBF AVAILABLE
5 MAIN /dm/dmdbms/data/cndba/MAIN.DBF AVAILABLE
6 ROLL /dm/dmdbms/data/cndba/ROLL.DBF AVAILABLE
7 SYSTEM /dm/dmdbms/data/cndba/SYSTEM.DBF AVAILABLE
8 TEMP /dm/dmdbms/data/cndba/TEMP.DBF AVAILABLE
8 rows got
已用时间: 7.133(毫秒). 执行号:2178.
SQL>
SQL> create user dave identified by "" default tablespace dave;
操作已执行
已用时间: 4.983(毫秒). 执行号:2179.
SQL> grant dba,resource to dave;
操作已执行
已用时间: 2.897(毫秒). 执行号:2180.
SQL>
SQL> conn dave/""
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间: 10.927(毫秒)
SQL> create table dave as select * from dba_data_files;
操作已执行
已用时间: 21.781(毫秒). 执行号:2181.
SQL> select count(1) from dave;
行号 COUNT(1)
---------- --------------------
1 8
已用时间: 1.336(毫秒). 执行号:2182.
SQL>
2.2 OS级别删除数据文件
[dave@ ~]$ cd /dm/dmdbms/data/cndba/
[dave@ cndba]$ ls
bak DAVE01.DBF dmdcr_example.ini dminst.sys dmtimer_example.ini MAIN.DBF SYSTEM.DBF
BOOKSHOP.DBF DAVE02.DBF DMHR.DBF dmmal_example.ini dmwatcher_example.ini rep_conflict.log TEMP.DBF
cndba01.log dmarch_example.ini dm.ini dmmonitor_example.ini dmwatch_example.ini ROLL.DBF trace
cndba02.log dm.ctl dminit20290223224934.log dmmpp_example.ini dmwmon_example.ini sqllog_example.ini
ctl_bak dmdcr_cfg_example.ini dminit_example.ini dm_service.prikey HMAIN sqllog.ini
[dave@ cndba]$ rm -rf DAVE01.DBF
[dave@ cndba]$ ls
bak DAVE02.DBF DMHR.DBF dmmal_example.ini dmwatcher_example.ini rep_conflict.log TEMP.DBF
BOOKSHOP.DBF dmarch_example.ini dm.ini dmmonitor_example.ini dmwatch_example.ini ROLL.DBF trace
cndba01.log dm.ctl dminit20290223224934.log dmmpp_example.ini dmwmon_example.ini sqllog_example.ini
cndba02.log dmdcr_cfg_example.ini dminit_example.ini dm_service.prikey HMAIN sqllog.ini
ctl_bak dmdcr_example.ini dminst.sys dmtimer_example.ini MAIN.DBF SYSTEM.DBF
[dave@ cndba]$
在此查询之前创建的表:
SQL> select count(1) from dave;
行号 COUNT(1)
---------- --------------------
1 8
已用时间: 0.697(毫秒). 执行号:2184.
#使用SP_FILE_SYS_CHECK()过程检查后报错:
SQL> select SP_FILE_SYS_CHECK();
select SP_FILE_SYS_CHECK();
第1 行附近出现错误[-4015]:无效的SELECT项.
已用时间: 1.131(毫秒). 执行号:0.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.253(毫秒). 执行号:2185.
SQL> select count(1) from dave;
select count(1) from dave;
[-3430]:表空间[DAVE]中文件[/dm/dmdbms/data/cndba/DAVE01.DBF]已被删除.
已用时间: 1.518(毫秒). 执行号:0.
SQL>
2.3 恢复数据文件
#执行准备恢复过程:
SQL> call sp_tablespace_prepare_recover('DAVE');
DMSQL 过程已成功完成
已用时间: 0.994(毫秒). 执行号:2187.
SQL>
#查找DM 进程ID:
[dave@ cndba]$ ps -ef|grep dmserver
dmdba 6857 1 0 Aug26 pts/3 00:00:14 /dm/dmdbms/bin/dmserver /dm/dmdbms/data/cndba/dm.ini -noconsole
dmdba 1 19947 0 09:28 pts/1 00:00:00 grep dmserver
[dave@ cndba]$
#查找被删除的文件:这里对应的的文件号是51
[dave@ cndba]$ ls /proc/6857/fd -l
总用量 0
lr-x------ 1 dmdba dinstall 64 2月 24 2029 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 2月 24 2029 1 -> /dm/dmdbms/log/DmServicedave.log
lrwx------ 1 dmdba dinstall 64 2月 24 2029 10 -> /dm/dmdbms/data/cndba/ROLL.DBF
lrwx------ 1 dmdba dinstall 64 2月 24 2029 11 -> /dm/dmdbms/data/cndba/MAIN.DBF
lrwx------ 1 dmdba dinstall 64 2月 24 2029 46 -> /dm/dmdbms/data/cndba/BOOKSHOP.DBF
lrwx------ 1 dmdba dinstall 64 2月 24 2029 47 -> /dm/dmdbms/data/cndba/DMHR.DBF
......
lrwx------ 1 dmdba dinstall 64 2月 24 2029 51 -> /dm/dmdbms/data/cndba/DAVE01.DBF (deleted)
lrwx------ 1 dmdba dinstall 64 2月 24 2029 52 -> /dm/dmdbms/data/cndba/DAVE02.DBF
lrwx------ 1 dmdba dinstall 64 2月 24 2029 6 -> /dm/dmdbms/data/cndba/SYSTEM.DBF
lrwx------ 1 dmdba dinstall 64 2月 24 2029 7 -> /dm/dmdbms/data/cndba/TEMP.DBF
lrwx------ 1 dmdba dinstall 64 2月 24 2029 8 -> /dm/dmdbms/data/cndba/cndba01.log
lrwx------ 1 dmdba dinstall 64 2月 24 2029 9 -> /dm/dmdbms/data/cndba/cndba02.log
[dave@ cndba]$
#复制文件到原来的位置:
[dave@ cndba]$ cp /proc/6857/fd/51 /dm/dmdbms/data/cndba/DAVE01.DBF
[dave@ cndba]$
#执行恢复过程:
SQL> call sp_tablespace_recover('DAVE');
DMSQL 过程已成功完成
已用时间: 11.210(毫秒). 执行号:2188.
#验证恢复,正常:
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.980(毫秒). 执行号:2189.
SQL> select count(1) from dave;
行号 COUNT(1)
---------- --------------------
1 8
已用时间: 0.813(毫秒). 执行号:2190.
SQL>
SQL> select tablespace_name, file_name, status from dba_data_files order by 1;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------- ---------
1 BOOKSHOP /dm/dmdbms/data/cndba/BOOKSHOP.DBF AVAILABLE
2 DAVE /dm/dmdbms/data/cndba/DAVE02.DBF AVAILABLE
3 DAVE /dm/dmdbms/data/cndba/DAVE01.DBF AVAILABLE
4 DMHR /dm/dmdbms/data/cndba/DMHR.DBF AVAILABLE
5 MAIN /dm/dmdbms/data/cndba/MAIN.DBF AVAILABLE
6 ROLL /dm/dmdbms/data/cndba/ROLL.DBF AVAILABLE
7 SYSTEM /dm/dmdbms/data/cndba/SYSTEM.DBF AVAILABLE
8 TEMP /dm/dmdbms/data/cndba/TEMP.DBF AVAILABLE
8 rows got
版权声明:本文为博主原创文章,未经博主允许。
如果觉得《linux还原dm7 DM7 达梦数据库 误删数据文件 恢复方法》对你有帮助,请点赞、收藏,并留下你的观点哦!