|
|
oracle 是日志前写式数据库,即在写入数据文件一定先保证日志写完。
下面这个测试。是在没有当前日志组的情况,提交依然可以正常保存数据。
可以想想为什么,以便更深入理解oracle内部运做。
以sys用户登陆,查看当前redo log 信息
SYS->select group#,status from v$log; GROUP# STATUS---------- ------------------------------------------------ 1 UNUSED 2 UNUSED 3 CURRENTSYS->select group#,member from v$logfile; GROUP# MEMBER---------- ---------------------------------------- 3 /opt/app/oracle/oradata/orcl/redo03.log 2 /opt/app/oracle/oradata/orcl/redo02.log 1 /opt/app/oracle/oradata/orcl/redo01.log 删除current log redo03.log
SYS->! rm /opt/app/oracle/oradata/orcl/redo03.log -rf 确认是否删除了
SYS->! ls /opt/app/oracle/oradata/orcl/control01.ctl control03.ctl redo01.log sysaux01.dbf temp01.dbf users01.dbfcontrol02.ctl example01.dbf redo02.log system01.dbf undotbs01.dbf 现在数据活的依然很健康,在没有current redo log的情况,那我们试一下在这样的情况,创建表,写入数据,会不会丢失。
SYS->create table test_redo(id number(1));Table created.SYS->insert into test_redo values(1);1 row created.SYS->insert into test_redo values(2);1 row created.SYS->select * from test_redo; ID---------- 1 2 创建了一个测试表,并插入2条记录。没有报错,现在commit一下.
SYS->commit; Commit complete.
Commit 也没报错,下面正常 关闭数据库
SYS->shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down. 启动时,报错了。
SYS->startupORACLE instance started.Total System Global Area 243269632 bytesFixed Size 1218748 bytesVariable Size 83887940 bytesDatabase Buffers 155189248 bytesRedo Buffers 2973696 bytesDatabase mounted.ORA-00313: open failed for members of log group 3 of thread 1ORA-00312: online log 3 thread 1: '/opt/app/oracle/oradata/orcl/redo03.log' 我们恢复一下,重新生成redo log
SYS->recover database until cancel;Media recovery complete.SYS->alter database open resetlogs;Database altered. 可以看到。数据没有丢失。
SYS->select * from test_redo; ID---------- 1 2 接下来的试验。就是alter system swith logfile
就是说。oracle打开日志后。就认为current log 存在,并直接写入物理上的log 就好
而linux rm 只是删除inode 而实在物理地址还在
oracle 并不知道,当你触发其它的动作重新要current log 时。会发现current log 已经不存了。
所以并不是网上有些人说的是os 的缓存问题。
|
|