面试官:
请听题,Number 1,说,一个正常运行的Oracle数据库,如果直接rm删除当前current redo log file,新的事物可以正常提交吗?
小陈:
有能耐你给我整个高级一点的题目,这么简单的问题还用问吗,commit会触发lgwr进程,将redo log buffer里的数据写入到current redo log file,文件都没了,还玩什么呀?当然是提交失败了!
面试官:
Are You Sure?
小陈:
Are You OK?
面试官:
你好像不太服的样子,下面我给你演示一遍,请看大屏幕:
环境说明:
DB:Oracle 11.2.0.4.0
查看当前日志是GROUP #1,redo01.log
SET LINE 300
为了方便分析,我们strace一下lgwr进程
[root@cjc-db-02 ~]# strace -fr -o tmp/2733_redo.log -p 2733
模拟误删除,直接删除current redo log file,我玩的就是真实
[oracle@cjc-db-02 cjc]$ cd oradata/cjc
然后插入新的数据:
insert into cjc.t1 values(1);
注意了,我要提交了,下面是见证奇迹的时刻!
commit;
提交成功!
不用惊讶,是不是很好奇为什么还能正常提交数据,请看strace日志:
2733 0.000628 times({tms_utime=8, tms_stime=10, tms_cutime=0, tms_cstime=0}) = 429603601
看到pwrite64 258了吗,commit时,后台lgwr进程在向258文件写数据。那么258是什么呢?
[root@cjc-db-02 cjc]# ls -lrth proc/2733/fd/258
没错,就是文件句柄,虽然redo01.log被删除了,但文件句柄还在,事物还可以继续提交。
**面试官:
**
现在知道为什么可以继续提交事物了吧,再给你一次机会,继续问你,当前环境下,如何恢复current redo log file?
小陈:
这个问题还有必要问吗?把258文件拷贝到/oradata/cjc目录下重命名redo01.log不就行了。
面试官:
Are You Sure? 你也别跟我Are You OK了,我再问你,现在将258文件拷贝为redo01.log,但是日志数据仍然是在写258文件,新拷贝的redo01.log马上就会变旧,这种情况下如果重启数据库还能正常OPEN吗?还是不服吗,请继续看大屏幕:
我先演示一遍你说的解决方案,也是错误的示范,请勿模仿:
把258文件拷贝为redo01.log后,过段时间,重启数据库,发现无法OPEN:
SQL> shutdown immediate
检查告警日志,报错如下:
ARC2: Becoming the heartbeat ARCH
可以看到,报错:
ORA-00322: log 1 of thread 1 is not current copy
这种情况如何OPEN数据库呢,RMAN advise会给你提供方法:
列出故障:
[oracle@cjc-db-02 ~]$ rman target
给出建议
RMAN> advise failure;
执行恢复
RMAN> repair failure;
此时数据库已经OPEN了。
面试官:
再给你最后一次机会,还有更好的办法解决这个问题吗?要求下次重启可以直接OPEN,不需要进行恢复?
小陈:
我想到了,既然丢失了current redo logfile后还可以继续提交新事物,那么理论上也应该可以继续切换日志吧,那么只要把丢失的redo01.log切换为非当前日志,不就可以删除或clear为所欲为了吗,哈哈,让我来演示一遍吧:
回到刚才的问题,current redo logfile还是刚才丢失的redo01.log;
SET LINE 300
此时,虽然还可以继续提交事物,但数据库已经发现redo01.log文件丢失了,告警日志如下:
Wed Apr 17 12:40:59 2024
下面,执行日志切换,将redo01.log切换为非日志组,可以切换:
SQL> alter system switch logfile;
生成一次检查点:
SQL> alter system checkpoint;
检查日志状态:此时redo01.log已经不是current了
SET LINE 300
但redo01.log的ARCHIVED状态是NO,也就是未归档状态,此时是无法执行drop logfile操作的,会报如下错误:
SQL> alter database drop logfile group 1;
[oracle@cjc-db-02 ~]$ oerr ora 00350
但可以执行clear
SQL> alter database clear unarchived logfile group 1;
查看又自动生成新的redo01.log文件了
[oracle@cjc-db-02 cjc]$ ls -lrth redo0*
检查数据也是正常的
SQL> select * from cjc.t1;
之后测试,重启、多次切换日志等都没有问题
SQL> shutdown immediate
搞定,收工!
面试官:
小伙子不错,有钱途,我看好你,居然懂得举一反三,今天面试就先到这吧,你还有什么要问我的?
小陈:
叮铃铃…那个我要接个电话,你,你,还有你出去一下!
面试官:
好的 …,唉,不对呀,我是面试官,这是我公司呀!
欢迎关注我的公众号《IT小Chen》
###chenjuchao 20240417###
4735

被折叠的 条评论
为什么被折叠?



