级别: 中级
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'。
结束语
关于这个话题就讲到这里了。希望本文提供的信息能帮助您利用扩展的架构,并将数据暴露给更多的用户。
参考资料
学习
|