如果表空间文件误删,那么对此表空间所有的操作都会失败,并报错该表空间内有数据文件被删除;
linux系统中被删除的文件,只要其句柄没有被关闭,可以在/proc/<pid>/fd中找到对应的文件副本,其中pid为打开该文件的的进程id.
对于DM7表空间数据文件误删恢复步骤如下:
1.调用系统过程SP_TABLESPACE_PREPARE_RECOVER(tablesapce_name)准备进行恢复;
2.找到打开该文件的进程pid ps -ef|grep dmserver
3.查看被删除文件的副本 ls -l /proc/<pid>/fd ,被删除的文件后有deleted字样;
4.拷贝文件到原来位置 cp bak_file /dmdba/data/DAMENG
5.调用系统过程 SP_TABLESPACE_RECOVER(TS_NAME);完成表空间失效的恢复;
注意:要保证数据文件正确恢复,再拷贝文件之前一定要SP_TABLESPACE_PREPARE_RECOVER(tablesapce_name)准备进行恢复;
在windows下测试发现,只需要把删掉的文件放到原处,就可正常使用该表空间,操作如下:
create tablespace test datafile 'D:\dmdbm\data\DAMENG2\test1.dbf' size 128,
'D:\dmdbm\data\DAMENG2\test2.dbf' size 128;
create user test identified by "test123456789" default tablespace test;
create table test.student(id int,name varchar(100)) storage( on test);
insert into test.student values (1,'111'),(2,'222'),(3,'333'),(4,'444');
commit;
由于是windows,删除文件需要停数据库服务,停掉服务,把test2.dbf移到D:\dmdbm\data目录,重启服务发现数据库变成了mount状态
将数据库切换到open状态,执行下面插入或查询状态;
insert into test.student values (1,'111'),(2,'222'),(3,'333'),(4,'444');
select * from test.student;
报表空间[test]处于脱机状态错误,试图去将该表空间打开,报错误消息: 文件[D:\dmdbm\data\DAMENG2\test2.dbf]不存在;
直接将test2.dbf放到原路径D:\dmdbm\data\DAMENG2\test2.dbf,打开表空间成功,可对该表操作了;