ASP站长网假设Oracle丢失的是所有的redo日志组,分下列几种情况分别处理:
Oracle没开归档,一致性关闭数据库
Oracle没开归档,非一致性关闭数据库
Oracle开归档,一致性关闭数据库
Oracle开归档,非一致性关闭数据库
一:Oracle没开归档,一致性关闭数据库
我做实验的过程中有一个诡异的情况,我先把redo文件从操作系统层面都删除了,但是数据库正常创建表,insert数据,我理解的是当你commit的时候,会触发lgwr进程从redo log buffer中涮新redo 到redo 文件中,但是redo文件已经被删除了,就会报错,但是他并没有报错:
[root@testdb59 /data/u01/app/oracle/oradata/stdb59]# ll
total 13697796
-rw-r----- 1 oracle oinstall 144916480 Apr 5 22:30 control01.ctl
-rw-r----- 1 oracle oinstall 2147491840 Apr 5 22:26 liuwenhe.dbf
-rw-r----- 1 oracle oinstall 52429312 Apr 5 22:26 redo01.log
-rw-r----- 1 oracle oinstall 52429312 Apr 5 22:29 redo03.log
-rw-r----- 1 oracle oinstall 4938801152 Apr 5 22:26 soe3.dbf
-rw-r----- 1 oracle oinstall 2469404672 Apr 5 22:26 soe.dbf
-rw-r----- 1 oracle oinstall 2705334272 Apr 5 22:26 sysaux01.dbf
-rw-r----- 1 oracle oinstall 786440192 Apr 5 22:26 system01.dbf
-rw-r----- 1 oracle oinstall 30416896 Oct 16 12:37 temp01.dbf
-rw-r----- 1 oracle oinstall 1073750016 Apr 5 22:26 temp.dbf
-rw-r----- 1 oracle oinstall 309338112 Apr 5 22:26 undotbs01.dbf
-rw-r----- 1 oracle oinstall 166469632 Apr 5 22:26 users01.dbf
删除redo 文件
[root@testdb59 /data/u01/app/oracle/oradata/stdb59]# rm *.log
再次查看,发现确实已经没有了redo文件
[root@testdb59 /data/u01/app/oracle/oradata/stdb59]# ll
total 13595388
-rw-r----- 1 oracle oinstall 144916480 Apr 5 22:50 control01.ctl
-rw-r----- 1 oracle oinstall 2147491840 Apr 5 22:50 liuwenhe.dbf
-rw-r----- 1 oracle oinstall 4938801152 Apr 5 22:50 soe3.dbf
-rw-r----- 1 oracle oinstall 2469404672 Apr 5 22:50 soe.dbf
-rw-r----- 1 oracle oinstall 2705334272 Apr 5 22:50 sysaux01.dbf
-rw-r----- 1 oracle oinstall 786440192 Apr 5 22:50 system01.dbf
-rw-r----- 1 oracle oinstall 30416896 Oct 16 12:37 temp01.dbf
-rw-r----- 1 oracle oinstall 1073750016 Apr 5 22:41 temp.dbf
-rw-r----- 1 oracle oinstall 309338112 Apr 5 22:50 undotbs01.dbf
-rw-r----- 1 oracle oinstall 166469632 Apr 5 22:50 users01.dbf
SQL> create table t(int int);
Table created.
SQL> insert into t values (100);
1 row created.
SQL> commit;
SQL>alter system switch logfile;
System altered.
SQL> alter system checkpoint;
System altered.
有点理解不了!!!!问了下老师,才知道原来是打开的文件句柄还在,重启之后就没有了!就会报错
(体外话:也就是说rm这个文件了,但是这个文件实际上还是存在的,先说一下他的工作原理吧,然后我在把试验分享给大家, 工作原理其实也不难,这个工具需要在ext3或者ext4 的文件系统上才可以实现,因为ext3文件系统是日志型文件系统,ext3文件系统储存信息的时候是由inode号和block块存储的。
神马? 不知道什么是inode号?和block块? 好吧,在说明白点,比如:一个分区比如一本书,那么block块就是书每页的内容,而inode号 就是书的目录,系统找文件的时候先找inode号 然后根据inode号去找硬盘上的block快信息,明白了吧!
在说一下删除的原理吧。 当硬盘上的一个文件删除,其实没有真正想象中的那样在硬盘上清除掉的,他是把inode号和block块的那个链子 断开,但是真正的数据还是在硬盘上的,有没有感觉在windos上删除是那么快,没考虑到这吧,当你在删除文件的地方重新复制了新文件,那时候才会把之前的文件覆盖掉,也就是说删除了没有关系,千万不要往那个位置放文件了)
因为数据库是一致性关闭的,也就是不需要实例恢复,也就不需要丢失的redo,所以可以直接删除重建,当然也可以recover database 来恢复丢失的redo,所以针对这种情况,有两种恢复方式:
方法一:直接clear相应的redo日志组!也就是删除重新建立!
SQL> shutdown immediate #一致性关闭
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2253664 bytes
Variable Size 1275071648 bytes
Database Buffers 318767104 bytes
Redo Buffers 7319552 bytes
Database mounted.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 30641
Current log sequence 30642
清理删除从新建立或者直接clear所有的redo 日志组,包括当前状态的和active状态的redo 日志组!
SQL> alter database clear logfile group 1;
Database altered.
SQL> alter database clear logfile group 3;
Database altered.
SQL> alter database open ;
Database altered.
方法二:recover的方式恢复重做日志,我的实验过程中,有的时候这个方法会报错,如果报错那么就使用第一种方式恢复!
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 830930944 bytes
Fixed Size 2257800 bytes
Variable Size 536874104 bytes
Database Buffers 289406976 bytes
Redo Buffers 2392064 bytes
Database mounted.
SQL>
###恢复丢失的redo文件,但是需要open resetlogs之后才能自动创建上!
SQL> recover database until cancel;
Media recovery complete.
SQL> alter database open resetlogs;
Database altered.
二:Oracle没开归档,非一致性关闭数据库
[root@testdb59 /data/u01/app/oracle/oradata/stdb59]# rm -f *.log
SQL> shu abort ###非一致性关闭数据库
ORACLE instance shut down.
这个时候尝试使用前面的clear或者recover database都会报错,无法恢复,因为这个时候是需要做实例恢复的,那么什么时候需要实例恢复的判断依据,请参考另一篇文章(Oracle原理-----关于oracle实例恢复的前滚和回滚的理解),报错如下:
首先尝试重建,当你尝试clear当前的日志组的时候,会报错提示是需要的!!!因为非一致性关闭确实需要使用丢失的active和current状态的redo来实例恢复!
首先启动数据库到mount状态
SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR at line 1:
ORA-01624: log 3 needed for crash recovery of instance stdb59 (thread 1)
ORA-00312: online log 3 thread 1:
'/data/u01/app/oracle/oradata/stdb59/redo03.log'
然后尝试recover database,结果肯定不可以,因为实例恢复需要的redo已经丢失!!
SQL> recover database until cancel;
ORA-00279: change 21959466 generated at 04/06/2019 21:15:45 needed for thread 1
ORA-00289: suggestion :
/data/u01/app/oracle/fast_recovery_area/STDB59/archivelog/2019_04_06/o1_mf_1_2_%
u_.arc
ORA-00280: change 21959466 for thread 1 is in sequence #2
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data/u01/app/oracle/oradata/stdb59/system01.dbf'
ORA-01112: media recovery not started
SQL> alter database open RESETLOGS;
alter database open RESETLOGS
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data/u01/app/oracle/oradata/stdb59/system01.dbf'
那么针对这种情况,恢复的方式如下:
使用一个隐含参数_allow_resetlogs_corruption强制启动数据库,设置此参数之后,在数据库Open过程中,Oracle会跳过某些一致性检查,从而使数据库可能跳过不一致状态,到达open数据库的目的
SQL> create pfile='/home/oracle/pfile.ora' from spfile;
File created.
然后在/home/oracle/pfile.ora添加上
*._allow_resetlogs_corruption=true
SQL> startup mount pfile='/home/oracle/pfile.ora';
SQL> recover database until cancel; #恢复丢失的redo文件
ORA-00279: change 21959471 generated at 04/06/2019 22:34:01 needed for thread 1
ORA-00289: suggestion :
/data/u01/app/oracle/fast_recovery_area/STDB59/archivelog/2019_04_06/o1_mf_1_2_%
u_.arc
ORA-00280: change 21959471 for thread 1 is in sequence #2
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data/u01/app/oracle/oradata/stdb59/system01.dbf'
ORA-01112: media recovery not started
幸运的话就可以直接以resetlogs方式open数据库了!
SQL> alter database open RESETLOGS;
Database altered.
如果遇到下面的错误,那么你就得重建控制文件了:
SQL> alter database open RESETLOGS;
alter database open RESETLOGS
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [2662], [0], [21959484], [0],
[21959877], [4194545], [], [], [], [], [], []
Process ID: 13177
Session ID: 63 Serial number: 5
重建数据库控制文件
1)直接使用如下alter database backup controlfile这种会报错
SQL> alter database backup controlfile to trace as '/data/u01/control_rebuild.trc';
alter database backup controlfile to trace as '/data/u01/control_rebuild.trc'
*
ERROR at line 1:
ORA-16433: The database must be opened in read/write mode.
2)还可以使用如下特定的格式来重建,
查询数据库的redo 信息:
SQL> select GROUP#,MEMBER from v$logfile;
GROUP# MEMBER
3 /data/u01/app/oracle/oradata/stdb59/redo03.log
1 /data/u01/app/oracle/oradata/stdb59/redo01.log
查询数据库的datafile信息
SQL> select MEMBER from v$logfile;
MEMBER
大型站长资讯类网站! https://www.0792zz.cn