Logical Standby中為什麼要求表中資料的唯一性約束

tolywang發表於2009-09-11

          邏輯standby與primary的資料庫同步是透過sql應用實現,SQL應用轉換的SQL語句在執行時,對於insert還好,對於update,delete操作則必須能夠唯一定位到資料庫待更新的那條記錄。 如果primary庫中表設定不當,可能就無法確認唯一條件。  邏輯standby 邏輯上與primary資料庫相同,物理上可能與primary資料庫存在很大差異(比如rowid, 資料塊number,檔案佔用空間,大小 等), 邏輯standby的物理結構與primary是不相同的(即使初始邏輯standby是透過primary的備份建立),因此想透過rowid  更新顯然是不行的,不能再將rowid做為唯一條件 。  

如何確保primary庫中各表的行可被唯一標識  

      Oracle  透過主鍵、唯一索引/約束補充日誌(supplemental logging)來確定待更新邏輯standby庫中的行。當資料庫啟用了補充日誌(supplemental logging),每一條update語句寫redo的時候會附加列值唯一資訊,比如:

      v  如果表定義了主鍵,則主鍵值會隨同被更新列一起做為update語句的一部分,以便執行時區別哪些列應該被更新。

      v  如果沒有主鍵,則非空的唯一索引/約束會隨同被更新列做為update語句的一部分,以便執行時區分哪些列應該被更新,如果該表有多個唯一索引/約束,則oracle自動選擇最短的那個。

      v  如果表即無主鍵,也沒有定義唯一索引/約束,所有可定長度的列連同被更新列作為update語句的一部分。更明確的話,可定長度的列是指那些除:long,lob,long raw,object type,collection型別外的列。

     

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

相關文章