Oracle补充日志及日志记录规则
Supplemental Log是一种补充类型的日志,主要用于逻辑Standby数据库的同步、LogMiner、Streams和Flashback等技术。对于逻辑Stand
这篇文章是在《构建最高可用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$database;
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$database;
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,SUPPLEMENTAL_LOG_DATA_MIN from v$database;
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$database;
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$database;