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

tolywang發表於2010-03-04

在做Oracle10g Logical Standby 或 Oracle Stream的時候, 大多數時候,我們需要設定 Supplemental Log(追加日誌) , 這個主要是因為Logical Standby或 Oracle Stream 是使用解析日誌的方式得出DDL , DML 語句, 然後Apply到Standby 或 從庫中 。      由於普通redo 日誌只是記錄rowid 及更改前後的列的值即可對資料庫進行恢復或roll forward 等動作, 但是  類似 logical stand DB不是根據rowid 來做recover,    所以需要在redo裡記錄PK or unique index的資訊來定位操作的data  行,  而只有pk或unique index對應的列被更改時才會被記錄,所以 Supplemental Log 出現了 。  

 

物理Standby 在應用資料庫塊的時候,可以根據rowid 知道更新,插入或刪除了哪些行, 但是 logical standby及stream 應用中都是採用解析log的方式Apply SQL , 而不是block ,  源資料庫上做的操作需要反映到目標資料庫上的table,  這裡需要注意, 主庫的redo在備庫中解析出來後每一行資料的變更都會生成一條SQL (比如主庫中的一個批次更新SQL , 在備庫可能是 1000 條SQL 語句) , 這就要求備庫能夠唯一區別出每一條資料  , 由於主庫備庫只是邏輯上一致,ROWID屬於物理結構,是不一樣的 (block位置也許完全不一樣了),  那麼備庫需要能夠唯一區別出一條資料只有透過pk 或 unique index 來進行判斷  。

情況一:     對於有pk 或unique index 的table  , 且pk 或 unique index 是由一個欄位組成,不是組合索引。 如果每次更新的是PK列或unique index列,  那麼可以不用啟用 Supplemental Log , redo log 會附加記錄這些pk 或unique index  , 以便logical standby 等進行恢復的時候能知道哪些行被更新了 。 這樣生成的redo log也是最小的。 但是如果更新的不是PK或unique index列,那麼還是需要啟用Supplemental Log 的, 以便記錄PK/FK , unique index資訊 。

情況二 :     對於有但只有組合的pk 或組合的unique index 的table (index由多個欄位組成) , 那麼需要啟用 Supplemental Log , 如果更新了pk 中的部分欄位, Supplemental Log 的作用就是將pk的其餘部分也記錄到redo log 中 。 

情況三 :     對於沒有pk 或 unique index  的table , 資料庫需要啟用Supplemental Logging,  對於更新操作, Oracle會同時附加一些能夠唯一標識修改記錄的列到redo log中 。  這種情況下oracle會將所有列(提示,非lob , long之類大欄位型別的列)  都做為附加資訊記錄到redo中,這種情況下redo有可能增長迅速,並且在target端應用時也會受到一些影響。因此oracle建議最好為每個涉及到複製的表都建立主鍵或者唯一鍵。


 

對於選擇的列和那些用於精確定位的附加列的組合,oracle也對其做了定義叫做supplemental log group。隨後oracle又對supplemental log group做了分類,目的是更精確的設定redo  log中都記錄些什麼資訊,分如下兩類:


a.Unconditional Supplemental Log Groups:無條件記錄指定列的前映像,而不管發生修改操作的是不是指定列。  因此它還有個外號,叫"老記錄日誌組"。
b.Conditional Supplemental Log Groups:只有至少一個指定列發生修改操作時被觸發,並記錄下修改列的前映像。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-630259/,如需轉載,請註明出處,否則將追究法律責任。

相關文章