📋 想照着做?这篇有 交互操作版——左侧步骤卡片导航、命令一键复制,现场照着敲更方便:打开交互操作版 →
方法1:DTS迁移到新实例
数据文件删除之后只要未做数据文件检查,数据文件中对应的表数据还是可以正常访问的,可以使用不同的端口重新初始化一个参数一致的数据库,然后启动新实例,将应用停掉后,再使用迁移工具将数据完整迁移过来。
方法2:利用操作系统命令cp
创建测试环境(可选)
创建测试表空间
SQL> create tablespace TEST_RM datafile 'TEST_RM01.DBF' size 128 autoextend on next 128 CACHE = NORMAL;
操作已执行
已用时间: 13.499(毫秒). 执行号:53300.
SQL> create user TEST_RM identified by 123456789 default tablespace TEST_RM;
操作已执行
已用时间: 5.172(毫秒). 执行号:53301.
SQL> grant "PUBLIC","RESOURCE","SOI","VTI" to TEST_RM;
操作已执行
已用时间: 3.186(毫秒). 执行号:53302.
SQL> create table TEST_RM.T1 as select * from v$sessions;
操作已执行
已用时间: 10.411(毫秒). 执行号:53303.
SQL> select tablespace_name, file_name, status from dba_data_files;
行号 TABLESPACE_NAME FILE_NAME STATUS
---------- --------------- ---------------------------------------- ---------
1 SYSTEM /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF AVAILABLE
2 TEST_RM /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF AVAILABLE
3 MAIN /home/dmdba/TEST_RM/DAMENG/MAIN.DBF AVAILABLE
4 TEMP /home/dmdba/TEST_RM/DAMENG/TEMP.DBF AVAILABLE
5 ROLL /home/dmdba/TEST_RM/DAMENG/ROLL.DBF AVAILABLE
已用时间: 7.356(毫秒). 执行号:53304.
SQL> select * from TEST_RM.T1;
模拟删除表空间数据文件
[dmdba@RH6 bin]$ cd /home/dmdba/TEST_RM/DAMENG/
[dmdba@RH6 DAMENG]$ mv TEST_RM01.DBF /tmp
未做数据文件校验仍可查询
SQL> select * from TEST_RM.T1;
SQL> SELECT GROUP_ID,PATH,CLIENT_PATH FROM "V$DATAFILE";
行号 GROUP_ID PATH CLIENT_PATH
---------- ----------- ------------------------------------------------------------------ -----------
1 0 /home/dmdba/TEST_RM/DAMENG/SYSTEM.DBF SYSTEM.DBF
2 1 /home/dmdba/TEST_RM/DAMENG/ROLL.DBF ROLL.DBF
3 3 /home/dmdba/TEST_RM/DAMENG/TEMP.DBF TEMP.DBF
4 4 /home/dmdba/TEST_RM/DAMENG/MAIN.DBF MAIN.DBF
5 NULL 文件或目录[/home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF]不存在 NULL
已用时间: 0.669(毫秒). 执行号:53308.
SQL>
校验之后无法查询数据
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 1.861(毫秒). 执行号:53309.
SQL> select * from TEST_RM.T1;
[-3430]:表空间[TEST_RM]中文件[/home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF]已被删除.
开始操作系统恢复
恢复准备
SQL> call sp_tablespace_prepare_recover('TEST_RM');
DMSQL 过程已成功完成
已用时间: 1.018(毫秒). 执行号:53311.
定位删除进程句柄(带deleted字眼)
# 找到dmserver进程号27296
[dmdba@RH6 DAMENG]$ ps -ef|grep TEST_RM
dmdba **27296** 1 0 16:01 pts/4 00:00:03 /home/dmdba/dm46/bin/dmserver path=/home/dmdba/TEST_RM/DAMENG/dm.ini -noconsole
dmdba 27444 26219 0 16:20 pts/5 00:00:00 grep TEST_RM
# 根据上面的dmserver进程号,切换到相应句柄目录
[dmdba@RH6 DAMENG]$ cd /proc/27296/fd
[dmdba@RH6 fd]$ ls -ltr|grep deleted
total 0
**lrwx------ 1 dmdba dinstall 64 Oct 28 16:20 45 -> /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF (deleted)**
# 记录删除句柄号45
使用句柄复制到源目录(dmdba用户)
# 根据上面找到到删除句柄45,使用cp命令复制数据文件到原始目录
[dmdba@RH6 fd]$ cp 45 /home/dmdba/TEST_RM/DAMENG/TEST_RM01.DBF
执行数据文件恢复
SQL> call sp_tablespace_recover('TEST_RM');
DMSQL 过程已成功完成
已用时间: 6.302(毫秒). 执行号:53312.
SQL> call SP_FILE_SYS_CHECK();
DMSQL 过程已成功完成
已用时间: 0.254(毫秒). 执行号:53313.
验证数据
SQL> select * from TEST_RM.T1;