replicat的handcollisions和reperror

myownstars發表於2013-05-21

Replicat處理DML時可能會出現資料衝突,根據場景不同,可分別使用handcollisionreperror處理

 

HANDLECOLLISIONS

是我們使用goldengate過程中常有的一個REPLICAT引數,該引數依賴於主鍵或唯一索引處理衝突資料,常用於初始化階段。

對於無主鍵或唯一索引的表無法處理衝突,且可能導致重複記錄。

注意開啟此引數則所有資料錯誤不管reperror如何配置均不再寫discard檔案,即所有資料衝突資訊被預設規則處理,沒有任何日誌,因此日常複製不建議使用該引數;

可予以考慮的特殊場景為只需新增資料,無需複製歷史資料。

 

使用HANDLECOLLISIONS的幾個場景:

1.    target丟失delete記錄(missing delete),忽略該問題並不記錄到discardfile

2.    target丟失update記錄(missing update)

     更新的鍵值是主鍵= update轉換成INSERT ,預設情況下插入記錄不完整

     更新的鍵值是非主鍵=》 忽略該問題並不記錄到discardfile

3.    重複插入已存在的主鍵值到target表中,這將被replicat轉換為UPDATE現有主鍵值的行的其他非主鍵列

另:該引數僅處理資料本身的Insert/Delete衝突,如果出現兩端對映或其它結構性問題Replicat程式依然會abend,不能被忽略

 

此外對於主鍵的更新操作,若在target使用HANDLECOLLISIONS且該update丟失,在會轉換為INSERT該主鍵的操作,注意預設情況下插入的記錄不完整,FETCHOPTIONS FETCHPKUPDATECOLS將捕獲完整的redo image映象到trail中,這保證把primary key的更新透過HANDLECOLLISIONS轉換為對target的一個完整記錄的插入。

 

我們可以透過send 命令動態取消HANDLECOLLISIONS

GGSCI (XIANGBLI-CN) 29> send rep2, NOHANDLECOLLISIONS

Sending NOHANDLECOLLISIONS request to REPLICAT REP2 ...

REP2 NOHANDLECOLLISIONS set for 1 tables and 0 wildcard entries

 

REPERROR

包含如下action

 ABEND: roll back the transaction and stop processing.

 DISCARD: log the error to the discard file and continue processing.

 EXCEPTION: send the error for exceptions processing (see Handling errors as exceptions.

 IGNORE: ignore the error and continue processing.

 RETRYOP [MAXRETRIES ]: retry the operation, optionally up to a specific number of times.

 TRANSABORT [, MAXRETRIES ] [, DELAY[C]SECS ]: abort the transaction and reposition to the beginning, optionally up to a specific number of times at specific intervals.

 RESET: remove all previous REPERROR rules and restore the default of ABEND.

 TRANSDISCARD: discard the entire replicated source transaction if any operation within that transaction, including the commit, causes a Replicat error that is listed in the

             error specification. This option is useful when integrity constraint checking is disabled on the target.

 TRANSEXCEPTION: perform. exceptions mapping for every record in the replicated source transaction, according to its exceptions-mapping statement, if any operation within

             that transaction (including the commit) causes a Replicat error that is listed in the error specification.

其中後兩個為事務相關

事務錯誤處理又受如下引數影響

 

Batchsqlgrouptransops

將不同事務sql打包進行批次處理,出錯時首先嚐試使用不同處理模式

如錯誤依舊存在則如下處理

1 回滾batch sql,逐個transaction進行處理

2 對失敗的事務進行transdiscardtransexception處理

3 處理完畢後恢復batchsql/grouptransops模式

 

Maxtranops

將大事務分割成若干小事務處理,此舉雖提升效能但破壞了事務完整性;

如果事務分割成N個且第一個成功提交而後續事務失敗,則無法回滾第一個分事務;

 

Statsreplicat命令會顯示由transdiscard/transexception處理的行數

 

Reperror命令語法如下

REPERROR { (

{DEFAULT | DEFAULT2 | | },

{ABEND | DISCARD | EXCEPTION | IGNORE |

RETRYOP [MAXRETRIES ] |

TRANSABORT [, MAXRETRIES] [, DELAYSECS | DELAYCSECS ] |

TRANSDISCARD |

TRANSEXCEPTION

}) |

RESET }

可使用兩個default引數,作用如下

default

Sets a global response to all errors except those for which explicit REPERROR statements are specified.

default2

Provides a backup default action when the response for DEFAULT is set to EXCEPTION. Use DEFAULT2 when an exceptions MAP

statement is not specified for a MAP statement for which errors are anticipated.

 

對於exception/transexception,可將錯誤值捕獲到異常表中

Map exceptiononly/mapexception

其中exceptiononly只適用於特定的表,即不能使用wildcards

 

異常表

須確保trail記錄包含所有對映至異常表的列,可在extract引數檔案配置如下引數:

Nocompressdeletesdelete語句包含該行所有列

Getupdatebefores:可捕獲行的前映象並寫入trail

 

--使用兩個map,第一個用於常規操作,第二個則處理異常

REPERROR (DEFAULT, EXCEPTION)

MAP ggs.equip_account, TARGET ggs.equip_account2,

COLMAP (USEDEFAULTS);

MAP ggs.equip_account, TARGET ggs.equip_account_exception,

EXCEPTIONSONLY,

INSERTALLRECORDS

COLMAP (USEDEFAULTS,

DML_DATE = @DATENOW(),

OPTYPE = @GETENV("LASTERR", "OPTYPE"),

DBERRNUM = @GETENV("LASTERR", "DBERRNUM"),

DBERRMSG = @GETENV("LASTERR", "DBERRMSG"));

 

MAP src.trx*, TARGET trg.*,

MAPEXCEPTION (TARGET fin.trxexceptions,

COLMAP (USEDEFAULTS,

ACCT_NO = ACCT_NO,

OPTYPE = @GETENV (LASTERR, OPTYPE),

DBERR = @GETENV (LASTERR, DBERRNUM),

DBERRMSG = @GETENV (LASTERR, DBERRMSG)

)

);

 

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

相關文章