ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle的一个bug

oracle的一个bug

原创 Linux操作系统 作者:hanson 时间:2019-03-09 10:36:06 0 删除 编辑

本来是想测试连接日志文件删除时,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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2002-04-14

  • 博文量
    16
  • 访问量
    10509