两种方式恢复误删除的oracle文件

本文介绍在Oracle 11g环境下通过两种方法恢复误删的数据文件:一是使用SQL命令如alter database create datafile进行恢复;二是通过复制Linux进程中文件句柄的方式恢复,并详细展示了每一步骤的操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用create datafile以及拷贝进程句柄两种方式恢复误删除的oracle文件。推荐使用alter database create datafile 方式。


测试环境:

SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL>

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /archive
Oldest online log sequence     90
Next log sequence to archive   92
Current log sequence           92
SQL>


测试数据准备:
SQL> select name from v$tablespace;

NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
USERS
TEMP
TESTTBS               //测试用表空间
6 rows selected.
SQL>

SQL> select * from tt;
        ID NAME
---------- ----------
         0 kk
SQL>
SQL> insert into tt values (1,'tom');  //插入测试数据
1 row created.
SQL> commit;
Commit complete.
SQL>

SQL>
SQL> select * from tt;  //恢复后可以查询到这两条记录即可

        ID NAME
---------- ----------
         0 kk
         1 tom


SQL>

SQL> select file_id,file_name,tablespace_name from dba_data_files;

SQL> set line 300
SQL>
SQL> /

   FILE_ID FILE_NAME                                                    TABLESPACE_NAME
---------- ------------------------------------------------------------ ------------------------------
         4 /u01/app/oracle/oradata/orcl/users01.dbf                     USERS
         3 /u01/app/oracle/oradata/orcl/undotbs01.dbf                   UNDOTBS1
         2 /u01/app/oracle/oradata/orcl/sysaux01.dbf                    SYSAUX
         1 /u01/app/oracle/oradata/orcl/system01.dbf                    SYSTEM
         5 /u01/app/oracle/oradata/orcl/testtbs.dbf                     TESTTBS

SQL>


方法一:alter database create datafile ' ',alter database recover datafile ' ',alter tablespace ' 'online(此方式可以关闭数据库,利用archive和redo文件恢复数据。)

SQL> host rm /u01/app/oracle/oradata/orcl/testtbs.dbf
SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> select * from tt;
select * from tt
*
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/testtbs.dbf'  //系统已经报错

SQL>
SQL> alter database create datafile '/u01/app/oracle/oradata/orcl/testtbs.dbf';  //step1,create datafile

Database altered.

SQL> recover datafile '/u01/app/oracle/oradata/orcl/testtbs.dbf';  //step2,recover datafile
ORA-00279: change 1474613 generated at 01/20/2016 09:49:10 needed for thread 1
ORA-00289: suggestion : /archive/1_82_898310472.dbf
ORA-00280: change 1474613 for thread 1 is in sequence #82


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: change 1474972 generated at 01/20/2016 09:51:50 needed for thread 1
ORA-00289: suggestion : /archive/1_83_898310472.dbf
ORA-00280: change 1474972 for thread 1 is in sequence #83


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: change 1474975 generated at 01/20/2016 09:51:52 needed for thread 1
ORA-00289: suggestion : /archive/1_84_898310472.dbf
ORA-00280: change 1474975 for thread 1 is in sequence #84


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: change 1474979 generated at 01/20/2016 09:51:54 needed for thread 1
ORA-00289: suggestion : /archive/1_85_898310472.dbf
ORA-00280: change 1474979 for thread 1 is in sequence #85


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: change 1474983 generated at 01/20/2016 09:51:54 needed for thread 1
ORA-00289: suggestion : /archive/1_86_898310472.dbf
ORA-00280: change 1474983 for thread 1 is in sequence #86


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

ORA-00279: change 1474990 generated at 01/20/2016 09:51:57 needed for thread 1
ORA-00289: suggestion : /archive/1_87_898310472.dbf
ORA-00280: change 1474990 for thread 1 is in sequence #87


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

Log applied.
Media recovery complete.
SQL>
SQL> alter tablespace testtbs online;  //step3 alter tablespace online

Tablespace altered.

SQL>
SQL> select * from tt;   //完成

        ID NAME
---------- ----------
         0 kk
         1 tom

SQL>

方法二:cp /proc/进程id/fd/*******  /****/testtbs.dbf 拷贝linux句柄(句柄不明白啥意思,姑且先这样写),recover datafile恢复数据(此方式数据库不能关闭)。

SQL> host rm /u01/app/oracle/oradata/orcl/testtbs.dbf

SQL> select * from tt;

        ID NAME
---------- ----------
         0 kk
         1 tom

SQL>
SQL> alter system switch logfile;

System altered.

SQL>
SQL> select * from tt;
select * from tt
*
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/testtbs.dbf'
SQL>

[oracle@training proc]$             //切换oracle系统账号
[oracle@training proc]$ ps -ef |grep dbw         //查询dbwr进程id
oracle    3601     1  0 01:31 ?        00:00:00 ora_dbw0_orcl
oracle    3789  3758  0 01:32 pts/2    00:00:00 grep dbw
[oracle@training proc]$ cd /proc/3601/fd

[oracle@training fd]$ ll
total 0
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 0 -> /dev/null
l-wx------ 1 oracle oinstall 64 Jan 21 01:32 1 -> /dev/null
l-wx------ 1 oracle oinstall 64 Jan 21 01:32 10 -> /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_3559.trc
l-wx------ 1 oracle oinstall 64 Jan 21 01:32 11 -> /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_3559.trm
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 12 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 13 -> /dev/zero
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 14 -> /proc/3601/fd
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 15 -> /dev/zero
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 16 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_orcl.dat
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 17 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkORCL
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 18 -> /u01/app/oracle/oradata/orcl/control01.ctl
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 19 -> /u01/app/oracle/flash_recovery_area/orcl/control02.ctl
l-wx------ 1 oracle oinstall 64 Jan 21 01:32 2 -> /dev/null
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 20 -> /u01/app/oracle/oradata/orcl/system01.dbf
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 21 -> /u01/app/oracle/oradata/orcl/sysaux01.dbf
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 22 -> /u01/app/oracle/oradata/orcl/undotbs01.dbf
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 23 -> /u01/app/oracle/oradata/orcl/users01.dbf
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 24 -> /u01/app/oracle/oradata/orcl/testtbs.dbf (deleted)    //数据文件已经标记为删除
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 25 -> /u01/app/oracle/oradata/orcl/temp01.dbf
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 26 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/mesg/oraus.msb
l-wx------ 1 oracle oinstall 64 Jan 21 01:32 3 -> /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/log/orcl_ora_3559.trc
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 4 -> /dev/null
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 5 -> /dev/null
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 6 -> /dev/null
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 7 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/hc_orcl.dat
lrwx------ 1 oracle oinstall 64 Jan 21 01:32 8 -> /u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkinstorcl (deleted)
lr-x------ 1 oracle oinstall 64 Jan 21 01:32 9 -> /proc/3601/fd
[oracle@training fd]$

[oracle@training fd]$ cp 24  /u01/app/oracle/oradata/orcl/tbs1.dbf  //此处数据文件有变化,试验中上面句柄文件不知道为什么会消失,后重新创建其他名字的表空间,继续实验。

SQL>

SQL> recover datafile '/u01/app/oracle/oradata/orcl/tbs1.dbf'
ORA-00283: recovery session canceled due to errors
ORA-01124: cannot recover data file 5 - file is in use or recovery
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/tbs1.dbf'

SQL> alter tablespace tbs1 offline;

Tablespace altered.

SQL> recover datafile ' /u01/app/oracle/oradata/orcl/tbs1.dbf'
ORA-01179: file  /u01/app/oracle/oradata/orcl/tbs1.dbf does not exist

SQL> host ls -l  /u01/app/oracle/oradata/orcl/tbs1.dbf
-rw-r----- 1 oracle oinstall 10493952 Jan 21 01:47 /u01/app/oracle/oradata/orcl/tbs1.dbf

SQL>
SQL> recover datafile 5;
Media recovery complete.
SQL> alter tablespace tbs1 online;

Tablespace altered.

SQL>
SQL> select * from tt;

        ID NAME
---------- --------
         0 kk
         1 tom

SQL>



 --完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值