一步一步學Streams(3) 第一部分 基礎之捕獲程式

junsansi發表於2008-12-29

前一章我們實踐了一把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的物件型別,包含下列屬性:

source_database_name:觸發修改操作的資料庫

command_type:觸發修改操作的命令型別,比如:INSERT, UPDATE, DELETE, LOB ERASE, LOB WRITE, or LOB TRIM

object_owner:物件屬主

object_name:物件名稱

Tag:標籤,可用於追蹤LCR

transaction_id:觸發修改的DML語句所屬事務ID

Scn:發生修改時的SCN(system change number )

old_values:DML修改前的值,不過注意不同的dml操作產生值也不同,比如UPDATE or DELETE的舊值就是修改前的值,而對於INSERT則該列為空

new_values:DML修改後的值,基於相同的原因,不同的dml操作也會產生不同的值,比如UPDATE or INSERT的值即修改後的值,而DELETE操作則該列為空

 

B>.DDL LCR:包括ddl操作產生的物件修改資訊,DDL LCR包括下列的資訊:

source_database_name:同rowLCR

command_type:同rowLCR

object_owner:同rowLCR

object_name:同rowLCR

object_type:物件型別,比如TABLE/VIEW/PACKAGE

ddl_text:執行的DDL語句

logon_user:執行DDL語句的使用者

current_schema:執行DDL語句的schema

base_table_owner:基表屬主(如果有的話,當然通常沒有,但是對於某些操作比如觸發器觸發的的修改,則基表即是觸發表)

base_table_name:基表名稱,其它同上。

tag:同rowLCR

transaction_id:同rowLCR

scn:同rowLCR

提示:

不管是rowLCRs或DDL LCRs都包括源資料庫名稱,為避免在propagation或apply時出現問題,ORACLE建議不要隨便修改源資料庫名稱。

 

1、捕獲方式

Capture程式即可以在本地捕獲,即本地捕獲程式(local capture process),也可以在遠端其它資料庫執行捕獲,即下遊捕獲程式(downstream capture process),執行下載捕獲的資料庫也被稱為downstream資料庫,甚至還可以同時配置本地捕獲和下游捕獲

本地捕獲比較簡單,是指capture程式執行於本地,如圖所示:

一步一步學Streams(3) 第一部分 基礎之捕獲程式

下游捕獲就要複雜一點點,因為它要涉及到將本地產生的redologs傳送至遠端執行捕獲的資料庫,說到傳送redologs讓回憶起了standby是吧,對,此處確實與standby有所關聯,傳送redologs應用的技術是一樣的(正好趁此機會再複習一下),因此下游捕獲也不得不被分成兩類:

A.實時下游捕獲(real-time downstream capture)

Redo傳輸服務通過LGWR傳送redo資料到downstream資料庫,downstream資料庫端通過RFS(remote file server)程式接收並儲存到本地的standby redolog檔案中,歸檔程式讀取standby redo並寫入歸檔檔案,downstream端capture程式即可從standby redo中捕獲修改,也可以從archive redo中捕獲修改,當然,優先從standby redo中獲取。

如圖:

一步一步學Streams(3) 第一部分 基礎之捕獲程式

 

B.歸檔下游捕獲(archived-log downstream capture)

這種方式也很有意思,你可以通過各種方式(redo傳輸服務,ftp,dbms_file_transfer包等等)複製源資料端生成的歸檔檔案到downstream資料庫。然後再由目標資料庫的capture程式進行捕獲生成LCRs儲存入queue。

如圖:

一步一步學Streams(3) 第一部分 基礎之捕獲程式

Downstream捕獲看起來步驟更多,邏輯相對較複雜,但其存在並非毫無意義,實際上downstream是oracle自10g版本(實時捕獲最低需要10gr2)才開始提供的特性,目的就是為了節省了源庫的寶貴資源,這樣就可以將捕獲工作轉移到downstream端做。

 

2、支援的資料型別

對於dml操作,capture程式支援捕獲下列資料型別發生的修改:

VARCHAR2

NVARCHAR2

NUMBER

LONG

DATE

BINARY_FLOAT

BINARY_DOUBLE

TIMESTAMP

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH LOCAL TIME ZONE

INTERVAL YEAR TO MONTH

INTERVAL DAY TO SECOND

RAW

LONG RAW

CHAR

NCHAR

CLOB

NCLOB

BLOB

UROWID

與邏輯standby型別,capture對於下列的型別同樣不支援:BFILE, ROWID, and user-defined types (including object types, REFs, varrays, nested tables, and Oracle-supplied types)。應用transparent data encryption的列也不被支援,capture程式捕獲上述不支援型別時會觸發一條錯誤資訊並寫入trade檔案。預設rule下,捕獲程式會自動disable。

 

提示:關於rule的資訊也非常多,並且streams提供了positive rule set 和negative rule set以實現更靈活的捕獲規則,本文不準備逐一介紹,除後期實踐部分用到時針對具體設定程式說明外,更全面的關於rule的設定,也許某天會以專門附章形式提示,有耐心的朋友不妨持續等待,沒耐心的話,黑黑,也得等。

 

3、支援的操作

A.DML捕獲

STREAMS支援:INSERT,UPDATE,DELETE,MERGE/LOBs UPDATE觸發的修改。

注意:

1.Capture程式會將merge產生的修改轉換成insert或update,因為對於rowLCR來說,MERGE並不是一個有效的命令型別。

2.對於索引表不能包含ROWID/UROWID/User-defined types (including object types, REFs, varrays, and nested tables),不然Capture程式會報錯。

3.Capture程式忽略如CALL,EXPLAIN PLAN或LOCK TABLE命令。

4.Capture程式不會捕獲臨時表或物件表中的修改。

5.Capture程式不會捕獲類似sequence.nextval之類的操作,因此對於雙向複製的streams環境中sequence的賦值需要注意。

B.DDL捕獲

通常情況下capture程式根據定義的rule sets執行ddl捕獲,不過無論如何下列的幾種ddl操作都不會被捕獲:

ALTER DATABASE

CREATE CONTROLFILE

CREATE DATABASE

CREATE PFILE

CREATE SPFILE

FLASHBACK DATABASE

Capture程式捕獲的是ddl語句而並非ddl語句執行產生的結果(注意這點)。舉個例子,你在源端執行analyze語句,capture並不會捕獲analyze生成的那些統計資訊,而只是analyze這條語句。只有一種例外即create table as select這類語句,對於這種語句它除了捕獲語句本身外,還需要捕獲select的列(做為insert rowLCR)。

注意:並非ddl被捕獲就肯定會被應用,後面我們實踐的時候會有相關的示例演示為啥捕獲沒問題,但卻無法應用。

 

======================================

一步一步學Streams(2) 第一部分 架設一個單表複製環境

一步一步學Streams(1) 第一部分 基礎之概述篇

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

相關文章