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