在我们日常运维工作时,有可能误操作将数据库的数据文件(实例目录下的dbf文件)误删,对于此类数据误删,操作系统在没有重启的情况下(千万不要一出问题就重启操作系统),linux可以通过以下方法恢复数据库的文件。
SQL> create tablespace "TEST" datafile '/dmdata/DAMENG/test.dbf' size 128 autoextend on maxsize 67108863 CACHE = NORMAL;
操作已执行
已用时间: 25.811(毫秒). 执行号:701.
SQL> create user test identified by "Test@dameng123" default tablespace "TEST";
操作已执行
已用时间: 24.359(毫秒). 执行号:702.
SQL> create table test.test(id int);
操作已执行
已用时间: 30.445(毫秒). 执行号:703.
SQL> insert into test.test(id) values(1);
影响行数 1
已用时间: 4.262(毫秒). 执行号:704.
SQL> commit;
操作已执行
已用时间: 3.881(毫秒). 执行号:705.
SQL> select * from test.test;
行号 id
---------- -----------
1 1
已用时间: 4.033(毫秒). 执行号:706.
[root@localhost DAMENG]# ll test.dbf
-rw-r--r-- 1 dmdba dinstall 134217728 7月 2 09:44 test.dbf
[root@localhost DAMENG]# rm -rf test.dbf
执行完数据文件校验后再查询表test,会报错,此时注意数据库服务及操作系统不能重启。
SQL> call sp_file_sys_check();
DMSQL 过程已成功完成
已用时间: 5.566(毫秒). 执行号:707.
SQL> select * from test.test;
select * from test.test;
[-3469]:表空间文件已被删除或已损坏.
已用时间: 0.131(毫秒). 执行号:0.
[root@localhost DAMENG]# ps -ef |grep dms
dmdba 1287 1 0 09:28 ? 00:00:02 /home/dmdba/dmdbms/bin/dmserver path=/dmdata/DAMENG/dm.ini -noconsole mount
root 3270 3103 0 09:52 pts/1 00:00:00 grep --color=auto dms
[root@localhost DAMENG]# ll /proc/1287/fd
总用量 0
lr-x------ 1 dmdba dinstall 64 7月 2 09:28 0 -> /dev/null
l-wx------ 1 dmdba dinstall 64 7月 2 09:28 1 -> /dev/null
lr-x------ 1 dmdba dinstall 64 7月 2 09:28 10 -> pipe:[31865]
l-wx------ 1 dmdba dinstall 64 7月 2 09:28 11 -> pipe:[31865]
lr-x------ 1 dmdba dinstall 64 7月 2 09:28 12 -> pipe:[31866]
l-wx------ 1 dmdba dinstall 64 7月 2 09:28 13 -> pipe:[31866]
lr-x------ 1 dmdba dinstall 64 7月 2 09:28 14 -> pipe:[31867]
l-wx------ 1 dmdba dinstall 64 7月 2 09:28 15 -> pipe:[31867]
lrwx------ 1 dmdba dinstall 64 7月 2 09:28 16 -> socket:[51252]
lrwx------ 1 dmdba dinstall 64 7月 2 09:30 17 -> /dmdata/DAMENG/ROLL.DBF
lrwx------ 1 dmdba dinstall 64 7月 2 09:35 18 -> /dmdata/DAMENG/MAIN.DBF
lrwx------ 1 dmdba dinstall 64 7月 2 09:35 19 -> /dmdata/DAMENG/BENCHMARKSQL1.dbf
l-wx------ 1 dmdba dinstall 64 7月 2 09:28 2 -> /home/dmdba/dmdbms/log/DmServiceGRP1_RT_01_err.log
lrwx------ 1 dmdba dinstall 64 7月 2 09:35 20 -> /dmdata/DAMENG/dem.dbf
lrwx------ 1 dmdba dinstall 64 7月 2 09:35 21 -> /dmdata/DAMENG/test.dbf (deleted)
lrwx------ 1 dmdba dinstall 64 7月 2 09:28 3 -> socket:[30136]
lrwx------ 1 dmdba dinstall 64 7月 2 09:28 4 -> /dmdata/DAMENG/SYSTEM.DBF
lrwx------ 1 dmdba dinstall 64 7月 2 09:28 5 -> /dmdata/DAMENG/TEMP.DBF
lrwx------ 1 dmdba dinstall 64 7月 2 09:28 6 -> /dmdata/DAMENG/DAMENG01.log
lrwx------ 1 dmdba dinstall 64 7月 2 09:28 7 -> /dmdata/DAMENG/DAMENG02.log
lr-x------ 1 dmdba dinstall 64 7月 2 09:28 8 -> pipe:[31864]
l-wx------ 1 dmdba dinstall 64 7月 2 09:28 9 -> pipe:[31864]
将刚刚删除的文件对应的文件号即21号文件,拷贝至实例目录之下
cp /proc/1287/fd/21 /dmdata/DAMENG/test.dbf
chown -R dmdba:dinstall test.dbf
SQL> call sp_tablespace_prepare_recover('TEST');
DMSQL 过程已成功完成
已用时间: 2.899(毫秒). 执行号:805.
SQL> call sp_tablespace_recover('TEST');
DMSQL 过程已成功完成
已用时间: 0.156(毫秒). 执行号:806.
SQL> select * from test.test;
行号 id
---------- -----------
1 1
已用时间: 0.205(毫秒). 执行号:807.
除了上述误删数据文件的情况,我们还有可能在数据库操作时误删除表之类的逻辑对象,此时我们可以通过备份文件恢复+还原归档日志的方式恢复到指定时间点,前提是数据库是做了备份以及归档操作。
SQL> alter database mount;
操作已执行
已用时间: 5.289(毫秒). 执行号:0.
SQL> alter database add archivelog 'dest=/dmdata/dmarch ,TYPE=local,FILE_SIZE=1024,SPACE_LIMIT=10240';
操作已执行
已用时间: 6.668(毫秒). 执行号:0.
SQL> alter database archivelog;
操作已执行
已用时间: 2.589(毫秒). 执行号:0.
SQL> alter database open;
操作已执行
已用时间: 9.968(毫秒). 执行号:0.
SQL> select name,arch_mode from v$database;
行号 name arch_mode
---------- ------ ---------
1 DAMENG Y
已用时间: 2.872(毫秒). 执行号:809.
SQL> backup database backupset '/dmdata/bakfull';
操作已执行
已用时间: 00:00:24.459. 执行号:810.
SQL> insert into test.test values(2);commit;
DMSQL 过程已成功完成
已用时间: 4.022(毫秒). 执行号:811.
SQL>
SQL> select now();
行号 now()
---------- --------------------------
1 2025-07-02 10:28:59.549681
已用时间: 2.996(毫秒). 执行号:812.
SQL> delete from test.test where id=2;commit;
DMSQL 过程已成功完成
已用时间: 11.852(毫秒). 执行号:813.
SQL> select now();
行号 now()
---------- --------------------------
1 2025-07-02 10:30:05.321309
已用时间: 0.201(毫秒). 执行号:814.
注意:联机恢复仅支持表级的恢复,全库恢复必须脱机还原,如果是生产环境的恢复,需要初始化一个新实例做为测试环境,将数据恢复到测试环境中(相关备份文件及归档文件拷贝至测试机做还原恢复),再找到删除的数据导入进生产当中。
[dmdba@localhost bin]$ ./DmServiceGRP1_RT_01 stop
Stopping DmServiceGRP1_RT_01: [ OK ]
[dmdba@localhost bin]$ ./dmrman
dmrman V8
RMAN> RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/bakfull';
RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/bakfull';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:11][Remaining:00:00:00]
restore successfully.
time used: 00:00:11.684
RMAN> RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR'/dmdata/dmarch' UNTIL TIME'2025-07-02 10:29:00';
RECOVER DATABASE '/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/dmarch' UNTIL TIME '2025-07-02 10:29:00';
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 00:00:01.220
RMAN> RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC;
recover successfully!
time used: 00:00:01.222
SQL> select * from test.test;
行号 id
---------- -----------
1 1
2 2
已用时间: 3.670(毫秒). 执行号:1.
文章
阅读量
获赞