Ref: http://www.itpub.net/thread-1751245-1-1.html
add trandata user.table的含義
有兩層含義:
第一層含義: table有PK or UK ,則目標端能準確依據PK or UK,從而找到來源端DML更新的資料,從而在目標端同步。
第二層含義: table沒有PK or UK,則目標端只能依據該table的所有列,從而找到來源端DML更新的資料,從而在目標端同步。
還有一種語法和add trandata作用相同,如下:
alter table user.table add supplemental log group ggs_table_1 (PK or UK) always; ---和第一層含義等效(有主鍵或唯一建)。
alter table user.table add supplemental log group ggs_table_1 (all column) always; ---和第二層含義等效(沒有主鍵或唯一建)。
延伸一下:
當某個table的column超過32個欄位且無PK的時候,使用add trandata去新增supplemental log就會報出錯(Oracle 10g之後的版本已經沒有這個add supplemental log32個欄位的限制):
WARNING OGG-00706 Failed to add supplemental log group on table user.table due to ORA-02257: maximum number of columns exceeded ......
這個時候,就要使用
alter table user.table add supplemental log .....這種方式才可。
這個時候,要分兩種情況:
第一情況是,表格欄位超過32個,但是有主鍵或唯一建
第二情況是,表格欄位超過32個,沒有主鍵或唯一建
對於第一種情況,如下解決:
alter table user.table add supplemental log group ggs_table_1 (PK or UK) always;
對於第二種情況,要複雜一些:
alter table user.table add supplemental log group ggs_table_1 (all column <32) always;
alter table user.table add supplemental log group ggs_table_2 (all colum >32) always;
在延伸一下:
還有一種情況是,使用add trandata的時候,但table沒有UK,PK的時候,又不允許把所有的列當做關鍵列來同步資料,這時候,怎麼辦?
這個問題,解決起來,比較複雜:
可以參考這個連結:
或是我在blogger寫的另一篇文章
alter table <table_name> add OGG_KEY_ID raw(16);
alter table default sys_guid();
沒有留言:
張貼留言