面试官:正在运行的Oracle数据库删除当前redo会影响新事物提交吗?大多数人都回答错了!

面试官:

请听题,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###

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值