oracle 是日志前写式数据库,即在写入数据文件一定先保证日志写完。
下面这个测试。是在没有当前日志组的情况,提交依然可以正常保存数据。
可以想想为什么,以便更深入理解oracle内部运做。
以sys用户登陆,查看当前redo log 信息
SYS->select group#,status from v$log; GROUP# STATUS ---------- ------------------------------------------------ 1 UNUSED 2 UNUSED 3 CURRENT SYS->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.dbf control02.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->startup ORACLE instance started. Total System Global Area 243269632 bytes Fixed Size 1218748 bytes Variable Size 83887940 bytes Database Buffers 155189248 bytes Redo Buffers 2973696 bytes Database mounted. ORA-00313: open failed for members of log group 3 of thread 1 ORA-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 的缓存问题。