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

tolywang發表於2010-10-23


原文(含大多數英文) :
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章