級別: 中級
Sean Byrd (sabyrd@us.ibm.com), Americas Techworks SME, IBM
2006 年 7 月 10 日
即將發布的 Q Replication 將支持一種新的目標表,即 Consistent Change Data (CCD) 表。探索 Q Replication 用戶之所以需要這些表的原因,并考慮在使用 CCD 表作為目標的情況下,可能出現的一些新的復制架構。學習如何定義和使用 CCD 表,這需要對 Q Replication 的安裝和配置有基本的了解。另外,還看看在使用 CCD 表作為目標的情況下有哪些限制。
簡介
Consistent Change Data (CCD) 表一直是 SQL Replication 中一種流行的目標表。通過支持 CCD 表作為另一種目標選項,對于熟悉 Q Replication 的人來說,他們就可以利用這種新功能了。這時您可能要問,“為什么我應該在我的復制架構中考慮 CCD 表?” CCD 表通過關聯的跟蹤機制暴露數據,以便準確地描繪源表的事務歷史。換句話說,CCD 允許重現源表的歷史。讓我們看看用到 CCD 的三個例子。
使用 CCD
歷史表 —— 在任何系統中,都會有一些關鍵的表需要能夠恢復或重建。通過將關鍵的源表復制到一個 CCD 目標表,就可以逐個事務地從頭開始重建這個表。更棒的是,如果表中輸入了壞的數據,CCD 記錄還允許您查看哪些行受到影響,讓您很容易改變主意,或者正確地更新所需的值。
扇出場景登臺(Fan out scenario staging)表 —— 傳統上,CCD 目標表用于幫助創建扇出架構,將一個源復制到多個目標。這意味著之前 SQL Replication 不能接受的一些高吞吐量的工作負載現在可以被復制到多個目標了。
不受支持的數據庫登臺表 —— 對于將數據放到 Q Replication 受支持的結構之外的數據庫中這一任務而言,CCD 目標表也是一種理想的方法。有了最新的修復包(用于 Oracle 和 Sybase 的修復包版本為 9;用于 Microsoft SQL Server 和 Informix 的修復包版本為 10),DB2® 之外的數據庫可以作為 Q Replication 的目標數據庫,不過仍然有很多目標數據庫不可用。雖然 CCD 目標表不能自動將數據復制到不受支持的目標數據庫中,但是它通過用戶應用程序暴露數據。所以,只需簡單地從 IBMSNAP_OPERATION 列選擇數據到一個動作變量,然后結合對源列的值的選擇,使用一個用于 insert、update 和 delete 的 case 語句,便可以將事務復制到任何您想在其上編程的數據源。
實現 CCD
接下來我們看看如何創建 CCD 目標表。本節假設您已經知道如何配置 Q Replication —— 因此著重講解隊列映射和隊列訂閱的創建。以前,當選擇一種目標表類型時(如果使用 Replication Center's Create Queue Subscription 向導的話,就在這個向導中的第 5 步),您有兩個選擇 —— 表或存儲過程。現在您可以選擇 CCD Table,但是必須指定您想要哪種類型的 CCD。如果使用的是 ASNCLP,那么語法如下:
清單 1. ASNCLP CCD 語法
>>-CREATE QSUB--+------------+--+-------------------------+----->
'-SUBTYPE--U-' '-USING REPLQMAP--mapname-'
...
trg-clause
>--+-------------------------------+---------------------------->
'-TYPE--+-USERTABLE-----------+-'
+-STOREDPROC----------+
+-NICKNAME------------+
'-CCD--| ccd-clause |-'
...
ccd-clause
|--+--------------------+--+-------------------+---------------->
'-CONDENSED--+-ON--+-' '-COMPLETE--+-ON--+-'
'-OFF-' '-OFF-'
|
要創建一個 CCD,必須指定兩個新屬性 —— condensed(壓縮的)和 complete(完整的)。表 1 展示了這些屬性如何影響目標表的創建:
表 1. 完整的還是壓縮的?
|
是 |
否 |
complete |
目標表創建好之后,其中填充有源表中的所有行。 |
目標表創建好之后為空。 |
condensed |
目標表只包含行中最近被更改的值。 |
目標表包含所有行的所有歷史值。 |
創建 CCD 目標表只要做這些就可以了。那么,有了 CCD 表之后,如何使用它呢?讓我們將這些值與之前介紹的那些用法聯系起來。
表 2. 最佳匹配
complete |
condensed |
用法 |
是 |
是 |
這種配置將支持扇出到多個目標。 |
是 |
否 |
這是標準的歷史表。每個源行和目標的記錄使得表和事務可以被重建。還可以根據這種版本的 CCD 表創建新的用戶拷貝。 |
否 |
是 |
這種版本的 CCD 表用于扇出場景的登臺表,在該場景中,遠程已經存在用戶數據的一個拷貝。由于缺少源行,因此不能從這種類型的 CCD 表創建新的用戶拷貝。 |
否 |
否 |
這種 CCD 表用于作為只需要訪問被更改的數據的應用程序的登臺表。 |
表格式
接下來我們看看 CCD 表與源表有什么不同。CCD 表與源表的不同在于多了幾個附加的列:
表 3. CCD 列
列名 |
描述 |
數據類型 |
IBMSNAP_INTENTSEQ |
這是一個序號,惟一地標識一次更改。 |
CHAR(10) FOR BIT DATA |
IBMSNAP_OPERATION |
該列表明對一個記錄的操作的類型: I -- Insert U -- Update D -- Delete |
CHAR(1) |
IBMSNAP_COMMITSEQ |
這是一個序號,描述事務的提交順序。 |
CHAR(10) FOR BIT DATA |
IBMSNAP_LOGMARKER |
這是數據被提交的時間。 |
TIMESTAMP |
這些列附件在行的后面,因此該 CCD 表可用于創建其他拷貝,更新其他拷貝,或者使應用程序可以訪問事務歷史。如果啟用了數據庫審計功能,那么 CCD 表中還可能提供以下幾列:
表 4. 審計列
列名 |
描述 |
數據類型 |
IBMSNAP_AUTHID |
與事務相關聯的授權 ID。這一列同時可用于 DB2 for Linux®、UNIX® 和 Windows® 以及 z/OS®。對于 z/OS,這是主授權 ID。 |
CHAR(128) |
IBMSNAP_AUTHTKN |
與事務相關聯的授權標志。這一列僅用于 DB2 z/OS,它是相關 ID。對于 DB2 Linux、UNIX 和 Windows,這一列的值為 NULL。 |
CHAR(12) |
IBMSNAP_PLANID |
與事務相關聯的計劃名稱。這一列僅用于 DB2 z/OS。對于 DB2 for Linux、UNIX 和 Windows,這一列的值為 NULL。 |
CHAR(128) |
IBMSNAP_UOWID |
這個工作單元的日志記錄中的工作單元標識符。這一列同時可用于 DB2 for Linux、UNIX 和 Windows 以及 DB2 z/OS。 |
CHAR(10) |
如果手動創建 CCD 目標表,則語法應該像下面這個例子一樣。注意,<user data columns> 的數據類型應該與源表中相應的列的數據類型一致。
例 2. CCD 目標表的 DDL
CREATE TABLE CCD (
IBMSNAP_INTENTSEQ CHAR(10) FOR BIT DATA NOT NULL,
IBMSNAP_OPERATION CHAR(1) NOT NULL,
IBMSNAP_COMMITSEQ CHAR(10) FOR BIT DATA NOT NULL,
IBMSNAP_LOGMARKER TIMESTAMP NOT NULL,
IBMSNAP_AUTHID CHAR(128),
IBMSNAP_AUTHTKN CHAR(12),
IBMSNAP_PLANID CHAR(128),
IBMSNAP_UOWID CHAR(10) FOR BIT DATA,
<user data columns>
);
|
限制
幸運的是,您只需清楚三個限制,另外再注意一點:
- CCD 目標表只在單向架構中有效。
- CCD 目標表不能是別名。
- CCD 表中必須有惟一性約束 —— 可以通過主鍵或者源表或 CCD 表上的惟一索引實現。
另外一個您可能失察的地方是 delete 的行為。如果您在使用一個壓縮 CCD 表,那么在處理 delete 操作時,現有的行將被更新,而 IBMQREP_OPERATION 列將被設為 ‘D’。如果這一行不存在,那么該行將被忽略,并且被記錄到異常表中。對于非壓縮 CCD 表,所有事務都生成新的行。delete 會生成一個新行,其中仍然使用當前各列的值,但是 IBMQREP_OPERATION 列被設為 'D'。
結束語
關于這個話題就講到這里了。希望本文提供的信息能幫助您利用擴展的架構,并將數據暴露給更多的用戶。
參考資料
學習
|