男人oracle,current redo log 实验

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

 

你可能感兴趣的:(thread,oracle,linux,OS)