欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle补充日志及日志记录规则

程序员文章站 2022-05-24 13:33:38
...

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补充日志的语法及类型:

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;