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

Oracle Redo log_第2张图片

Online Redo Log File Use in ARCHIVE LOG Mode

Oracle Redo log_第3张图片

归档模式 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)