oracle的一个bug

本来是想测试连接日志文件删除时,oracle实例会出现什么问题。结果没成想,一测试居然测试出了oracle的一个bug。


os:redhat linux 9.0
oracle: 9.2.0.4

首先测试的是noarchive模式下的情形。
SQL> select group#,status from v$log;

GROUP# STATUS
---------- ----------------
1 UNUSED
2 UNUSED
3 CURRENT

SQL> select member from v$logfile where group#=3;

MEMBER
--------------------------------------------------------------------------------
/orasoft/ora9/oradata/ora9i/redo03.log

SQL> host rm /orasoft/ora9/oradata/ora9i/redo03.log

SQL> host
[oracle@linuxsrv ora9i]$ ll redo*
-rw-r----- 1 oracle dba 10486272 May 28 16:37 redo01.log
-rw-r----- 1 oracle dba 10486272 May 28 16:37 redo02.log
[oracle@linuxsrv ora9i]$ exit
exit

SQL> insert into t select * from user_objects;

13684 rows created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> select group#,status from v$log;

GROUP# STATUS
---------- ----------------
1 CURRENT
2 UNUSED
3 ACTIVE

SQL>

我运行insert以后,并commit,照理来说,应该会把redo buffer里的redo entry刷新到current的redo log file ,也就是redo03.log里。
但是该文件都已经给删除了,oracle居然没有报错。

然后我又测试了archive模式下的情形。将current的redo log删除,居然也能生成current的redo log对应的archive log file。

SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /orasoft/ora9/product/9.2/dbs/arch
Oldest online log sequence 2
Next log sequence to archive 3
Current log sequence 3
SQL> select group#,status from v$log;

GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 UNUSED

SQL> select member from v$logfile where group#=2;

MEMBER
--------------------------------------------------------------------------------
/orasoft/ora9/oradata/ora9i/redo02.log

SQL> host rm /orasoft/ora9/oradata/ora9i/redo02.log

SQL> select group#,status from v$log;

GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 UNUSED

SQL> select count(*) from t;

COUNT(*)
----------
27368

SQL> insert into t select * from user_objects;

13684 rows created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> select name from v$archived_log;

NAME
--------------------------------------------------------------------------------
/orasoft/ora9/product/9.2/dbs/arch1_2.dbf

SQL>

这样看来,将数据库设置为archive模式,当switch log file时将online redo log file生成archive log file时并不是实际打开
current redo log file,读取内容,然后写入archived log file。否则,如果是会打开current redo log file的话,那应该会发现该
redo log file已经不存在了。

在commit成功以后,如果这时instance crash了,那么提交的数据就丢失了。
我试过在commit以后,立即shutdown abort,再startup以后,提交的数据已经没有了。
这真可算是oracle的一个bug了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9842/viewspace-156308/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9842/viewspace-156308/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值