chinapkw 发表于 2013-1-15 02:46:57

男人oracle,current redo log 实验

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.ctlcontrol03.ctlredo01.logsysaux01.dbftemp01.dbf   users01.dbfcontrol02.ctlexample01.dbfredo02.logsystem01.dbfundotbs01.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 Area243269632 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 的缓存问题。
 
页: [1]
查看完整版本: 男人oracle,current redo log 实验