分类:
2008-04-24 10:17:33
也许你想只复制源表中的子集,可以使用简单的视图来重构从源表到目标表的数据,或者使用复杂的连接或联合。
源表的子集
你可以复制源表中的某些列或某些行,而不是复制整个表。
对于目标的连接和联合
你可以创建和维护包含由多张已存在的源表连接或联合成的内容的目标表。
你可以使用下面的连接类型:
-跨越一个或多个定义的复制源的简单内部连接,可能和其它的复制源的其它表或视图组合。
你可以通过下面的方法采用连接和联合来操作数据:
-从单一的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)) |