Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104673526
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-24 10:16:45

 出处:dev.21tx.com  
 
阅读提示:本文将主要讨论DB2之间的数据复制,而不考虑包含非IBM数据库的数据复制。文章实验环境:Win2000 Server、IBM® DB2® Universal Database™ for Windows® V7.1+补丁包9。
下面讲解在典型的复制环境下,应用程序和捕捉程序如何通讯以保证数据的一致性:

从源数据库捕捉数据

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),而且你使用各自的应用限定符以允许应用程序的两个实例在不同的时间拷贝数据。你也可以将两个预订集用同一个应用限定符定义,用同一个应用程序实例拷贝数据。

阅读(559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~