一步一步學Streams(3) 第一部分 基礎之捕獲程式
前一章我們實踐了一把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應用的技術是一樣的(正好趁此機會再複習一下),因此下游捕獲也不得不被分成兩類:
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中獲取。
如圖:
B.歸檔下游捕獲(archived-log downstream capture)
這種方式也很有意思,你可以通過各種方式(redo傳輸服務,ftp,dbms_file_transfer包等等)複製源資料端生成的歸檔檔案到downstream資料庫。然後再由目標資料庫的capture程式進行捕獲生成LCRs儲存入queue。
如圖:
Downstream捕獲看起來步驟更多,邏輯相對較複雜,但其存在並非毫無意義,實際上downstream是oracle自10g版本(實時捕獲最低需要10gr2)才開始提供的特性,目的就是為了節省了源庫的寶貴資源,這樣就可以將捕獲工作轉移到downstream端做。
2、支援的資料型別
對於dml操作,capture程式支援捕獲下列資料型別發生的修改:
l VARCHAR2
l NVARCHAR2
l NUMBER
l LONG
l DATE
l BINARY_FLOAT
l BINARY_DOUBLE
l TIMESTAMP
l TIMESTAMP WITH TIME ZONE
l TIMESTAMP WITH LOCAL TIME ZONE
l INTERVAL YEAR TO MONTH
l INTERVAL DAY TO SECOND
l RAW
l LONG RAW
l CHAR
l NCHAR
l CLOB
l NCLOB
l BLOB
l 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被捕獲就肯定會被應用,後面我們實踐的時候會有相關的示例演示為啥捕獲沒問題,但卻無法應用。
======================================
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-524525/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一步一步學Streams(5) 第一部分 基礎之傳播程式(下)
- 一步一步學Streams(6) 第一部分 基礎之應用程式(上)
- 一步一步學Streams(7) 第一部分 基礎之應用程式(中)
- 一步一步學Streams(1) 第一部分 基礎之概述篇
- 一步一步學Streams(14) 第二部分 實踐之移除Streams複製環境
- 一步一步學Streams(13) 第二部分 實踐之建立全庫複製(3)測試
- 一步一步學DataGuard(2)基礎之術語再瞭解大概
- 一步一步學Streams(10) 第二部分 實踐之準備工作(2)初始化環境
- 一步一步學Streams(11) 第二部分 實踐之建立全庫複製(1)準備工作
- 一步一步學Streams(12) 第二部分 實踐之建立全庫複製(2)執行建立
- lucene第一步,lucene基礎,索引建立索引
- 學習程式設計第一步 零基礎上手Python開發程式設計Python
- STREAMS筆記(10) 同步捕獲筆記
- 一步一步學RMAN第五篇 RMAN基礎知識補充 一
- 一步一步學RMAN第七篇 RMAN基礎知識補充 二
- 一步一步學DataGuard(5)物理standby之建立示例
- 一步一步學DataGuard(14)邏輯standby之switchover
- 程式設計師創業第一步:如何獲取第一筆風險投資程式設計師創業
- 一步一步學ROP之Android ARM 32位篇Android
- 一步一步學ROP之linux_x64篇Linux
- 一步一步學ROP之linux_x86篇Linux
- 一步一步學DataGuard(13)邏輯standby之建立示例
- 一步一步學DataGuard(15)邏輯standby之failoverAI
- 一步一步分析vue之observeVue
- 一步一步學spring bootSpring Boot
- 一步一步分析vue之$mount(1)Vue
- 一步一步學RMAN第11篇 rman筆記之綜述筆記
- 一步一步學DataGuard(25)RMAN備份來建立之實踐
- PLSQL宣告部分異常捕獲SQL
- 一步一步分析vue之_data屬性Vue
- 一步一步學DataGuard(22)Standby之選擇資料保護模式模式
- 一步一步學DataGuard(26)RMAN備份來建立之實踐2
- mybatis入“坑”第一步MyBatis
- PyPy.js: 第一步JS
- redis第一步(安裝)Redis
- 使用雲端計算第一步 學會風險管理
- 瞭解MySQL的第一步MySql
- 【DG】[三思筆記]一步一步學DataGuard筆記