Oracle Redo log

Redo Logs概述

The redo log records all changes made to data, including both uncommitted and committed changes.

Oracle通过Redo来保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。在数据库中,Redo的功能主要通过3个组件来实现:Redo Log BufferLGWR后台进程Redo Log File(在归档模式下,Redo Log File最终会经由ARCn进程写出为归档日志文件)。

Oracle Redo log_第1张图片

Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其保存数据库变更的相关信息。这些信息以重做条目(Redo Entries)形式存储(Redo Entries也经常称为Redo Records)。Redo Entries包含重构、重做数据库变更的重要信息,这些变更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。

Redo Entries的内容被Oracle数据库进程从用户的内存空间(PGA)复制到SGA中的Redo Log Buffer之中Redo Entries在内存中占用连续的顺序空间,由于Redo Log Buffer是循环使用的,Oracle通过一个后台进程LGWR不断把Redo Log Buffer的内容写出到Redo Log File中,Redo Log File同样是循环使用的。


使用场景

比如我们昨天晚上备份了数据库,但是今天中午发现磁盘坏掉了,那么我怎样恢复。

我们先通过备份文件恢复到昨天晚上,然后再通过归档Redo日志和在线Redo日志恢复到今天中午。


Redo Log 组件

Redo Log Buffer:如果数据需要写到在线重做日志中,则在写至磁盘之前要在Redo Buffer中临时缓存这些数据。由于内存到内存的传输比内存到磁盘的传输快得多,因此使用重做日志Buffer可以加快数据库的操作。数据在重做缓冲区的提留时间不会太长。实际上LGWR会在一下某个情况发生时启动对这个区的刷新输出(flush):

* 每3秒一次

* 无论何时有人提交请求

* 要求LGWR切换日志文件

* 重做缓冲区1/3满,或者包含了1MB的缓存重做日志数据

LGWR:日志写入器,LGWR负责将SGA中重做日志缓冲区的内容刷新到磁盘上的后台进程。

ARCn:归档进程,ARCn的任务就是,当LGWR将在线日志文件填满时,就将其复制到另外一个位置。此后这些归档的重做日志文件可以用于完成介质恢复

Redo Log Files:重做日志文件,可以查询v$logfile找到对应的日志文件。

Redo Logs原理

在数据更新操作commit前,将更改的SQL脚本写入重做日志。主要用于数据库的增量备份和增量恢复


Online Redo Logs & ARCHIVE Redo Logs

Redo Logs分为在线重做日志和归档重做日志

  • online Redo log files--在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。
  • Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。

每个Oracle数据库都至少有两个Online重做日志组,每个组中至少有一个重做日志文件,这些在线重做日志组以循环方式使用。(用户可以通过视图操作添加/修改/删除日志组和日志文件来自定义在线重做日志),每组内的日志文件的内容完全相同,且保存在不同的位置,用于磁盘日志镜像,以做多次备份提高安全性。默认情况这n组通常只有一组处于活动状态,不断地同步写入已操作的脚本,当日志文件写满时(达到指定的空间配额),如果当前数据库处于归档模式,则将在线日志归档到硬盘,成为归档日志;若当前数据库处于非归档模式,则不进行归档操作,而当前在线日志的内容会被下一次重新写入覆盖而无法保存。因此,通常对于生产环境的数据库在运行时,是要处于归档模式下的,以保存数据更新的日志。当前归档日志组写满后,Oracle会切换到下一日志组,继续写入,就这样循环切换;当处于归档模式下,切换至原已写满的日志组,若该日志组归档完毕则覆盖写入,若没有则只能使用日志缓冲区,等待归档完毕之后才能覆盖写入。当然,处于非归档模式下是直接覆盖写入的。

归档重做日志文件实际上就是已填满的“旧”的在线重做日志文件的副本。系统将日志文件填满时,ARCH进程会在另一个位置建立重做日志文件的一个副本,也可以在本地或者远程位置上建立多个另外的副本。如果由于磁盘损坏或者其他物理故障而导致失败,就会用这些归档重做日志文件来执行介质恢复。

默认情况下,一个数据库默认为非归档模式,如果是非归档模式的话,也就说明我们没有办法通过日志来对数据库做一个恢复。

Archived redo logs should be backed up and deleted regularly.
Online redo logs should not be backed up.

LGWR重复循环的写重做日志文件,当一个日志文件被写满之后,LGWR就会写下一个Redo Log文件,当最后一个日志文件满了之后,LGWR就会返回来写第一个日志文件。

Reuse of Redo Log Files by LGWR

Online Redo Log File Use in ARCHIVE LOG Mode

Oracle Redo log_第2张图片

归档模式 vs 非归档模式

    1.非归档模式

        不适用与生产数据库

        创建数据库时,缺省的日志管理模式为非归档模式

        当日志切换,检查点产生后,联机重做日志文件即可被重新使用

        联机日志被覆盖后,介质恢复仅仅支持到最近的完整备份

        不支持联机备份表空间,一个表空间损坏将导致整个数据库不可用,需要删除掉损坏的表空间或从备份恢复

        对于操作系统级别的数据库备份需要将数据库一致性关闭

        应当备份所有的数据文件、控制文件(单个)、参数文件、密码文件、联机日志文件(可选)

 

    2.归档模式

        能够对联机日志文件进行归档,生产数据库强烈建议归档

        在日志切换时,下一个即将被写入日志组必须归档完成之后,日志组才可以使用

        归档日志的Log sequence number信息会记录到控制文件之中

        必须有足够的磁盘空间用于存放归档日志

        Oracle 9i 需要设置参数log_archive_start=true 才能够进行自动归档

        备份与恢复

            支持热备份,且当某个非系统表空间损坏,数据库仍然处于可用状态,且支持在线恢复

            使用归档日志能够实现联机或脱机时点恢复(即可以恢复到指定的时间点、指定的归档日志或指定的SCN)


SQLs

V$LOGFILE 存储了Redo logs所放置的位置

SQL> SELECT * FROM v$logfile ORDER BY group#;

    GROUP# STATUS  TYPE    MEMBER                                               
---------- ------- ------- ----------------------------------------------------
         1         ONLINE  D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO01.LOG     
         2         ONLINE  D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO02.LOG     
         3 STALE   ONLINE  D:\ORACLE\PRODUCT\10.1.0\ORADATA\TEST\REDO03.LOG     

SQL> 

V$LOGFILE视图需要关注的字段是STATUS

  • INVALID - File is inaccessible

  • STALE - File's contents are incomplete

  • DELETED - File is no longer used

  • null - File is in use


V$LOG displays log file information from the control file.

SQL> SELECT * FROM v$log; 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        344   10485760          1 NO  INACTIVE               2926216 31-7月 -12
         2          1        345   10485760          1 NO  CURRENT                2931621 31-7月 -12
         3          1        343   10485760          1 NO  INACTIVE               2900505 30-7月 -12

SQL> 

可以看到Redo Log有3个组,关于V$LOG视图,重点要关注STATUS字段

  • UNUSED - Online redo log has never been written to. This is the state of a redo log that was just added, or just after aRESETLOGS, when it is not the current redo log.

  • CURRENT - Current redo log. This implies that the redo log is active. The redo log could be open or closed.

  • ACTIVE - Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived.

  • CLEARING - Log is being re-created as an empty log after an ALTER DATABASE CLEAR LOGFILE statement. After the log is cleared, the status changes toUNUSED.

  • CLEARING_CURRENT - Current log is being cleared of a closed thread. The log can stay in this status if there is some failure in the switch such as an I/O error writing the new log header.

  • INACTIVE - Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived.



查看是否启用了归档模式

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     342
Current log sequence           344
SQL> 

或者

SELECT log_mode FROM v$database;
Output:NOARCHIVELOG


非归档到归档模式

        a.一致性关闭数据库(shutdown [immediate | transactional |normal])

        b.启动到mount阶段(startup mount)

        c.切换到归档模式(alter database archivelog  [manual])

        d.切换到open阶段(alterdatabaseopen)

        e.对数据做一个完整备份(fullbackup)

        --演示非归档到归档模式

            SQL> ARCHIVE LOG LIST    --查看数据库是否处于归档模式

            Database log mode              No Archive Mode

            Automatic archival             Disabled

            Archive destination            USE_DB_RECOVERY_FILE_DEST

            Oldest online log sequence     14

            Current log sequence           16

            SQL> SELECT log_mode FROM v$database; --查看数据库是否处于归档模式

 

            LOG_MODE

            ------------

            NOARCHIVELOG       

 

            SQL> SHUTDOWN IMMEDIATE;     --一致性关闭数据库

            Database closed.

            Database dismounted.

            ORACLE instance shut down.

            SQL> STARTUP MOUNT;        --启动到mount状态

            ORACLE instance started.

 

            Total System Global Area  251658240 bytes

            Fixed Size                  1218796 bytes

            Variable Size              75499284 bytes

            Database Buffers          171966464 bytes

            Redo Buffers                2973696 bytes

            Database mounted.

            SQL> ALTER DATABASE ARCHIVELOG; --切换到自动归档模式

            Database altered.

            SQL> ALTER DATABASE OPEN;       --切换到open状态

            Database altered.

            SQL> ARCHIVE LOG LIST;           --查看数据库的归档状态

            Database log mode              Archive Mode    --已置为归档模式

            Automatic archival             Enabled         --对日志进行自动归档

            Archive destination            USE_DB_RECOVERY_FILE_DEST

            Oldest online log sequence     14

            Next log sequence to archive   16

            Current log sequence           16

查看归档相关的参数

SQL> SHOW PARAMETER ARCHIVE  --查看归档路径是否已设置,为空值表示未设置

 

            NAME                                 TYPE        VALUE

            ------------------------------------ ----------- ------------------------------

            archive_lag_target                   integer     0

            log_archive_config                   string

            log_archive_dest                     string

            log_archive_dest_1                   string

            log_archive_dest_10                  string

            log_archive_dest_2                   string

            log_archive_dest_3                   string

            log_archive_dest_4                   string

            log_archive_dest_5                   string

            log_archive_dest_6                   string

            log_archive_dest_7                   string

 

            NAME                                 TYPE        VALUE

            ------------------------------------ ----------- ------------------------------

            log_archive_dest_8                   string

            log_archive_dest_9                   string

            log_archive_dest_state_1             string      enable

            log_archive_dest_state_10            string      enable

            log_archive_dest_state_2             string      enable

            log_archive_dest_state_3             string      enable

            log_archive_dest_state_4             string      enable

            log_archive_dest_state_5             string      enable

            log_archive_dest_state_6             string      enable

            log_archive_dest_state_7             string      enable

            log_archive_dest_state_8             string      enable

 

            NAME                                 TYPE        VALUE

            ------------------------------------ ----------- ------------------------------

            log_archive_dest_state_9             string      enable

            log_archive_duplex_dest              string

            log_archive_format                   string      %t_%s_%r.dbf

            log_archive_local_first              boolean     TRUE

            log_archive_max_processes            integer     2

            log_archive_min_succeed_dest         integer     1

            log_archive_start                    boolean     FALSE --该参数在9i中使用

            log_archive_trace                    integer     0

            remote_archive_enable                string      true

            standby_archive_dest                 string      ?/dbs/arch



参考资料:

http://blog.csdn.net/robinson_0612/article/details/5784713

http://v.youku.com/v_show/id_co00XMTM2MzU0MzY=.html

Expert Oracle - Tom Kyte


转载请注明出处:http://blog.csdn.net/pan_tian/article/details/7805077

===EOF===

你可能感兴趣的:(Oracle Redo log)