• Redo Log概念

  • 规划Redo Log

  • 创建Redo Log组和成员

  • 重新分配、命名Redo Log成员

  • 删除Redo Log组和成员

  • 强制切换日志

  • 验证Redo Log文件块

  • 清理Redo Log 文件

  • Redo Log字典视图

     

Redo Log 概念

Redo Threads

redo log相对于每一个数据库实例都有一个redo线程。典型配置中,仅一个数据库实例访问数据库,所以仅出现一个redo 线程。但在RAC环境中,两个或更多的实例并行访问一个数据库,每一个实例都拥有它自己的redo 线程。分离的redo线程为避免在一个redo log file集上产生竞争,因此这种预估的潜在的瓶颈导致我们需要了解如何对redo log进程配置和管理。

 

Redo Log Contents

redo records(redo记录)被写入至redo log file中,一条redo记录,通常也称为redo entry,是由一组change vectors组成,每一组改变扇区描述数据库的单个块的改动情况。比如,你改变employee表中的一条salary的值,这个改变就包含了改变扇区,其中描述了表的数据段的块、undo段的数据块、和事务表的undo段。

Redo条目记录数据可以用来重构所有数据库的改变,包括undo段。因此,redo log也用于保护回滚数据。当我们通过redo 数据恢复数据库时,数据库读redo记录中的改变扇区以及应用与这些改变相关的块。

Redo记录的缓冲位于SGA的一个循环刷新区成为redo log buffer,这些缓存被LGWR进程写到redo log file中,不管事务何时提交,LGWR都将redo 记录的事务写入到redo log file中。并分配一个SCN(系统改变号)作为每一条已提交事务的redo记录点。

Redo记录也可以在相应事务提交前写入redo log file中,如果redo log buffer已满,或其他事务提交,LGWR将buffer所有的redo log条目刷到redo log file中。即使一些redo记录没及时提交。如果有必要,数据库可以回滚这些改变。

 

Oracle数据库怎样写Redo log

数据库中的redo log通常由一或多个的文件组成。数据库至少保证两个文件中一个总是可以写的,另一个用于归档(当数据库处于归档模式)。

LGWR进程循环刷写redo log文件,当某一个正在使用的redo log写满后,进程会切换到下一个可用的redo log文件中。当最后一个redo log 文件写满后,会切换回第一个redo log 文件进行记录。如下图所示:

Description of Figure 11-1 follows

如果在NOARCHIVELOG模式,一个满载的redo log需要等到其中的改变记录均被写入到数据文件中后才可以重用。

如果在ARCHIVELOG模式,则需要等待改变记录被写到数据文件并归档后才可重用。

 

redo log的活动(当前)和非活动状态

LGWR正在写的redo log文件的状态显示为current,redo log 文件可用于实例恢复的被称为active状态。如果不在需要被用于实例恢复的则为inactive状态。

如果在ARCHIVELOG模式下,直到归档进程(ARCn)完成归档前数据库都不能对该redo log文件重用或覆盖。而在NOARCHIVELOG模式下,LGWR则会等到redo log处于inactive状态时重写该redo log。

 

log switch和log sequence number

日志切换指出数据库停止和开始写的redo log文件。通常,日志切换发送在正在使用的redo log被写满,必须切换到下一个redo log文件。当然也可以配置日志切换的间隔。还可以通过手动进行日志切换。

oracle分配给每个日志文件一个序列号,每当发送切换时LGWR进程就安装顺序写这些日志文件,当归档日志产生时,泽泻归档获取该日志序列号。

 

规划Redo log

  • 多Redo Log 文件

  • 放置Redo Log成员至不同磁盘

  • 规划Redo Log文件大小

  • 规划Redo Log文件的块大小

  • 选择Redo Log文件的数量

  • 控制归档延迟

 

  • 多Redo Log 文件

多日志文件用于保护redo log自身,相当于为自己增加了一份拷贝。oracle可以自动分开维护这些日志文件。最好的习惯是,将日志拷贝放在不同的磁盘中。即使主日志和拷贝日志放在同一磁盘中,拷贝日志也能起到保护I/O错误,预防主日志文件损坏等问题,当一组日志存在多个成员时,LGWR将相同的Redo Log信息并行的写入这些成员中。以防止单点故障。

 Description of Figure 11-2 follows

上图中A_LOG1和B_LOG1日志为group1的成员,A_LOG2和B_LOG2日志为group2的成员,一个组的成员必须是同大小的。且每一个组的成员状态也是一致的,即LGWR在写group1是,不会出现A_LOG1和A_LOG2同时被写的情况。

 

如果LGWR不能将信息写入某个组的成员。那么数据库会将该成员标记为INVALID,并将报错信息记录到关于LGWR进程的跟踪文件和告警日志中。以下列表列出了继红不可写入的情况:

条件 动作
LGWR可以将信息至少写入日志组中的一个成员 写进程正常,LGWR写可用该日志成员忽略不可用的成员。
当发生日志切换时,因为下一个日志组正在归档导致LGWR不能写该日志组 数据库操作进程临时挂起直到该组可用或该组归档完毕。
因为介质失效导致日志切换时LGWR不能访问下一个组的所有成员

数据库返回错误,并关闭实例。这种情况需要从丢失的redo log 文件中进行介质恢复。

如果数据库的checkpoint值超过了丢失redo log,不在需要介质恢复,因为redo中的数据记录已被写入到数据文件中。你只需要删除不可访问的日志组,如果数据库没有多这个故障日志进行归档,删除前使用ALTER DATABASE CLEAR LOGFILE UNARCHIVED来关闭对该日志组的归档。

所有组中的成员均不可访问 数据库返回错误,并关闭实例。这种情况下,如果媒介包含的日志实际上未丢失,需要进行介质恢复。

 

合法和非法的配置

通常情况下,一个组可以有多个成员,且每个组成员数对称。但数据库也允许不对称的情况,即group1只有一个成员,但group2可以有多个成员。以上情况都属于合法的配置,而数据库要求至少有两个组,否则不合法。

Description of Figure 11-3 follows

 

  • 放置Redo Log成员至不同磁盘

 

  • 规划Redo Log文件大小

        Redo Log最小文件大小为4MB

  • 规划Redo Log文件的块大小

    与数据块不同,日志块的大小总是固定等于物理扇区的大小512B,一些高级的磁盘驱动提供4K的扇区用于增加ECC能力和改进格式效率。大多数数据库平台都可以根据这类磁盘驱动将日志的单个块增大到4K。

    虽则单个块的增大。也存在redo浪费的情况。事实上,4K的块相对于512B块的redo浪费更值得关注。redo wastage的信息被记录在V$SESSTAT和V$SYSSTAT视图中。

SELECT NAME,VALUE FROM V$SYSSTAT WHERE NAME='REDO WASTAGE';

可以在CREATE DATABASE,ALTER DATABASE和CREATE CONTROLFILE语句中指定BLOCKSIZE关键字来指定日志块的大小,允许的大小为512、1024和4096

ALTER DATABASE orcl ADD LOGFILE GROUP 4('/u01/oracle/orcl/redo04a.log','/u01/logs/orcl/redo04b.log')  SIZE 100M BLOCKSIZE 512 REUSE;

要确认日志的块大小用以下语句

SQL> SELECT BLOCKSIZE FROM V$LOG;

 

  • 选择Redo Log文件的数量

        在CREATE DATABASE语句中使用MAXLOGFILES参数来决定创建几个redo log组。组的取值范围是1到MAXLOGFILES,也可以根据需求超过MAXLOGFILES的限制

        在CREATE DATABASE语句中使用MAXLOGMEMBERS参数来决定组中的最大成员数,要超过MAXLOGMEMBERS上限的唯一方法是重建数据库或控制文件,因此在创建数据库前,需要考虑清楚。

 

  • 控制归档延迟

可以强制所有可用的日志线程有规律的切换,在一个主备库的配置中,这种改变对备库是可用的,主库通过归档日志传输到备库进行应用。这种情况存在一定的滞后。因为备库必须等待主库归档并传输归档日志到备库。延迟可以通过设置ARCHIVE_LAG_TARGET初始化参数来限定,单位为秒。

 

ARCHIVE_LAG_TARGET的时间取决于当前日志创建和归档当前日志消耗时间的合计。

 

影响ARCHIVE_LAG_TARGET因素

 

日志切换的最长时间

日志切换会发生频率

备库能够容忍的日志丢失数

 

创建日志组和成员

创建组的方式1:

SQL> ALTER DATABASE ADD LOGFILE ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M;

创建组的方式2:

SQL> ALTER DATABASE   ADD LOGFILE GROUP 10 ('/oracle/dbs/log1c.rdo', '/oracle/dbs/log2c.rdo') SIZE 100M BLOCKSIZE 512;

为组增加成员:

SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2b.rdo' TO GROUP 2;

方法2:

SQL> ALTER DATABASE ADD LOGFILE MEMBER '/oracle/dbs/log2c.rdo' TO ('/oracle/dbs/log2a.rdo', '/oracle/dbs/log2b.rdo');

 

重定位和命名日志成员

SQL> SHUTDOWN IMMEDIATEmv /diska/logs/log1a.rdo /diskc/logs/log1c.rdomv /diska/logs/log2a.rdo /diskc/logs/log2c.rdoSQL> CONNECT / as SYSDBASQL> STARTUP MOUNTSQL> ALTER DATABASE RENAME FILE '/diska/logs/log1a.rdo', '/diska/logs/log2a.rdo' TO '/diskc/logs/log1c.rdo', '/diskc/logs/log2c.rdo';SQL> ALTER DATABASE OPEN;

 

删除Redo Log组和成员

SQL> SELECT GROUP#, ARCHIVED, STATUS FROM V$LOG;SQL> ALTER DATABASE DROP LOGFILE GROUP 3;SQL> ALTER DATABASE DROP LOGFILE MEMBER '/oracle/dbs/log3c.rdo';

 

强制日志切换

ALTER SYSTEM SWITCH LOGFILE;

 

验证日志的块

在ALTER SYSTEM语句中使用DB_BLOCK_CHECKSUM参数

 

清理日志文件

ALTER DATABASE CLEAR LOGFILE GROUP 3;

对未归档日志清理

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;

日志数据字典视图

 

The following views provide information on redo logs.

View Description
V$LOG 显示从控制文件中获取的日志信息
V$LOGFILE 验证日志组、成员和成员状态
V$LOG_HISTORY 包含日志历史信息

 

SQL> col group# for 999999SQL> col next_change# for 9999999999999999SQL> select * from v$log; GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS     FIRST_CHANGE# FIRST_TIM      NEXT_CHANGE# NEXT_TIME------- ---------- ---------- ---------- ---------- ---------- --- ---------- ------------- --------- ----------------- ---------      1          1       2429   52428800        512          2 YES INACTIVE         5523932 21-JUL-15           5525184 21-JUL-15      2          1       2431   52428800        512          2 NO  CURRENT          5526351 21-JUL-15   281474976710655      3          1       2430   52428800        512          2 YES INACTIVE         5525184 21-JUL-15           5526351 21-JUL-15

 

SQL> col member for a30SQL> select * from v$logfile; GROUP# STATUS     TYPE    MEMBER                         IS_------- ---------- ------- ------------------------------ ---      2            ONLINE  /u01/oradata/sss/redo02.log    NO      1            ONLINE  /u01/oradata/sss/redo01.log    NO      2            ONLINE  /u01/oradata/sss/redo03.log    NO      1            ONLINE  /u01/oradata/sss/redo04.log    NO      3            ONLINE  /u01/oradata/sss/redo05.log    NO      3            ONLINE  /u01/oradata/sss/redo06.log    NO

 

参考:http://docs.oracle.com/database/121/ADMIN/onlineredo.htm