| 一、什么是Supplemental Logging,具體是做什么用的呢? 要回答這個問題,我們就必須先搞明白,為什么我們需要Supplemental Logging!事實上,目前最有可能用到Supplemental Logging的也只有邏輯standby和streams這兩項特性(10g以后如果希望logminer能夠分析出所有操作,建議也要啟用Supplemental Logging),這兩項特性的數(shù)據(jù)應(yīng)用都屬于邏輯應(yīng)用,類似source database執(zhí)行update語句之類,結(jié)果也要反映到target database,如何準(zhǔn)確判斷出source端修改的列,在target端中應(yīng)該更新到哪條記錄上呢?根據(jù)rowid?顯然不靠譜啊,都說了是邏輯的,塊的位置完全不一樣,rowid已無用武之地~~~你想說,能否通過表中的唯一鍵?在更新表中記錄時,將主鍵或唯一鍵做為附加的信息,與被修改的列一起存入redolog中,對于沒有主鍵唯一鍵的表,則將表中所有列統(tǒng)統(tǒng)組合做為附加信息存入redolog,這樣target端在分析redolog時,就知道該更新表中的哪些記錄了! 這就是Supplemental Logging。 數(shù)據(jù)庫啟用了Supplemental Logging之后,對于修改操作,oracle就會同時附加一些能夠唯一標(biāo)識修改記錄的列到redolog中,對于擁有主鍵或唯一鍵的表,這個操作最簡單,只需要附加主鍵或唯一鍵即可,這樣生成的redo也是最小的,當(dāng)然這只是一個理想狀態(tài),現(xiàn)實情況下某些表可能無法創(chuàng)建主鍵/唯一鍵,或者歷史原因確無主鍵/唯一鍵,這種情況下oracle會將所有列(提示,非log,long之類大字段類型的列)都做為附加信息記錄到redo中,這種情況下redo有可能增長迅速,并且在target端應(yīng)用時也會受到一些影響。因此oracle建議最好為每個涉及到復(fù)制的表都創(chuàng)建主鍵或者唯一鍵。 默認情況下,oracle不提供任何Supplemental Logging。 對于選擇的列和那些用于精確定位的附加列的組合,oracle對其做了定義叫做supplemental log group。 oracle對supplemental log group做了分類,目的是更精確的設(shè)置redolog中都記錄些什么信息,分如下兩類: 1、Unconditional Supplemental Log Groups:無條件記錄指定列的前映像,而不管發(fā)生修改操作的是不是指定列。 2、Conditional Supplemental Log Groups:只有至少一個指定列發(fā)生修改操作時被觸發(fā),并記錄下修改列的前映像。 supplemental logging又分為數(shù)據(jù)庫級別和表級。 二、數(shù)據(jù)庫級supplemental logging 數(shù)據(jù)庫級有兩種類型:minimal supplemental logging和identification key logging,其主要區(qū)別就在于寫入redolog中的數(shù)據(jù)詳盡程度不同。 Minimal supplemental logging不會強加太多的信息到redo log;identification key logging會強加大量的信息到redo log。使用LogMiner,oracle建議至少開啟minimal supplemental logging。 啟用數(shù)據(jù)庫級別的minimal supplemental logging ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; 數(shù)據(jù)庫級別的Identification Key Logging 1、ALL system-generated uncondititional supplemental log group? 一行被更新,所有列都寫入redo log(除LOBs, LONGS, ADTs) ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; 2、PRIMARY KEY system-generated uncondititional supplemental log group? 一行被更新,主鍵寫入redo log,即使沒有更新主鍵。 如果表沒有主鍵,但是有一個或多個non-null unique索引,oracle選擇一個unique索引的鍵值寫入到redo log; 如果表既沒有主鍵,也沒有non-null unique索引,則所有列(除LONG and LOB)都寫入到redo log,等價于ALL。因此oracle建議如果使用數(shù)據(jù)庫primary key supplemental logging,所有或大部分表應(yīng) 該有主鍵或唯一索引。 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS; 3、UNIQUE system-generated conditional supplemental log group 唯一索引或bitmap 索引中的任何一列改變,則唯一索引鍵或bitmap索引鍵寫入到redo log。 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS; 4、FOREIGN KEY system-generated conditional supplemental log group 外鍵的任何一列被修改,則外鍵寫入到redo log ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS; 注意: 如果數(shù)據(jù)庫處于open狀態(tài),啟用了identification key logging,游標(biāo)緩沖區(qū)的所有DML游標(biāo)都會無效,可能會影響到性能。 如果是數(shù)據(jù)庫級別啟用了identification key logging,則minimal supplemental logging被隱式開啟。 When you enable identification key logging at the database level, minimal supplemental logging is enabled implicitly. Supplemental logging語句是累積的,如果執(zhí)行了如下兩個語句,則primary key和unique key supplemental logging都開啟。 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS; ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS; 如何禁用Supplemental Logging?drop子句。 ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS; ALTER DATABASE DROP SUPPLEMENTAL LOG DATA; 三、表級Supplemental Logging 和數(shù)據(jù)庫級一樣,只不過僅限于指定的表,如: ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; 另外oracle允許用戶自己定義supplemental log groups,如: ALTER TABLE HR.EMPLOYEES ?? ADD SUPPLEMENTAL LOG GROUP emp_parttime (EMPLOYEE_ID, LAST_NAME,? ?? DEPARTMENT_ID) ALWAYS; ALTER TABLE HR.EMPLOYEES ?? ADD SUPPLEMENTAL LOG GROUP emp_fulltime (EMPLOYEE_ID, LAST_NAME,? ?? DEPARTMENT_ID); 注意: 一列可以屬于多個supplemental log group,但前鏡像只會記錄到redo log一次; 如果你對一列指定無條件和有條件的supplemental log,則這些列會無條件記錄到redo log。 |