Oracle Redo log 状态及工作原理解析

Posted 李晓LOVE向阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Redo log 状态及工作原理解析相关的知识,希望对你有一定的参考价值。

一码不扫何以扫天下,扫码有福利

Redo Log简介

Oracle的数据库日志称为redo log,所有数据改变都记录redo log,可以用于修复受损的数据库。大型数据库都采用日志。Redo日志是分组的,一个库至少需要两组,默认是三组。每个组内的redo日志称为成员。默认情况下,每个组只有一个成员,这样没有冗余性,可能造成online redo log的丢失,要提高数据的可靠性,应该为每个组至少配置两个成员,并将这两个成员分配到不同的磁盘上。

Redo日志是轮流使用的,一个redo log满了,LGWR会切换到下一组redo log,这种操作称为log switch,做log switch的同时也会做checkpoint,相应的信息还会写入控制文件。

也可以手工执行log switch或checkpoint操作

备注:

LGWR是Oracle的后台进程之一。

LGWR的作用是把日志缓存区的数据从内存写到磁盘的REDO文件里,完成数据库对象创建、更新数据等操作过程的记录。

Redo Log日志状态

Oracle Redo Log日志组通常有四种状态,即unused,inactive,active,current。

unused:通常指从未被使用的日志组,即新添加的日志组。

current:状态为LGWR进程正把redo log buffer的日志写进日志组中。

active:为刚刚完成日志切换后的状态,此时该日志组中提交的事务引起的数据改变还没有完全从DB buffer cache写入到数据文件中,因此该日志组还不能被覆盖,并且待完全写入后变为inactive状态。如果数据库为归档模式,那么是在该状态下完成归档的。

inactive:状态的日志可以被覆盖,可以允许写入日志。如果是在归档模式下,那么此阶段证明归档已经完成。

Redo Log操作

手工执行log switch(手动归档)或checkpoint操作

SQL> alter system switch logfile;
System altered.
 
SQL> alter system checkpoint;
System altered.

查看Oracle数据库当前日志组,以及状态

SQL> select GROUP#,BYTES,MEMBERS,ARCHIVED,STATUS from v$log;

查看 Redo Log日志文件、新增Redo Log日志组以及组成员

SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/home/oracle/oradata/gldb/redo03.log
/home/oracle/oradata/gldb/redo02.log
/home/oracle/oradata/gldb/redo01.log
 
可以在线添加online redo log组:
 
SQL> alter database add logfile group 4 ('/home/oracle/oradata/gldb/redo04.log') size 1m;
Database altered.
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/home/oracle/oradata/gldb/redo03.log
/home/oracle/oradata/gldb/redo02.log
/home/oracle/oradata/gldb/redo01.log
/home/oracle/oradata/gldb/redo04.log
 
可以在线添加online redo log组成员:
 
SQL> alter database add logfile member '/home/oracle/oradata/gldb/redo01b.log' to group 1;
Database altered.
 
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/home/oracle/oradata/gldb/redo03.log
/home/oracle/oradata/gldb/redo02.log
/home/oracle/oradata/gldb/redo01.log
/home/oracle/oradata/gldb/redo04.log
/home/oracle/oradata/gldb/redo01b.log
 
在线删除刚才添加的组和组成员:
 
SQL> alter database drop logfile group 4;
Database altered.
 
SQL> alter database drop logfile member '/home/oracle/oradata/gldb/redo01b.log';
Database altered.
 
SQL>  select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/home/oracle/oradata/gldb/redo03.log
/home/oracle/oradata/gldb/redo02.log
/home/oracle/oradata/gldb/redo01.log

Redo Log日志状态分析

查看当前日志组状态

SQL> select GROUP#,BYTES,MEMBERS,ARCHIVED,STATUS from v$log;

我们进行手动归档,再看状态

SQL> alter system switch logfile;

发现组一已经从不活跃(inactive)变为运行中(current),组二已经从当前(current)变为了active,组三、四状态不变。说明命令使得日志的写入切换至第一组,第二组正在进行归档和进行必要的数据写入至datafile。待这两项工作完成后再看下图

组二由active变为inactive说明组二已经完成了归档,可以允许下一次写入了。在非归档下组二的状态也可以变为inactive说明完成了数据从DB BUFFER CACHE写入至DB files。

总结

上述实验很好的说明了oracle日志组在整个生命周期所具有的状态。当然没有看到unused状态,这种状态是当日志组刚新添到数据库后的状态,这种操作在生产环境中很少,所以本次实验没有看到这种状态。

另外有人会认为在手动日志切换时为什么使用命令alter system archive log current。这里也做一个说明。

两组命令最后的效果一样。alter system switch logfile是不等归档完成就进行switch logfile操作,速度快,尤其在非归档模式下适用,对当前实例生效。而alter system archive log current要等待归档完成才操作,对所有实例生效

关注微信公众号,获得更多小知识

 

以上是关于Oracle Redo log 状态及工作原理解析的主要内容,如果未能解决你的问题,请参考以下文章

数据库原理 - 序列3 - 事务是如何实现的? - Redo Log解析

查看Oracle的redo日志切换频率

数据库原理 - 序列4 - 事务是如何实现的? - Redo Log解析(续)

InnoDB事务之redo log工作原理

oracle联机重做日志文件(online redo log file)

Oracle redo 日志切换时间频率