Oracle Online redo log 深入理解

Oracle online redo log是Oracle数据库中核心文件之一。在数据库操作中,只要有任何的数据块变化,都会生成相应的redo entry。redo entry首先保存在log buffer中,最后由lgwr进程写入到Redo log里面。

Online Redo Log的维护和性能是影响Oracle工作的一个重要方面。本文从日常维护角度出发,介绍几个常见的场景处理方法。

1、Redo Log Group和Redo Log Group Member

Redo Log在数据库中的作用主要在于进行实例恢复(Instance Recovery)。当数据库中一个事务提交commit的时候,由server process修改的数据块是不会直接写回到数据文件里面的。commit动作是会引发lgwr进程将事务生成的redo log写入到online redo log file。这样,形成日志在先的策略。

如果此时发生数据库突然的停机,如断电、事故,在内存中的数据块是会丢失的。此时,文件的事务编号与日志的进程是不一致的。在服务器启动的open阶段,Oracle会根据online redo log的记录,从最后一个检查点checkpoint开始,进行数据库事务重演。所以,online redo log对数据库的事务一致性和数据恢复是极其重要的。

Online Redo Log Group是一系列完全相同的online redo log file的集合。在一个数据库中,至少要有两个redo log group交替进行redo log写入操作。但是,我们建议是使用至少三个日志组。

SQL> select group#, sequence#, bytes, members, status from v$log;
                                                                         
    GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
---------- ---------- ---------- ---------- ----------------
        1        217  52428800          2 CURRENT
        2        215  52428800          2 INACTIVE
        3        216  52428800          2 INACTIVE

三个日志组是按照交替的顺序进行读写。我们从视图v$log中,可以看到当前正在使用的日志组。这个视图中,我们着重关注group#,sequence#和status三个视图列。

group#表日志组编号。redo log group的标志是通过组编号来实现的。我们创建group和修改维护group,都是通过制定group#完成。

sequence#表示日志顺序号。每个日志都是唯一的,分配给日志的编号也是唯一的。这个就是sequence#编号,这个编号会随着archive redo log一起记录。

status表示当前日志的所处状态,常见的有active,current,inactive和unused。下面详细介绍一下几个状态的含义:

üCurrent:表示当前正在进行写入的日志组,也是最新的日志组;

üActive:当一个事务完成commit之后,redo entry写入到了日志文件。并且这个日志已经不是当前current,但是对应的数据块data block还没有从buffer cache中写入到文件中。此时,日志组状态为active。处在active状态的日志组,是不能够被覆盖和删除的;

üInactive:日志并不是当前正在读写的日志,并且对应的事务数据块都已经写回到数据文件中;

üUnused:表示新创建的online日志组,还没有使用过;

下面再来说一说redo group member。在每个redo log group中,都有一个或者多个完全相同的log file。在一个组内,log file完全相同,一个写入日志动作要在组内所有的文件上写入成功之后,才算写入完成。

在生产条件下,redo group member通常是放置在不同的磁盘存储日志文件。进行这种“multi-path”配置的理由就在于冗余防错。当一个文件出现损坏,虽然一时不能启动数据库,但是我们可以方便利用其它副本进行替换。

在诸多的Oracle文件中,采用相同multi-path保存配置的还有控制文件control file。

此处有一点需要注意:很多系统由于各种原因,配置的多路径过多,反而影响效率。相同的redo log在一个文件中写入的时间和十个文件中写入的时间天差地别。配置多路径目的是利用物理冗余防错,过多的冗余事倍功半。

2、常用的Redo Log调整操作

在Oracle安装的时候,我们是可以调整Redo Log的大小和组数。同时,在系统运行过程中,我们也可以对现有的日志进行调整。下面是常见的集中类型的redo log操作实例。我们选择Oracle 11R2进行试验。

SQL> select * from v$version;
                                                                   
BANNER
------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE        11.2.0.1.0        Production

注意:进行redo log的调整,一定要选择系统相对空闲的时候,避免业务高峰期。特别是生产环境尤其重要。

ü查看当前redo 情况

通过视图v$log和v$logfile可以分别查看当前的日志组和文件情况。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/416ee93b2e6d99130c5826eca336ff82.html