zoukankan      html  css  js  c++  java
  • Oracle Redo Log 及Logmnr配置使用

    原文来自http://www.linuxidc.com/Linux/2012-12/76058p5.htm

    一、Redo Log 概念

    1、What Is the Redo Log?

    Redo Log(重做日志)是为了保护那些修改数据库但未写入data file(数据文件)的数据。

    Redo Log分为Online Redo log(联机重做日志)文件与Archived Redo Log(已归档重做日志)两类。

    联机重做日志文件(Online Redo Log File),主要用于记录Oracle事务处理有关日志信息的文件。

    重做日志文件是数据库从介质故障或者实例故障中恢复时,能够将数据文件回滚到上一个已提交事务所必须文件。

    2、Redo Log Contents(重做日志内容)

    Redo log files 填充以 redo records(重做记录)。一个重做记录,有叫做redo entry(重做条目), 有一组change vectors(变化向量)组成,而每个change vectors描述了数据库中每个块的变化。

    例如, 改变 一行employee表的salary列值时, 将产生一个redo record,它包含了这个表的change vectors ,即data segment block(数据段的块)的变化、

    undo segment data block(回滚段数据块)变化和回滚段事务表的变化。

    Redo entries(重做条目)记录了数据库的所有变化(包含回滚段变化)使得我们可以重新构造这些变化。

    因此Redo Log也可以保护(rollback data)回滚数据。当数据库使用Redo data(重做数据)恢复时,数据库会读取在Redo record(重做记录)

    中的change vectors(变化向量),并将其应用于相关块上。

    Redo records(重做记录) 在SGA(System Global Area)注1上的Redo Log Buffer(重做日志缓存区)以循环方式缓存,

    之后通过数据库后台进程Log Writer (LGWR)即日志写入进程将Redo records写入Redo log文件中一个。

    一旦一个事务提交, LGWR会将来自SGA中Redo Log Buffer里缓存的事务重做记录写入Redo Log File,

    并且系统分配一个SCN号(system change number),为每个提交事务标识重写记录。

    只有当所有对应于存储在(Online Log)在线日志中的重做记录,其事务已安全提交到磁盘时,用户进程才注意到事务已提交。

    重做记录在某些情况下也会在对应的事务提交之前写入Redo Log文件。

    如果Redo Log Buffer 填满,或者另一个事务提交,LGWR进程会将Redo Log Buffer中所有Redo log entries写入RedoLog Files后刷新redo log buffer[Flush],

    即使有些重做记录没能提交。如果需要数据库会回滚这些记录。

    *注1:系统全局区又称SGA (System Global Area)是Oracle Instance的 基本组成部分,在实例启动时分配。

    是一组包含一个Oracle实例的数据和控制信息的共享内存结构。主要是用于存储数据库信息的内存区,

    该信息为数据库进程所共享(PGA不能共享的)。

    它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

    3、How Oracle Database Writes to the Redo Log(Oracle数据库如何写入重做日志)

    数据库重做日志包含两个或更多的redo log files。

    数据库需要最少的重做日志文件数目是两个,这样保证总一个日志文件可以写入同时另一个文件归档(如果数据库处于ARCHIVELOG模式)。

    LGWR进程以循环方式写入Redo Log Files。

    在当前重做日志文件写满时,LGWR进程开始向下一个可用的Redo Log File写入数据。

    在最后一个Redo Log File写满时,LGWR进程返回到第一个Redo Log File去写入数据,继而开始循环写入。

    Figure 1.3-1 描述 redo log file的循环写入方式。

    于每行的旁边的数字表示已什么顺序LGWR进程写入每个redo log file。

    Figure 1.3-1 Reuse of Redo Log Files by LGWR(LGWR重用Redo Log Files)

    已写满的Redo Log files 是否是LGWR进程可重用的(reuse)依赖为是否archiving(归档)是开启的。

    · 如果归档时关闭(数据库在NOARCHIVELOG mode即非归档模式)时,

    对于一个写满的redo log file,只要这个文件中的记录已经写入数据文件(datafiles)时,这个RedoLog file才可用。

    · 如果归档时开启(数据库在ARCHIVELOG mode即归档模式)时,

    对于一个写满的redo log file,只有这个文件中的记录已经写入数据文件(datafiles)并且这个文件归档时,这个Redo Log file才可用。

    4、Active (Current) and Inactive Redo Log Files(激活/当前和非激活重做日志文件)

    Oracle数据库某一时刻仅使用一个RedoLog files将存储于重做日志缓存区的重做记录写出。

    LGWR进程正在写入的Redo Log file称之为 current redo log file(当前重做日志文件)。

    需要实例恢复的Redo Log files称之为active redo log files(激活重做日志文件)。

    不再需要实例恢复的Redo Log file称之为active redo log files(非激活重做日志文件)。

    如果数据库激活归档(数据库处于归档模式)时,数据库会在ARCn(archiver background processes)-

    即归档后台进程 已经归档当前激活的在线重做日志后,这个当前激活的在线重做日志才可用重用或重写。

    如果数据库未激活归档(数据库处于非归档模式)时,此时一旦最后的Redo Log File写满,

    LGWR进程会重写第一个可用的激活Redo Log File。

    5、Log Switches and Log Sequence Numbers(日志切换和日志序列号)

    日志切换是在数据库停止写入一个Redo Log文件而开始写入另一个Redo Log文件的这一点。

    正常情况下,日志切换发生在当前Redo Log文件完全的写满而且必须向下一个Redo Log文件写入时。

    但是,可以配置规定时间间隔发生日志切换,而不管当前Redo Log文件是否处于完全写满的状况。

    我们也可用手动强制日志切换。

    每当日志切换而且LGWR进程写入日志文件时,Oracle数据库会分配Redo Log File一个新的日志序列号。

    当数据库归档Redo Log文件时,已归档的日志包含Redo Log文件的日志序列号。

    循环使用至第一个Redo Log文件时数据库给予下一个可用的日志序列号。

    每个在线或者归档Redo Log文件都由对应的日志序列号标识。

    在数据库崩溃(crash)、数据库实例或媒介恢复时,数据库会按Redo Log文件递增的日志序列号顺序

    使用必要的归档或Redo Log文件来恢复数据库。

    6、Redo Threads(日志线程)

    当谈及多数据库实例的内容时,每个数据库实例的Redo Log简称为Redo Thread。

    在传统配置中,只有单实例访问ORACLE数据库,所有仅有一个线程出现。

    在RAC(Oracle Real Application Clusters)环境,即Oracle数据库集群环境下,有两个或更多实例同时地访问唯一的数据库,

    而且每个进程拥有自己的Redo Thread。每个Redo Thread对应其Redo Log,这些分散的Redo Thread避免了访问单一的Redo Log文件集时发生的冲突,

    从而消除了潜在的性能瓶颈。

    7、Multiple Copies of Online Redo Log Files(多路复用联机重做日志)

    Oracle数据库会自动管理两个或多个相同的在线重做日志(online redo log)拷贝,这些拷贝分散在不同地区。

    一个在线重做日志组(online redo log group )包含一个在线重做日志文件(online redo log file)和它的冗余拷贝们。

    每个相同的拷贝是在线重做日志组(online redo log group)的一个Member成员。

    每个组被数字定义,例如group 1, group 2以此类推。

    维护多个联机重做日志组的成员,可以防止损失的重做日志。

    理想的情况下,成员的位置应该是在单独的磁盘上,这样一个磁盘的故障不会导致整个联机重做日志的损失。

    在 Figure 1.7-1中,A_LOG1和B_LOG1是group1相同的成员,同时A_LOG2和B_LOG2是group2相同的成员。一个组中的每个成员必须是相同的大小。 LGWR同时写入组成员group1(包含组成员A_LOG1和B_LOG1),之后同时进行写入group2(包含组成员A_LOG2和B_LOG2),然后写入到group1,依此类推。 LGWR不能同时写入不同组的成员(Member)。

    Figure 1.7-1Multiple Copies of Online Redo Log Files

    Description of "Figure 1.7-1 Multiple Copies of Online Redo Log Files"

    注:

    Oracle建议你使用多路复用联机重做日志。如果需要恢复的日志文件有损失可能是灾难性的。当你多路复用联机重做日志,

    数据库必然增加I / O操作的处理量。根据您的系统,这个额外的I / O处理量可能会影响数据库的整体性能。

    8、Archived Redo Log Files(归档重做日志文件)

    归档重做日志文件是包含在联机重做日志组中的一个写满成员的副本。

    不考虑这个文件是数据库的一部分,但是是一个联机重做日志文件的脱机副本,这一副本是由数据库创建的并写入到用户指定的位置。

    归档重做日志文件是备份和恢复策略的一个重要组成部分。您可以在以下使用归档重做日志文件:

    恢复数据库备份

    更新备用数据standby database (see "Computer Failures")

    使用LogMiner工具获取历史数据库中的信息(see "Oracle LogMiner")

    归档是产生的归档重做日志文件的操作。归档是自动或手动,但仅可能发生在数据库处在ARCHIVELOG模式下。

    一个归档重做日志文件包含联机重做日志组(online redo log group)相同成员的重做条目(redo entries)和日志序列号。

    在Figure 7-1中,文件A_LOG1和B_LOG1是Group 1中相同的Member。

    如果数据库在ARCHIVELOG模式下,并且启用自动归档,这样归档进程(ARCn)将归档的这个组中的一个Member的文件。

    如果A_LOG1已损坏,那么这个过程可以归档B_LOG1文件。

    因为你启用归档模式,归档日志将包含每组在线重做日志组的一份拷贝。

    二、Oracle 写入数据过程

    1、System Change Numbers (SCNs)

    系统改变号(system change number (SCN))是一个合乎逻辑的,内部的Oracle数据库所用的时间戳记。

    在所有数据库数据改变写入磁盘前,Oracle数据库使用SCN号标志这一时刻,

    以便数据库恢复时应用不必要的Redo操作。

    数据库也会标志位于redo重做的数据集时点以便恢复停止。

    SCN号产生一个单调递增序列。Oracle数据库向使用使用时钟一样使用SCN。

    如果一个事件比另一个事件的SCN号低,那么它相对于数据库发生在一个较早的时间 。

    如果几个事件可以共享相同的SCN,这意味着他们在数据库同一时间发生。

    每个事务都有一个SCN。例如,

    如果一个事务更新一行, 那么事务在发生更新时数据库记录SCN号。

    Oracle数据库的增量SCN号在system global area (SGA)中。

    当事务修改数据,数据库中写入一个新的SCN到分配给这个事务的undo数据段。

    日志写进程写入提交的事务 记录,立即向联机重做日志。

    这时数据库日志写入进程立即将事务的提交记录写入到在线联机重做日志online redo log上。

    提交记录的交易具有独特的SCN。Oracle数据库使用的SCN是 实例恢复和介质恢复机制的一部分。

    2、各种后台进程的作用:

    Ckpt、lgwr、dbwn之间的协作。

    (1)Ckpt:检查点进程  Checkpoint Process

    检查点进程(CKPT)更新控制文件和数据文件头,这个数据文件头包含检查点信息和DBWN进程写块到磁盘的信号的。

    检查点信息包括检查点位置,SCN号,联机重做日志开始恢复的位置,等等。

    CKPT不写入数据块到数据文件或不写入重做块到联机重做日志文件。

    检查点是在数据库关闭,实例恢复,和Oracle数据库的一般操作时保证数据库一致性的一个重要的机制。

    检查点术语拥有如下的相关的含义:

    这是一个表示检查点位置的数据结构,也是从重做流必须开始实例恢复时位于重做流中的SCN号。

    检查点的位置是由位于database buffer cache(数据库缓冲区)中最早的脏数据区(dirty buffer)。

            检查点的位置作为重做流的指针,存储在控制文件和每个数据文件头中。

    每隔3秒或更频繁写一次,写入控制文件,记录DBWN从SGA写入磁盘的块的位置。

    (2)LGWR:Log Writer即日志写入进程,每3秒,1/3满buffer,commit,DBWN写之前。将buffer中数据写入物理文件。

    (3)DBWN:database writer即数据库写入进程将SGA中脏块写入datafile。

    3、Oracle 写入数据过程:

    Oracle写数据过程:

    DML 操作一执行,首先在redo buffer中记录语句,在buffer cache中执行更改,修改数据块。

    然后LGWR进程根据上述规则,将redo buffer中的信息写入到Redo Log文件。此过程比较快(redo log为连续写)。

    完成后,DBWN会将buffer cache中脏数据块对应的原始数据,复制到undo表空间,然后更新数据。(随机写,比较慢)。|

    期间ckpt进程根据3秒的原则,作检查点,记录哪些脏数据库写到了data file中

    (这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到哪里了)。

    将需要的信息记录在控制文件中。

    若实例崩溃或需要错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。

    此时根据事务是否提交了,未提交的事务,根据undo表空间的数据进行恢复(常说的undo,回滚操作)

    三、日志文件组、日志切换和日志归档

    -------------Member

    默认情况下,Oracle数据库实例创建完成以后就已创建了3组日志组。每组有两个日志文件(每个日志文件称为Member),每个组内所有Member记录同样的信息,每组有两个或两个以上的Member,这样保证此日志文件的高可用性,即当其中一个文件损坏时,其他文件可用。同时为了保证HA(高可用性)建议将Redo Log File 组的每个Member实例恢复所需要的日志文件称为Active Redo Log File(活动重做日志文件),对应的Inactive Redo Log File(非活动重做日志文件)。

    在数据库实例startup时,Online Redo Log File自动前滚。

    1.查看redo log,archived log

    在PL/SQL SQL windows

    select * from v$log;

    #-----------------系统有三个redo log

    select * from v$logfile;

    #------------------系统有三个redo log 文件

    select * from v$archived_log;

    #--------------查询无archived log

    2.添加archived log

    在PL/SQL command windows

    [oracle@h1 oracle]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 13 08:37:24 2012

    Copyright (c) 1982, 2009, Oracle. All rights reserved.

    Connected to:

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    SQL> show parameter log_archive_dest_1;

    NAME TYPE VALUE

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

    log_archive_dest_1 string

    log_archive_dest_10 string

    log_archive_dest_11 string

    log_archive_dest_12 string

    log_archive_dest_13 string

    log_archive_dest_14 string

    log_archive_dest_15 string

    log_archive_dest_16 string

    log_archive_dest_17 string

    log_archive_dest_18 string

    log_archive_dest_19 string

    四、LOGMNR

    [oracle@h1 admin]$ sqlplus "/as SYSDBA"

    SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 12 10:37:40 2012

    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

    Connected to:

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    ------------------1.安装LOGMNR包

    SQL> host pwd

    /app/oracle/product/11.2.0/dbhome_2/rdbms/admin

    SQL> @dbmslm.sql

    Package created.

    Grant succeeded.

    Synonym created.

    SQL> @dbmslmd.sql

    Package created.

    Synonym created.

    SQL> @dbmslms.sql

    Package created.

    No errors.

    Grant succeeded.

    SQL> show parameter utl_file_dir;

    NAME                                TYPE        VALUE

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

    utl_file_dir                        string

    ------------------2.创建数据字典

    SQL> alter system set utl_file_dir='/app/log' scope=spfile;

    System altered.

    SQL> shutdown immediate;

    Database closed.

    Database dismounted.

    ORACLE instance shut down.

    SQL> startup

    ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

    ORACLE instance started.

    Total System Global Area  501059584 bytes

    Fixed Size                  2214736 bytes

    Variable Size            373294256 bytes

    Database Buffers          121634816 bytes

    Redo Buffers                3915776 bytes

    Database mounted.

    Database opened.

    SQL> show parameter utl_file_dir;

    NAME                                TYPE        VALUE

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

    utl_file_dir                        string      /app/log

    SQL> EXECUTE dbms_logmnr_d.build('dictionary.ora','/app/log');

    PL/SQL procedure successfully completed.

    ------------------3.添加日志文件

    SQL> host pwd

    /app/oracle/oradata/orcl

    SQL>EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/app/oracle/oradata/orcl/redo01.log',Options=>dbms_logmnr.new);

    PL/SQL procedure successfully completed.

    SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/app/oracle/oradata/orcl/redo02.log',Options=>dbms_logmnr.new);

    PL/SQL procedure successfully completed.

    SQL> EXECUTE dbms_logmnr.add_logfile(LogFileName=>'/app/oracle/oradata/orcl/redo03.log',Options=>dbms_logmnr.new);

    PL/SQL procedure successfully completed.

    ------------------4.使用字典分析日志文件

    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/app/log/dictionary.ora');

    PL/SQL procedure successfully completed.

    ------------------5.查询结果

    SQL> select scn,sql_redo,sql_undo from v$logmnr_contents;

    ------------------6.退出logmnr

    SQL> execute dbms_logmnr.end_logmnr;

    ---------------在SQL windows上用begin ...end;调用存储过程

    begin

    dbms_logmnr.end_logmnr;

    end;

    本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-12/76058p5.htm

  • 相关阅读:
    设置全屏的方法
    The connection to adb is down,and a server error has occured.解决办法---------------------亲测有效
    android 案例二 登录界面
    javaweb项目编译错误
    Ubuntu 14.04 tomcat配置
    Ubuntu 14.03 安装jdk
    Ubuntu 14.03 安装mysql
    Git 版本管理使用说明。
    getColor问题
    WebView 调试
  • 原文地址:https://www.cnblogs.com/weixun/p/3265434.html
Copyright © 2011-2022 走看看