文章實驗環境:Win2000 Server、IBM® DB2® Universal Database™ for Windows® V7.1+補丁包9。注:本文將主要討論DB2之間的數據復制,而不考慮包含非IBM數據庫的數據復制
什麼是數據復制
數據復制就是通過將源數據庫中指定的數據復制到目標數據庫中,以保持源數據庫與目標數據庫中指定數據的同步(一致)。
基礎概念
CD表:change data tables更改數據表,用於臨時存放更改數據的表。一般包含有需要捕捉更改的列及一些控制列。
例如:用戶指定的,要捕捉更改的列
CREATE TABLE DEPARTMENT (
DEPTNO …, <--
DEPTNAME …, <--
MGRNO …,
ADMRDEPT …,
LOCATION …)
源表
CREATE TABLE CD20030805296530(
IBMSNAP_UOWID …,
IBMSNAP_INTENTSEQ…,
IBMSNAP_OperaTION …,
DEPTNO…, <--
DEPTNAME …) <--
CD表
DB2日志類型:
循環日志 歸檔日志:
DB2數據復制的組件
DB2 DataPropagator由三部分組成:管理界面、更改捕捉機制、應用程序
注意:此處應用程序(Apply program)與我們通常所說的應用程序是不同的概念,本文中如無特殊說明,“應用程序”都是指DB2數據復制的組件。
管理界面
我們主要用它來創建用於存儲復制標准的控制表。控制表有多種類型,用來存放要復制哪些表哪些列等信息,我們在後面再仔細探討。我們可以使用的管理界面有兩種:
1.DB2 Control Center(DB2 控制中心)
只能針對DB2服務器之間的數據復制
2.DataJoiner Replication Administration (DJRA)
可包含非IBM數據庫的數據復制(本文不詳細討論)
具體控制表類型可通過查看文件“SQLLIBsamples epldpcntl.udb”來獲得,本文涉及到的控制表主要有:ASN.IBMSNAP_REGISTER、ASN.IBMSNAP_UOW等。
更改捕捉機制
在建立復制環境之後,利用該機制去捕捉源數據庫發生的更改,且將更改臨時存放於CD表中。 DB2數據復制解決方案提供兩種捕捉數據的機制:
1.捕捉DB2源表的捕捉程序
當源是DB2表時,捕捉程序會捕捉在源上所發生的更改。捕捉程序使用數據庫日志去捕捉發生於源數據庫上的更改,並將更改臨時存儲在表裡。捕捉程序運行在源服務器上。
2.捕捉非IBM數據庫源表的捕捉觸發器(本文不詳細討論)
應用程序
當捕捉程序將源表發生的更改臨時存放於CD表中後,應用程序再從這些表中讀出源數據庫的更改,將它應用於目標數據庫,或者直接將數據從源數據庫拷貝到目標數據庫。
1.當剛搭建起復制環境時,有一個初始化過程,該過程應用程序將直接從源表或視圖讀數據來初始目標表。而後如果你想復制更改,應用程序從CD表中讀取臨時存儲的變化數據,將它應用於目標表。
2.應用程序通常運行在目標服務器上,但它也可以運行在可以連接到源、控制和目標服務器的網絡上的任一服務器上。多個應用程序實例可以運行在相同或不同的服務器上。
3.每一個應用程序與一個包含著控制表的控制服務器相關聯,控制表中包含著預訂集的定義。控制表可以被多個應用程序實例使用。比如:你有一個源服務器和兩個目標服務器,那麼,你就可以將應用程序分別運行於每一台目標服務器上。這兩個應用實例可以共享控制表,控制表中有特定的信息與每一應用實例相關聯。
各復制組件之間如何通訊
各復制組件之間是相互獨立的,所以他們依賴於控制表中的信息進行通信。捕捉、應用程序通過更新控制表以指示復制的進程及協調變化進程。
對於DB2之間的復制,捕捉程序通過讀取源服務器上的日志來捕捉源表中數據的更改。然後捕捉程序將更改的數據放入稱之為更改數據(CD)表的表中。
每次應用程序拷貝數據到目標數據庫,目標數據庫的內容將反映出在源數據庫上發生的更改。應用程序是通過應用自應用程序所知道的對於目標的上一次更新以來累加的事務來實現的,即只應用還沒應用的更改。
基於日志的通訊
捕捉程序使用部分控制表去記錄發生在源數據庫上的更改,而應用程序使用這些控制表中的值去檢測什麼需要拷貝到目標庫中。
重要:如果應用程序沒有通知捕捉程序,捕捉程序不會捕捉任何更改信息。同樣,除非你定義一個復制源並將它和預訂集相關聯,否則應用程序不會通知捕捉程序開始捕捉更改。
下面講解在典型的復制環境下,應用程序和捕捉程序如何通訊以保證數據的一致性:
從源數據庫捕捉數據
1.捕捉程序通過讀控制表ASN.IBMSNAP_REGISTER來判斷哪些復制源需要開始捕捉更改。如果在捕捉程序運行期間,用戶定義了新的復制源,那麼你必須重新初始化或重啟捕捉程序,它才會開始生效。
2.捕捉程序通過監控DB2的日志去檢測那些定義為復制源的源表所更改的記錄。
3.每一復制源都有一張CD表。當捕捉程序在DB2日志中發現有一行數據發生更改時,它會在CD表中加入一行相應的數據,以記錄發生的更改(如果updates被定義為DELETE和INSERT時,則加入兩行)。
4.捕捉程序將提交的事務信息存儲在控制表ASN.IBMSNAP_UOW中。該控制表中的行標志著在源服務器上發生的已提交的事務。對於基於日志的捕捉程序,每一個DB2源服務器都存在一張控制表ASN.IBMSNAP_UOW。
5.捕捉程序會更新控制表ASN.IBMSNAP_REGISTER來記錄每一個復制源有多少已提交的數據被捕捉。
將數據應用於目標數據庫
6.對於所有的預訂集,應用程序首先通過將源表的所有數據拷貝到目標表中,以達到與復制源的同步。這個步驟稱之為全更新拷貝。在進行全更新拷貝之後,捕捉程序開始捕捉數據源發生的更改。
7.如果任何預訂集准備復制,應用程序通過檢查控制表ASN.IBMSNAP_REGISTER來判斷是否有發生變化以需要復制。
8.應用程序通過更新修剪控制表來同步存儲在CD表中相關源表的更改
9.應用程序從CD表和控制表ASN.IBMSNAP_UOW的連接中拷貝變化的數據到目標表中。通過連接這兩個控制表,應用程序確保只拷貝在數據源上已提交的變化。
修剪表
10.應用程序用一個指向拷貝變化到目標數據庫的值來更新修剪控制表ASN.IBMSNAP_PRUNCNTL。
11.當應用程序修剪CD表和UOW控制表時,它先確定哪些更改已經應用,然後將其從那兩個控制表中刪除。
DB2數據復制概念
這部分介紹一些DB2數據復制的重要概念。你應該閱讀整個部分以獲得一個整體的概念。
復制源
一個復制源其實就是一張你想從中拷貝數據的用戶表或視圖。在你可以復制數據之前,你必須先定義一個復制源用來描述更改捕捉機制所使用的信息。當你定義一個復制源時,你必須指定你想復制的列,還有決定你想把更新當做UPDATE操作處理還是DELETE和INSERT操作。另外,你必須決定:
-是否想對一列捕捉前映象
-你是否想使用更改捕捉(差別更新拷貝)還是不使用更改捕捉(全更新拷貝)
-對於任何地方的更新復制(復制源有讀/寫目標表)想使用什麼級別的沖突檢測
後映象列和前映象列
一列後映象列包含源表中一列數據列被更新後的那列數據。一列前映象列包含源表中一列數據列被更新前的那列數據。當你定義一個復制源的時候,你可以選擇只捕捉後映象(默認)或者後映象和前映象一起捕捉。這取決於你打算使用這些數據的方法和你正在使用的表的類型。例如:表DEPARTMENT中有一列DEPTNO,若在定義復制源時指定該列捕捉後映象和前映象,該列有一行數據為’A00’,若使用UPDATE語句將’A00’更新為’A01’,則在其相應的CD表中同時記錄了更新前後的值:
紅色部分為用戶指定的,要捕捉更改的列(後映象列),藍色部分為前映象列,存放對應列被更新前的值。
CREATE TABLE DEPARTMENT (
DEPTNO …, ‘A00’
DEPTNAME …,
MGRNO …,
ADMRDEPT …,
LOCATION …)
源表
CREATE TABLE CD20030805296530(
IBMSNAP_UOWID …,
IBMSNAP_INTENTSEQ…,
IBMSNAP_OperaTION …,
XDEPTNO…, ‘A00’
DEPTNO…, ‘A01’
XDEPTNAME …,
DEPTNAME …)
CD表
在需要審計或回滾能力的應用系統中,前映象列是非常有用的。
全更新和差別更新拷貝
應用程序通過全更新或差別更新拷貝從源表拷貝數據到目標表中。
-在只進行全更新拷貝時,應用程序執行一下任務:
1.刪除目標表中的所有行
2.從源表中讀取所有行
3.拷貝這些行到目標表中
-在進行差別更新拷貝時,應用程序只拷貝更改的數據到目標表中。
沖突檢測級別
沖突檢測僅適用於“任何地方的更新(update-anywhere)”復制配置。它是在同一個復制周期,源和目標表中的同一行被更新的檢測程序。對於標准沖突檢測,應用程序在那些已經捕捉到CD表中的行中查找沖突。對於增強的沖突檢測,應用程序鎖住所有目標表,因此確保了在檢查沖突時所有更改都被考慮到。
預訂集和預訂集成員
在開始從復制源復制數據前,你必須先將復制源和復制目標相關聯起來,復制源所發生變化將被復制到復制目標中。我們使用預訂集和預訂集成員來定義這種信息。我們定義的這些信息將存儲在各種復制控制表中。
一個預訂集包含一個復制預訂的屬性。當你創建一個預訂集時,要定義下面的屬性:
-預訂名
-源服務器和目標服務器
-應用限定符
-什麼時候開始復制,復制頻率,是否使用基於時間或基於事件或者基於兩者的復制頻率
-如果你有大量的更改,是否將數據分塊提交
預訂集中對每一張目標表或視圖,必須有一個預訂集成員。當你創建一個預訂集成員,要定義以下屬性:
-源表或視圖、目標表或視圖
-目標表或視圖的結構
-要復制的列(子查詢列)
-要復制的行(用SQL謂詞WHERE限定過濾條件)
預訂集確保所有預訂集成員在復制期間是相同的:更改要麼被應用於所有的目標,要麼不被應用於所有的目標。在一個預訂集中的所有預訂成員的更改數據通過單一的一個事務復制到指定的目標表中。因為在一個預訂集中的目標表是在一個事務中處理的,預訂集使性能最優化。預訂集也保持著參照一致性。
一個預訂集被一個應用程序使用,然而,每個應用程序可以通過相同的應用限定符處理多個預訂集。
應用限定符
應用限定符將一個應用程序和一個或多個預訂集關聯起來。當你定義一個預訂集時,指定一個名稱(區分大小寫)作為應用限定符。
通過使用多個應用限定符,你可以只使用一個用戶ID運行多個應用程序實例。例如:假設你想從兩個源數據庫復制數據到你計算機上的目標表。源表A中的數據使用“全更新拷貝”復制到目標表A,源表B中的數據使用“差別更新拷貝”復制到目標表B中。你定義了兩個預訂集(一個對應表A,一個對應表B),而且你使用各自的應用限定符以允許應用程序的兩個實例在不同的時間拷貝數據。你也可以將兩個預訂集用同一個應用限定符定義,用同一個應用程序實例拷貝數據。
數據操作
也許你想只復制源表中的子集,可以使用簡單的視圖來重構從源表到目標表的數據,或者使用復雜的連接或聯合。
源表的子集
你可以復制源表中的某些列或某些行,而不是復制整個表。
對於目標的連接和聯合
你可以創建和維護包含由多張已存在的源表連接或聯合成的內容的目標表。
你可以使用下面的連接類型:
-跨越一個或多個定義的復制源的簡單內部連接,可能和其它的復制源的其它表或視圖組合。
你可以通過下面的方法采用連接和聯合來操作數據:
-從單一的DB2源服務器上連接表(通過定義一張由某些表連接成的DB2視圖)
-從一個源服務器上聯合的表(通過在一個預訂集中使用包含相同目標表的多個預訂集成員)
-從多個源服務器的聯合,有時稱之為多點聯合(通過創建在多個預訂集中的多個預訂集成員)目標表
當你定義一個預訂集成員時,你必須指定你所使用目標表的類型。有下面幾種表類型可以用:
-用戶拷貝表
-時間點表
-聚集表
-CCD表
-副本或行副本表
-用戶表
下面介紹一下這些目標表類型的特點:
用戶拷貝表
這些表是復制源的只讀拷貝,不帶有附加的復制控制列,就像普通的源表。它們是目標表最普通的類型。
時間點表
這些表是復制源的只讀拷貝,附帶有一時間戳列。時間戳列初始為空。當復制更改時,該列被賦予相應值以指示更新的時間。當你想跟蹤更改的時間時,可以使用這種類型的表。
聚集表
這些是只讀的表,使用SQL列函數(如SUM、AVG)來計算源表全部或最近發生更改的數據的摘要。行會隨時間追加到聚集表。
基礎聚集表匯總一張源表的內容。用基礎聚集表來定期地跟蹤源表狀態。例如,假設你想知道你每個月的顧客平均數。如果你的源表中一個顧客對應一行,你每月將你源表中的行數取平均,而後將平均值存儲到一張基礎聚集表中。
基礎聚集表沒有跟蹤更改信息。例如,假設你一月份平均有500個顧客,二月份也有500個顧客。然而,在二月份,你失去兩個現有的客戶,同時新增兩個新客戶。基礎數據表顯示這兩個月平均顧客數是一樣的,但它沒有反映出二月份的變化。如果你想跟蹤變化信息,可以使用更改聚集表。
更改聚集表使用控制表中的更改數據,而不使用源表中的內容。使用更改聚集表來跟蹤隨時間發生的更改(UPDATE、INSERT、DELETE操作)。例如,假設你想知道每個月你增加多少新客戶(INSERTS)失去多少現有客戶(DELETES)。你將按月統計你源表中行所發生的更改,將統計結果存儲在更改聚集表中。
CCD表
涉及非IBM數據庫,本文不予討論。
副本或行副本表
這些是唯一能被直接被我們的應用程序(此處的應用程序指用戶的應用系統)更新的目標表。發生於副本或行副本的更改會被復制到相關的源表中;源表再依次復制更改至其它副本。使用副本表類型適用於任何地方的更新的復制。
用戶表你不用直接指定一張用戶表作為目標表;然而,對於任何地方的更新的復制,一張用戶表將自動做為與其相關的副本或行副本的目標。用戶表是副本的父母,而且它的拷貝依賴於副本。副本的父母從依賴副本那裡接受更新,如果沒有沖突檢測,它將復制更改到其它依賴副本。副本的父母是主要數據源。如果任何更新沖突被檢測到,副本的父母的內容成功。典型情況下,你的應用程序訪問依賴的副本表;然而,當副本不可用時,它們將連接至包含用戶表的服務器上。
應用更新的調度
同步復制將連續的遞送更新。當源數據發生改變,它將臨時存儲起來,繼而轉送到目標。只有更改已經復制到目標數據庫,源數據庫才進行提交。這種類型的復制也稱之為實時復制。
異步復制將分階段遞送更新。當源數據發生改變,它將在事先設定的時間間隔內臨時存儲起來,而後再繼續轉送到目標。時間間隔可以用時間(秒、分、時)度量或用指定的事件(午夜,或一天中的其它時間)來度量。如果更改沒能被應用於目標數據庫(例如,目標數據庫或者網絡停機),它們將被存儲起來稍後再被應用,應用的順序將按照在源數據庫上的發生順序。這種復制類型提供了比同步復制更多的好處:更好的利用網絡資源,更少的數據庫連接,在數據到達目標數據庫之前有機會提高數據。
例子
以下操作或命令主要在DB2的控制中心或命令控制台中進行(紅色部分根據具體情況調整),相關命令更詳細的使用參見DB2幫助文檔。
建立復制環境
先創建文件夾C:示例以存放一些腳本文件
1.創建源數據庫
DB2 CREATE DB DB_S
2.將數據庫日志改為歸檔日志Capture
DB2 UPDATE DB CFG FOR DB_S USING LOGRETAIN Capture
3.根據需要調整日志大小(如果需要的話)
4.備份數據庫(改為歸檔日志的數據庫必須先備份才能對其進行操作)
DB2 BACKUP DB DB_S
5.創建源表
DB2 CONNECT TO DB_S USER UserName USING PassWord
DB2 CREATE TABLE TAB_1_S (COL_1 VARCHAR(20) NOT NULL, COL_2 VARCHAR(20), PRIMARY KEY(COL_1))
6.定義復制源
在控制中心左邊樹型列表中數據庫DB_S下選中表,右邊列表列出了所有的表,用右鍵點擊表TAB_1_S,在彈出的菜單中選中定義為復制源—>定制,接受默認選項,點擊確定,彈出現在運行還是保存窗口,接受默認的保存設置,點擊確定,彈出選擇系統名窗口,選擇數據庫所在系統,點擊確定,彈出文件浏覽器,把當前目錄定位到C:示例,在路徑中輸入文件名tab_1_replscr.sql,點擊確定。保存成功後可以用文本編輯器查看tab_1_replscr.sql中的內容,可以發現裡邊主要是生成CD表,和注冊復制源(通過往表ASN.IBMSNAP_REGISTER中插入記錄)的SQL語句。
7.運行復制源
用右鍵點擊控制中心左邊樹型列表中數據庫DB_S下的復制源,在彈出菜單中選擇運行SQL文件…,彈出選擇系統名窗口,選擇數據庫所在系統名,確定,在彈出的文件浏覽器中選擇tab_1_replscr.sql後確定,如果成功,用右鍵進行刷新,將顯示出新定義的復制源TAB_1_S。
8.將捕捉程序與源數據庫綁定(注意:必須轉跳到DB2的SQLLIBnd目錄下)
CD C:Program FilesSQLLIBnd
DB2 CONNECT TO DB_S USER UserName USING PassWord
DB2 BIND @CAPTURE.LST ISOLATION UR BLOCKING ALL
DB2 BIND @APPLYUR.LST ISOLATION UR BLOCKING ALL
DB2 BIND @APPLYCS.LST ISOLATION CS BLOCKING ALL