Oracle10g Supplemental Log(追加日志) -2 [final]


原文(含大多数英文) :
http://space.itpub.net/35489/viewspace-630561  

 


例子: 

注意正确顺序是先drop 表级的,再drop database 级的 。 如果需要加入,改drop 为 add 就可以了。  

mxb2bcoredbsty$sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Sat Mar 27 20:46:27 2010

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining Scoring Engine
and Real Application Testing options

SQL> alter database drop supplemental log data;
alter database drop supplemental log data
*
ERROR at line 1:
ORA-32589: unable to drop minimal supplemental logging


SQL> ALTER DATABASE drop SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE, FOREIGN KEY) COLUMNS;

Database altered.

SQL>  alter database drop supplemental log data;

Database altered.

SQL>


============================================================


具体参考:  

Supplemental Logging
=====================
P425


v$database 视图可查询的相关信息:

 SUPPLEMENTAL_LOG_DATA_MIN                          VARCHAR2(8)
 SUPPLEMENTAL_LOG_DATA_PK                           VARCHAR2(3)
 SUPPLEMENTAL_LOG_DATA_UI                           VARCHAR2(3)
 SUPPLEMENTAL_LOG_DATA_FK                           VARCHAR2(3)
 SUPPLEMENTAL_LOG_DATA_ALL                          VARCHAR2(3)

 

supplemental logging 的定义 :
redo log一般用于实例恢复及介质恢复。在redo log中这些数据被自动记录。不过一些
基于redo的application可能在redo log中记录额外的一些列。 这种记录额外列的过程
被称为supplemental logging

缺省情况下,数据库没有打开对supplemental logging的支持。


下面的一些情况可能需要额外列被记录到redo log中:

(1)  比如logical standby是通过SQL Apply来进行同步,ROWID已经变化,如果没有PK被
记录在redo log中,在logical standby中同步更新时可能找不到更新的行,所以需要额外
的一些列记录到redo 中,使它可以唯一标示行 。

(2) 有一些需求可能要求整行的前镜像被记录,不仅仅只是被修改的列,以便更好的追踪row变化。


supplemental log group是被记录的一组额外的列,有两种类型的supplemental log groups,
分别决定什么时候log group中的列被记录。

A.  Unconditional supplemental log groups: 没有条件的,只要行被更新,指定列的前镜像
都被记录,不管是否这一列是否有被更新(可能这一行的其他列被更新),这通常被称为一个
ALWAYS log group 。

B. Conditional supplemental log groups:  只有当在log group中的至少一个列被更新时,
所有被指定的列的前镜像被log记录 . 

Supplemental log groups 可以是系统生成或用户定义。 

 

 

除两种类型的 supplemental logging 外, 还有两种级别的 supplemental logging :

A.  Database-Level Supplemental Logging  数据库级别
B.  Table-Level Supplemental Logging     表级别   

 


Database-Level Supplemental Logging 数据库级别

===================================

有两种类型的数据库级别的supplemental logging:
(1) minimal supplemental logging (使用LogMiner的至少要求)
(2) identification key logging

不过,启动 database-wide identification key logging (上面第二种)可能在数据库
产生redo log方面产生负荷 。

 

Minimal Supplemental Logging
============================

Minimal supplemental logging logs the minimal amount of information needed for
LogMiner to identify, group, and merge the redo operations associated with DML
changes. It ensures that LogMiner (and any product building on LogMiner technology)
has sufficient information to support chained rows and various storage arrangements,
such as cluster tables and index-organized tables. To enable minimal supplemental
logging, execute the following SQL statement:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

译文(自己翻译的) ---
Minimal supplemental logging 记录用于记录最少的信息,Logminer借助这些信息来标示,
分组及合并和DML修改相关的redo操作,它确保logminer有足够的信息去支持链接行(chained
rows)和各种存储配置,如 cluster tables and index-organized tables 等,需要enable
minimal supplemental logging, 执行以下命令:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

备注: 
In Oracle Database release 9.0.1, minimal supplemental logging was the default
behavior. in LogMiner. In release 9.2 and later, the default is no supplemental
logging. Supplemental logging must be specifically enabled.

 

添加与删除的测试:

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
NO

SQL> alter database add supplemental log data;
Database altered.

SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
YES

SQL> alter database drop supplemental log data; (如果有表级的,要先删除表级的)
Database altered.

SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
NO

 

警告日志的变化:

Tue Jul 21 17:43:00 2009
alter database add supplemental log data
Tue Jul 21 17:43:00 2009
SUPLOG: Updated supplemental logging attributes at scn = 5005756
SUPLOG:  minimal = ON, primary key = OFF
SUPLOG:  unique = OFF, foreign key = OFF, all column = OFF
Completed: alter database add supplemental log data
Tue Jul 21 17:43:18 2009
alter database drop supplemental log data
Tue Jul 21 17:43:18 2009
SUPLOG: Updated supplemental logging attributes at scn = 5005768
SUPLOG:  minimal = OFF, primary key = OFF
SUPLOG:  unique = OFF, foreign key = OFF, all column = OFF
Completed: alter database drop supplemental log data

 

 


数据库级Identification Key Logging
=========================================

当redo log files 在源数据库实例端不能被挖掘解析的话,就必须Identification key logging,
比如,在logical standby中就需要数据库级别Identification key logging 。


(1) ALL system-generated unconditional supplemental log group
这个选项指出当一行被更新时,那一行所有的字段(LOBs,LONGS,ADTs除外)都被放入redo log .
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;


(2) PRIMARY KEY system-generated unconditional supplemental log group
此选项使database将一行的PK包含的字段都放入redo log file 中,不管是否是这个PK包含的
字段被更新 。

如果表上没有PK, 但是有一个或更多非空unique index key constrains 或索引,那么会选择一
个唯一索引来记录,从而唯一标示一行的更新。 

如果表既没有PK也没有非空唯一索引,那么所有的字段(除了LONG及LOB)都将被追加记录,这
等同于“ALL” supplemental logging .

所以,Oracle建议当我们使用数据库级PK supplemental logging,所有或大多数表应该定义有
PK或unique index.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

 

(3) UNIQUE system-generated conditional supplemental log group
如果任何隶属于unique index或bitmap index中的字段被更新,那么数据库将这一行组合unique index
或bitmap index的所有字段记录在log 中。 

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;

 

(4) FOREIGN KEY  system-generated conditional supplemental log group
如果任何隶属于foreign key 中的字段被更新,那么数据库将这foreign key的所有字段记录在log 中。 

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;

 

当使用键值表示记录时需要谨记以下几条:

(1) 如果数据是开启的,当你启动identification key logging ,在cursor cache中的所有的
DML cursors 都会变无效,这可能会影响性能直到cursor cache被重新载入。

(2) 当我们启动数据库级的identification key logging, minimal supplemental logging
也被隐性开启 。

(3) Supplemenatl logging语句是累加型的,比如你执行下面两个语句,那么PK及
unique index都将被追加log :
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;


alter database add supplemental log data(primary key,unique index) columns; 

 


Disabling Database-Level Supplemental Logging
==============================================

开启与关闭的顺序
===============

如果要关闭所有数据库supplemental logging,必须首先关闭所有的identification key logging,
然后关闭 minimal supplemenatl logging.  顺序不对会报错。

错误的操作过程:
SQL> alter database add supplemental log data (primary key) columns;
SQL> alter database add supplemental log data (unique) columns;

SQL> alter database drop supplemental log data (primary key) columns;
SQL> alter database drop supplemental log data;
alter database drop supplemental log data
*
ERROR at line 1:
ORA-32589: unable to drop minimal supplemental logging


正确的操作过程:
SQL> alter database add supplemental log data (primary key) columns;
SQL> alter database add supplemental log data (unique) columns;

SQL> alter database drop supplemental log data (primary key) columns;
SQL> alter database drop supplemental log data (unique) columns;
SQL> alter database drop supplemental log data;

 


详细过程:


SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEME
--------
NO

SQL> alter database add supplemental log data (primary key) columns;
Database altered.

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEME
--------
IMPLICIT

SQL> alter database add supplemental log data (unique) columns;
Database altered.

 

SQL> alter database drop supplemental log data (primary key) columns;
Database altered.

SQL> alter database drop supplemental log data (unique) columns;
Database altered.

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;

SUPPLEME
--------
NO

SQL> alter database drop supplemental log data;
Database altered.

SQL> alter database drop supplemental log data;
Database altered.

SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
NO


注意:

(1) 每次添加与删除都会在警告日志中留下信息已被参考

Tue Jul 21 15:36:15 2009
alter database add supplemental log data (unique) columns
Tue Jul 21 15:36:15 2009
SUPLOG: Updated supplemental logging attributes at scn = 5000969
SUPLOG:  minimal = ON, primary key = ON
SUPLOG:  unique = ON, foreign key = OFF, all column = OFF
Completed: alter database add supplemental log data (unique) columns


(2) 可以多次执行 alter database drop supplemental log data;

 

 

 

 


Table-Level Supplemental Logging
================================

Table级的supplemental logging指出在table层,哪些字段需要在redo log中被记录。


(1) Table-Level Identification Key Logging

选项  all, primary key, foreign key, unique key. 和数据库级的一样,但是
设置后只是对指定的表起作用。

下面的例子,当emp表中一个column被修改,table的整行(除了LOB,LONG,ADTs)将被记录到
redo log file。
SQL> alter table hr.emp add supplemental log data (all) columns;


使用table-level identification key logging的时候注意 :

(1) 如果数据是开启的,当你启动identification key logging ,在cursor cache中的所有的
DML cursors 都会变无效,这可能会影响性能直到cursor cache被重新载入。

(2) Supplemenatl logging语句是累加型的,比如你执行下面两个语句,那么PK及
unique index都将被追加log :
ALTER TABLE HR.EMP ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER TABLE HR.EMP ADD SUPPLEMENTAL LOG DATA (UNIQUE)  COLUMNS;


(2) Table-Level User-Defined Suplemental Log Groups

  1) User-defined unconditional log groups

    ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG GROUP emp_parttime
    (EMPLOYEE_ID, LAST_NAME, DEPARTMENT_ID) ALWAYS;

    以上语句,只要这个table被更新,不管是否更新的是这些受影响的字段,每次更新,上面
    提到的这些字段都会被记录到redo log中。

   2) User-defined conditional supplemental log groups

    ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG GROUP emp_fulltime
    (EMPLOYEE_ID, LAST_NAME, DEPARTMENT_ID);

     对比第一个,ALWAYS被去掉了,那么只有当语句中提到的字段中的至少一个被更新时,
     所有这些被提到的字段才会都被记录到redo log中。

   3) NO LOG

    ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG GROUP emp_parttime(
    DEPARTMENT_ID  NO LOG ,   EMPLOYEE_ID); 

    用户定义的有条件的supplemental log groups中, NO LOG表示上面两个字段中至少一个字
    段被更新,只是记录 EMPLOYEE_ID 字段的前镜像 。设置NO LOG的不记录。

 

用户定义Supplemental Log Groups 使用注意点:
 
A. 一个column 能属于多于一个supplemental log group,但是这个字段的前镜像仅仅被
   记录一次。

B. 如果在条件与无条件supplemental log中指定相同columns,那么columns设置为无条件
   记录到log .

参考:  http://space.itpub.net/35489/viewspace-630259   

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-676606/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-676606/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值