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 的缓存问题。