前一章我們實踐了一把streams同步單表的過程,看起來很簡單是不是(如果你覺著複雜,那不是因為streams本身操作複雜,而是為了配置好streams前期的準備工作較複雜),事實上也確實很簡單,由小能見大,我們從上述樣本中應該也能看出streams的操作方式就是捕獲(capture)->傳播(propagation)->應用(apply),不管是表也好,schema也好,database也好,都是遵循這個操作過程,下面逐一介紹捕獲傳播和應用進程,俺儘可能做到清晰簡單直白,但限於個人理解和自身水平,如描述有誤請自行鑒別:))。另,本章文字描述較多,內容相對枯燥,閱讀前要做好準備,如有心直接上手更進階的實踐配置,可跳過本節,瀏覽第二部分。
捕獲(Capture)
眾所周知,資料庫的修改操作均會被記入redolog(表鑽牛角尖,俺指通常情況下),以便在發生錯誤時,能有途徑修正。而Capture進程做為oracle的一個後台進程天生就擁有讀取redolog的本領,因此它也就具有了捕獲dml,dll修改操作的能力。
Capture進程將修改格式化為指定的格式存入message定義為LCRs並將其置入隊列(queue)。由於運行中的capture進程自動基於其自己的規則捕獲修改,因此又被稱為:隱式捕獲(implicit capture)。
提示:什麼是LCR
capture進程捕獲資料庫的操作,例如表/schema甚至整個資料庫的修改等。這些修改都會記入redo,而capture進程就是根據redolog分析資料庫中的修改並格式化儲存為message,這些message即被稱為:logical change record (LCR)。捕獲進程通過定義的rule來確定哪些修改會被捕獲,這些被捕獲的修改稱為captured messages。
因此:Messages->LCRs->Captured message
LCRs也分兩種:
A>.row LCR:包括DML操作產生的修改資訊,注意由於單條dml sql語句也有可能觸發多條記錄的修改,因此一條dml修改操作也可能產生多條row LCR,另外對於單行中大欄位類型的修改比如long,lob也可能產生多條row LCR;
每條rowLCR被封裝成LCR$_ROW_RECORD的物件類型,包含下列屬性:
n source_database_name:觸發修改操作的資料庫
n command_type:觸發修改操作的命令類型,比如:INSERT, UPDATE, DELETE, LOB ERASE, LOB WRITE, or LOB TRIM。
n object_owner:對象屬主
n object_name:對象名稱
n Tag:標籤,可用於追蹤LCR
n transaction_id:觸發修改的DML語句所屬事務ID
n Scn:發生修改時的SCN(system change number )
n old_values:DML修改前的值,不過注意不同的dml操作產生值也不同,比如UPDATE or DELETE的舊值就是修改前的值,而對於INSERT則該列為空白
n new_values:DML修改後的值,基於相同的原因,不同的dml操作也會產生不同的值,比如UPDATE or INSERT的值即修改後的值,而DELETE操作則該列為空白
B>.DDL LCR:包括ddl操作產生的對象修改資訊,DDL LCR包括下列的資訊:
n source_database_name:同rowLCR
n command_type:同rowLCR
n object_owner:同rowLCR
n object_name:同rowLCR
n object_type:物件類型,比如TABLE/VIEW/PACKAGE
n ddl_text:執行的DDL語句
n logon_user:執行DDL語句的使用者
n current_schema:執行DDL語句的schema
n base_table_owner:基表屬主(如果有的話,當然通常沒有,但是對於某些操作比如觸發器觸發的的修改,則基表即是觸發表)
n base_table_name:基表名稱,其它同上。
n tag:同rowLCR
n transaction_id:同rowLCR
n scn:同rowLCR
提示:
不管是rowLCRs或DDL LCRs都包括來源資料庫名稱,為避免在propagation或apply時出現問題,ORACLE建議不要隨便修改來源資料庫名稱。
1、捕獲方式
Capture進程即可以在本地捕獲,即本地捕獲進程(local capture process),也可以在遠程其它資料庫執行捕獲,即下遊捕獲進程(downstream capture process),執行下載捕獲的資料庫也被稱為downstream資料庫,甚至還可以同時配置本地捕獲和下遊捕獲。
本地捕獲比較簡單,是指capture進程運行於本地,如圖所示:
下遊捕獲就要複雜一點點,因為它要涉及到將本地產生的redologs發送至遠端執行捕獲的資料庫,說到發送redologs讓回憶起了standby是吧,對,此處確實與standby有所關聯,發送redologs應用的技術是一樣的(正好趁此機會再複習一下),因此下遊捕獲也不得不被分成兩類:
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/