Oracle补充⽇志及⽇志记录规则
这篇⽂章是在《构建最⾼可⽤Oracle数据库系统:Oracle 11gR2 RAC管理、维护与性能优化》11.4.2⼩节的基础上进⼀步修改⽽成的,
并感谢⽼谭的提醒和帮助。
Supplemental Log是⼀种补充类型的⽇志,主要⽤于逻辑Standby数据库的同步、LogMiner、Streams和Flashback等技术。对于逻
辑Standby数据库来说,不能通过ROWID来标识某⼀⾏,Oracle推荐使⽤主键、约束和索引唯⼀标识⾏数据,但如果某部分表由于某种原
因没有主键、唯⼀约束和唯⼀索引,不能有效的标识⾏数据,那么必须通过Supplemental Log记录多个字段甚⾄所有字段值来唯⼀标识表
⾏。Supplemental Log也是记录在在线Redo⽇志中,所以启⽤Supplemental Log会加快在线Redo⽇志的填充。
Supplemental Log可以在数据库级别启动,在数据库级别启动Minimal Logging会记录操作的⾜够信息,通常在主数据库创建
Minimal Logging已经⾜够使⽤。数据库级别Supplemental Log补充⽇志还能针对所有字段、主键字段、唯⼀字段和外键字段创建。另外
也可以在表级别设置Supplemental Log,这叫做Identification Key Logging.不同类型的Supplemental Log会产⽣不同⼤⼩的⽇志记
录。
执⾏以下的SQL启⽤或禁⽤数据库级别Minimal Logging:
ALTER DATABASE ADD|DROP SUPPLEMENTAL LOG DATA;
针对逻辑Standby数据库记录的⽇志信息有以下规则:
1).如果⼀个表有主键被定义,那么主键被记录作为UPDATE语句的⼀部分去标识修改的⾏。
2).如果主键不存在,最短的⾮空唯⼀约束、唯⼀索引被记录作为UPDATE语句的⼀部分标识修改的⾏。
3).在主键和⾮空唯⼀约束/索引都没有的情况下,所有的列被记录,作为UPDATE语句的⼀部分标识修改的⾏。换句话说,除了LONG、
LOB、LONG RAW、对象类型和集合类型的字段,所有字段都将被记录。
4).⼀个函数索引,即使它是被定义为唯⼀的,也不能⽤于唯⼀标识修改的⾏。然⽽,只要修改的⾏能被唯⼀标识,逻辑Standby数据库⽀
持函数索引表的同步。
Oracle推荐在主数据库尽可能的给表添加主键或者⾮空唯⼀索引,确保SQL Apply能有效的应⽤Redo数据更新逻辑Standby数据库。
下⾯通过实验来讨论Oracle补充⽇志的语法及类型:
C:\Users\LIUBINGLIN>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on 星期六 3⽉ 15 20:27:28 2014
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> col supplemental_log_data_fk format a30
SQL> col supplemental_log_data_all format a30
SQL> col supplemental_log_data_min format a30
SQL> set linesize 200
SQL> select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databas
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            YES
SQL> ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENT
AL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
YES                            NO                            IMPLICIT
SUPPLEMENTAL_LOG_DATA_FK=YES表⽰启动了外键补充⽇志。
SQL> ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            IMPLICIT
SQL> ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
数据库已更改。
SQL>  select SUPPLEMENTAL_LOG_DATA_FK,SUPPLEMENTAL_LOG_DATA_ALL,SUPPLEMENTAL_LOG_DATA_MIN from v$databa
SUPPLEMENTAL_LOG_DATA_FK      SUPPLEMENTAL_LOG_DATA_ALL      SUPPLEMENTAL_LOG_DATA_MIN
------------------------------ ------------------------------ ------------------------------
NO                            NO                            IMPLICIT
IMPLICIT - Minimal supplemental logging is enabled because all or a combination of primary key, unique key, and foreign key supple YES - Minimal supplemental logging is enabled through an ALTER DATABASE ADD SUPPLEMENTAL LOG DATA statement.
SUPPLEMENTAL_LOG_DATA_MIN=YES和IMPLICIT都表⽰数据库启动了最⼩化的补充⽇志。
YES表⽰通过ALTER DATABASE ADD SUPPLEMENTAL LOG DATA语句启动的最⼩化补充⽇志;
In this Document
Oracle Database - Enterprise Edition - Version 10.2.0.1 and later
Information in this document applies to any platform.
As part of the Streams setup you can specify supplemental logging at the database level.
It can be done manually:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
or implicitly running procedures like DBMS_STREAMS_ADM.ADD_SCHEMA_RULES
or if you setup Streams using Grid Control it is automatically executed by SrcSchemaRule1 Stage Step 12.
In some cases, this step hangs and the statement ALTER DATABASE ADD SUPPLEMENTAL LOG DATA remains waiting for TX
The statement ALTER DATABASE ADD SUPPLEMENTAL LOG DATA  is waiting for TX lock in shared mode when there is any u
You can issue ALTER DATABASE ADD SUPPLEMENTAL LOG DATA when the database is open. However, OracleDatabase will i flight transaction so that any redo generated after this DDL would have the right supplemental logging attributes.
You need to wait for the completion of all the in-flight transaction.
In those databases with high activity where there are always active transactions the supplemental logging can be enabled by bo
STARTUP MOUNT
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE OPEN;
在启动数据库补充⽇志的时候,会使得所有缓存的游标变得⽆效,突如其来的⼤量硬解析将对数据库的性能带来影响。启动数据库补充⽇
志将等待当前所有的事务结束,使得该操作之后记录的所有Redo数据都有补充⽇志的属性,如果数据库有长事务或事务过于频繁将导致该
oracle11g 创建数据库操作出现Hang住的情况,由此可见启动数据库的补充⽇志应尽量避开数据库⾼峰期。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。