假设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.