本来是想测试连接日志文件删除时,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/