本文介绍了基于“ SQL/Q 复制”的 Oracle 到 Oracle 的数据复制以及如何使用 ASNCLP 实现该复制,并通过 DB2 与非 DB2 数据源之间的复制,介绍联合数据库在 SQL 和 Q 复制中的应用。
DB2 ESE V95 集成了复制 (Replication Server) 和联合 (Federation Server) 两大功能。
DB2 联合数据库系统是一种特殊形式的分布式数据库管理系统。在联合数据库系统中,用户可以实现对多种数据源的访问。实现 DB2 与非 DB2 数据源之间的复制的一个前提是要保证该数据源被联合系统支持。
DB2 支持两种类型复制 :SQL 复制和 Q 复制。 SQL 复制捕获源表的更改并使用 CD 表来存储已经提交的事务性数据,然后从 CD 表中读取这些更改并将它们复制到相应的目标表。 SQL 复制可以应用在各种需要的环境,包括容量补偿,给数据仓库输送数据以及审计更改历史记录。用户可以选择相隔一段时间或仅在一段时间内复制。通过连续时间内的复制,应用程序可以捕捉到实时的数据。
Q 复制可以在很短的时间内复制大量的数据。 Q 复制将捕获源表的更改并将已提交的事务转化为消息。 Q 复制不使用 CD 表,当 Q 复制读取到数据后,将消息通过 MQ 消息队列发送到目标。目标系统将会从队列中读取消息并将消息转化为相应的事务提交到目标表。
目前 SQL 复制支持非 DB2 数据源到 DB2 以及 DB2 到非 DB2 数据源的复制,而 Q 复制只支持 DB2 到非 DB2 数据源的复制。表 1 所示的是 SQL 复制和 Q 复制的关键属性的对比。
表 1. SQL 和 Q 复制对比
| 复制属性 |
SQL复制 |
Q复制 |
| 是否支持 DB2 到 DB2 的复制 | 是 | 是 |
| 是否支持其他数据源到 DB2 的复制 | 是 | 否 |
| 是否支持 DB2 到其他数据源的复制 | 是 | 是 |
| 工作性能 | 一般 | 很好 |
| 工作方式 | 基于 log/ 触发 | 基于 log |
| 是否需要 MQ | 不需要 | 需要 |
针对 DB2 数据源,Q 和 SQL 复制都是采用基于 LOG 的方式。基于 LOG 的读取源数据的方式不会对客户的生产环境造成太大影响。针对非 DB2 数据源只能以触发的方式实现 SQL 复制。 Q 复制的优点很明显,工作效率高。但其缺点也很明显:不能从异种数据源读取数据,而 SQL 复制采用触发的方式则可以对异种数据源的读取。因此我们在本文的复制系统中采用 SQL 复制从非 DB2 数据源读取数据,用 Q 复制的方式分发数据。
Replication Server 是一组程序的集合,主要包括 Capture 和 Apply 程序。 Capture 程序负责捕捉数据源的变化并将更改发送到目标数据库,Apply 程序负责将捕捉到的数据应用到目标数据库。对于 Capture 程序捕捉到的数据源变化也可以通过 Replication Server 的另外一个应用 -Event Publisher 发布出来,这些更改被转化成特殊格式的消息,例如 XML 消息格式,为商业智能提供一个推送数据继承模型。 Capture 和 Apply 程序都必须依赖 DB2 才能运行。
Q 和 SQL 复制过程可以完全通过 SQL 语句来创建,但对于普通用户来讲难度较大,因此 Replication Server 提供了另外两种配置 Q 和 SQL 复制的工具:ASNCLP(API) 和 Replication Center(GUI) 。
首先介绍 API 的方式,Replication Server 提供了一组命令接口配置复制,这组命令称为 ASNCLP 。 ASNCLP 可以产生并执行创建复制环境所需的 SQL 脚本,如图 1 所示。
图 1. ASNCLP Sample
执行 ASNCLP 命令有两种方式,一种是在 DB2 命令行环境中执行 asnclp 命令,用户可以在提示符” Repl> ”下单步执行 ASNCLP 命令。要注意这种单步执行的方式,行命令末尾以空格结尾,不是以分号结尾。而批量执行的脚本中 ASNCLP 的每行则是以分号结尾,如图 1 所示。
=>asnclp Repl > ASNCLP SESSION SET TO Q REPLICATION ==== CMD: ASNCLP SESSION SET TO Q REPLICATION; ==== Repl > QUIT ==== CMD: QUIT; ==== ASN1953I ASNCLP : Command completed. |
另外一种方式是脚本的形式批量执行 ASNCLP 命令,假设我们将图 1 所示的脚本保存在文件 asnclp.in 中,用户可以在命令行中通过以下方式执行。
=>asnclp -f asnclp.in |
GUI 的方式部署复制主要是用到 Replication Center( 简称 RC),属于 DB2 Control Center 的一部分,如图 2 所示。要了解更多信息,请阅读“DB2 与 Oracle 之间的远程复制”。
图 2. Replication Center
虽然 GUI 的方式更容易让普通用户接受,但对于大规模的部署复制,GUI 的方式就会比较烦琐。 ASNCLP 脚本的重用率很高,部署复制的效率会很高。
在一个比较复杂的生产环境中,数据源往往是多种多样的。我们经常碰到的数据源包括 Oracle,DB2, SQL Server, Sybase 等等。 DB2 联合数据库系统 -Federation Server 开发了针对不同数据源的 wrapper 包装各种数据源,用户通过这些 wrapper 能访问到 Oracle,SQL Server, Sybase 等多种数据源,并能对数据源进行增加,删除,修改等事务操作,但联合数据库系统不能将数据源的数据实时高效的复制到其他数据源中去。 Replication Server 可以帮我们实现各种数据源之间的数据实时复制。 Replication Server 将数据源中的源数据实时的复制到目标数据库中去,可以用作系统容灾,系统迁移,系统集成,数据仓库的数据抽取等用途。
Replication Server 可以对 DB2 直接复制,对非 DB2 数据源的访问要通过 Federation Server 来实现。可以将 Replication Server 作为中间件,收集到各个数据源的数据变化,并分发给各个目标数据源。
图 3 中所示的系统是一个应用 Replication Server 实现多种数据源之间复制的系统。本系统中采用 SQL 复制捕捉数据源的变化并复制到作为中间件的 DB2 数据库中,然后由 Q 复制分发到各个目标数据库。采用 Q 复制进行数据分发,主要是考虑到 Q 复制处理大批量数据时的高效性。
图 3. 复制系统
我们以典型的 Oracle 到 Oracle 的复制为例实现这个复制系统。生产环境包括 Oracle 数据源,DB2 中间数据库,Replication Server 和 Federation Server,MQ 。下面我们介绍部署生产环境需要注意的事项,以及如何创建 DB2 数据库并使之具备复制功能。
表 2 列出了我们需要安装的软件,以及软件的用途。 Q 复制依赖 MQ 传送消息来实现数据复制,推荐使用 MQ6.0 或者 6.0 以上版本。
表 2. 需要安装的软件及软件用途
| 软件 | 用途 |
| Red Hat Enterprise 4 Update 6 | 运行 Replication Server 的操作系统 |
| Oracle10g | 数据源和目标数据库 |
| DB2 V95 ESE | 中间数据库 |
| Replication Server V95 | 复制服务器 |
| Federation Server V95 | 联合数据库 |
| WebSphere MQ V6.0 | 消息服务器 |
安装 DB2,Replication Server,Federation Server
安装软件的过程不再累赘,可以查阅“IBM DB2 for Linux,UNIX 和 Windows 版信息中心”。安装完 DB2 后,需要安装 DB2V95 ESE,Replication Server for Q,Federation Server 的 license 。
目前 Replication Server 中的 SQL 复制产品是随着 DB2 一起发售的,只要你拥有了 DB2 的 license 就可以使用 SQL 复制,而 Q 复制则需要单独购买 license 。 Federation Server 中的 Informix wrapper 是随着 DB2 一起发售的,安装了 DB2 后可以使用 Informix wrapper 连接 Informix 数据源。对于其他数据源的 wrapper 需要单独购买安装。本例中我们只需安装 Oracle wrapper 。安装完 Oracle wrapper 后,可以在相应的实例下运行 djxlinkOracle 验证是否安装成功。
针对 DB2 数据源,Q 和 SQL 复制都是基于 LOG 的,复制程序会连续读取数据库的恢复日志。因此我们必须开启 DB2 的归档模式。这样复制程序才能够捕捉 DB2 数据源的变化。
db2 create db test; db2 update db cfg for test using logretain recovery; |
DB2 启用归档模式后会处于 pending 状态,必须执行备份操作以后,才能对数据库进行访问。
db2 backup db test; |
在这里我们介绍如何使用 ASNCLP 部署复制环境。因为对于非 DB2 数据源的支持,Replication Server 需要用到 Federation Server 。这里我们使用 DB2_DB 作为中间数据库有三个用途,一是作为 SQL 复制中的目标数据库,二是作为 Q 复制中的源数据库,三是作为访问 Oracle 的 Federation Server 。下文中提到的 FED_DB 和 DB2_DB 指的是同一个 DB 。
以下的例子将会实现 Oracle 源数据库中的对象 TEST1 到 Oracle 目标数据库中的目标对象 TRG_TEST1 的复制。复制过程会借助 DB2_DB 上的中间表 MID_TEST1 实现。
为了使 Replication Server 能够访问到非 DB2 数据源,首先要设置好 Federation Server 。
以下步骤描述的是如何通过联合数据库访问 Oracle 数据库。
1. 使 DB 具备 Federation 功能
db2 update db cfg for FED_DB using federated yes; |
2. 设置 Oracle 客户端环境变量
打开位于实例目录中的 sqllib/cfg/db2dj.in 文件,写入 Oracle 客户端相关的环境变量:
ORACLE_HOME=/opt/oracle/product/10.2.0.1.0 TNS_ADMIN=/home/db2inst1/bin |
设置好环境变量后要重启 db2 实例,使新配置生效:
db2stop; db2start; |
3. 生成访问 Oracle 所需的库文件
djxlinkOracle
执行这个命令后会在 Federation Server 安装目录中的 lib32 或者 lib64 中生成 libdb2net8.so 和 djxlinkOracle.out 。 libdb2net8.so 就是 Federation Server 访问 Oracle 所需的库文件。如果出错 , 请检查 djxlinkOracle.out,查看更为详细的错误信息。
4. 创建 Oracle wrapper/Federation Server/User mapping
db2 connect to FED_DB; db2 create wrapper NET8 options(db2_fenced ‘ n ’ ); db2 create server FED_SERVER type oracle version 9 wrapper NET8 options(node 'UTF8ORA1'); db2 create user mapping for user server FED_SERVER options (remote_authid 'ORAUSER', remote_password 'ORAUSER); |
UTF8ORA1 是已知的 Oracle 实例的服务名。 NET8 是 Oracle wrapper 的固有名称 , 其它数据源 也有相应的包装器名称例如:Informix 数据源的 wrapper 是 INFORMIX,Sybase 数据源是 CTLIB,等等。这段脚本创建了 Oracle 数据库到 DB2 数据库的映射。
完成以上操作后,用户可以通过 FED_SERVER 访问 Oracle 数据源中的数据。 Replication Server 也可以通过其复制数据。假设已知在 Oracle 数据源端有源表 TEST1,在 FED_DB 中创建到该表的映射:
db2 create nickname TEST1 for FED_SERVER. ” ORAUSER ” . ” TEST1 ”; |
查看该表中的数据:
db2 “ select * from TEST1 ”; |
这样我们通过 FED_SERVER 获得了访问 Oracle 的能力。
部署 SQL 复制是为了将 Oracle 数据源中的复制对象变化捕获并复制到中间数据库 DB2_DB, 作为 Q 复制的对象。部署过程包括创建 Capture/Apply 控制表,注册数据源,创建订阅和订阅成员,启动复制程序等步骤。创建的复制对象前后有一定的依赖关系,创建的顺序如图 4 所示。下面我们分步讲解各个步骤的作用和实现方法。
图 4. SQL 复制流程
1. 创建 Capture 控制表
这一步是在 Oracle 数据源中创建 Capture 程序的控制表。
set server capture to db FED_DB nonibm server FED_SERVER id USER_ID password “ USER_PASSWORD ” ; create control tables for capture server in nonibm schema “ USER_SCHEMA ” ; |
第一句脚本指定了 Capture 服务器是 FED_DB,使用 FED_SERVER 连接 Oracle 数据源。
第二句是通过 FED_SERVER 连接 Oracle 数据源并在 Oracle 服务器端创建 Capture 控制表。
2. 注册数据源
在创建 Capture 控制表成功后,需要注册数据源中的对象作为复制对象。
create registration(TEST1) differential refresh cols all image both prefix “ x ” ; |
这一句在控制表中注册 Oracle 数据源中的表 TEST1 为复制对象。
3. 创建 Apply 控制表
这一步是在复制环境中创建 Apply 控制表。在本文中先要将数据复制到作为中间数据库的 DB2_DB 中去。
set server control to db DB2_DB; create control tables for apply control server; |
第一句脚本指定了 Apply 服务器是 DB2_DB 。
第二句是在 DB2_DB 中创建 Apply 控制表。
4. 创建订阅集和订阅集成员
在注册好数据源对象之后,需要创建订阅集和订阅集成员来确定数据源和目标之间的关系, 数据源对象和目标之间可能是 1 对 1 关系,也可能是 1 对多的关系。这里我们为源表 TEST1 创建唯一的目标表 MID_TEST1 。
create subscription set setname SET1 applyqual AQ activate yes timing interval 1; create member in setname SET1 appluqual AQ activate yes source TEST1 target name MID_TEST1 definition type usercopy cols all registered; |
第一句脚本是创建一个订阅集为 SET1,并设定复制为间隔为 1 秒的连续复制。
第二句脚本是指定订阅集中的一个订阅成员,指定 Capture 要将源表 TEST1 的变化复制到目 标数据库中的 MID_TEST1 。
5. 启动 Capture/Apply 程序
捕捉 Oracle 数据源是不需要 Capture 程序的,数据的捕捉通过触发的方式实现的,源表上有 数据变化会立刻触发复制将数据变化发送到目标表上。所以我们只需要在 DB2 目标数据库上 启动 Apply 程序。
asnapply apply_qual=AQ control_server=FED_DB; |
6. 开始复制
在 Oracle 端的 TEST1 表中插入一些数据,检验目标数据库 DB2_DB 中 MID_TEST1 的数据是否一致。一致则复制成功。
部署 Q 复制是为了捕获 DB2_DB 中的 MID_TEST1 的数据变化,将数据复制到 Oracle 目标服务器。
部署过程包括创建 Q Capture,Q Apply 控制表,创建 Q 复制映射,创建 Q 订阅等步骤。
Q 复制中的复制消息是通过 MQ 来传输的,我们首先配置一个 Q 复制所需的队列管理器。
图 5. Q 复制流程
1. 创建 MQ 对象
创建队列管理器:crtmqm QDB2OEM
启动队列管理器:strmqm QDB2OEM
创建 Q 复制所需的队列:
define qlocal (QDB2OEM.ADMINQ) define qlocal (QDB2OEM.RESTARTQ) define qlocal (QDB2OEM.TESTRSQ) define qmodel (IBMQREP.SPILL.MODELQ) defsopt(shared) maxdepth(500000) msgdlvs1(fifo) deftype(permdyn) |
这段脚本创建并启动了队列管理器 QDB2OEM,并定义了传输复制消息的队列 QDB2OEM 。 Capture 程序会将捕获到的消息放到 TESTRSQ,Apply 程序从 TESTRSQ 取得消息并应用到目 标数据库。
2. 在 DB2_DB 上创建 Q Capture 控制表
asnclp session set to q replication; set server capture to db DB2_DB; set qmanager "QDB2OEM" for capture schema; create control tables for capture server using restartq "QDB2OEM.RESTARTQ" adminq "QDB2OEM.ADMINQ"; |
这段脚本指定了 Q Capture 使用的队列,并在 Capture 服务器 DB2_DB 上创建 Q Capture 控制 表。“ asnclp session set to q replication ”这句是必须的,ASNCLP 解释器用这句来区分 SQL 和 Q 复制的 ASNCLP 脚本。
3. 在 Oracle 上创建 Q Apply 控制表
asnclp session set to q replication; set server capture to db DB2_DB; set server target to db FED_DB nonibm server "FED_SERVER"; set run script now stop on sql error off; set qmanager "QDB2OEM" for apply schema; create control tables for apply server; |
这段脚本在 Oracle 目标数据库上创建 Q Apply 控制表,这里所用到的 FED_SERVER 是为 Oracle 目标数据库创建的,不是 SQL 复制中为 Oracle 数据源创建的那个。但它们都使用 FED_DB 作为 Federation Server 。注意实际使用中要创建不同的 Federation 。
4. 使 DB2 具备复制功能
db2 update db cfg for testdb using logretain recovery; db2 backup db testdb; |
5.创建 DB2 到 Oracle 目标数据库的 Q 复制映射
asnclp session set to q replicaion; set server capture to db DB2_DB; set server target to db FED_DB nonibm server "FED_SERVER"; set qmanager "QDB2OEM" for capture schema; set qmanager "QDB2OEM" for apply schema; set apply schema oem_user; create replqmap QDB2OEM_QMAP using adminq "QDB2OEM.ADMINQ" recvq "QDB2OEM.TESTRSQ" sendq "QDB2OEM.TESTRSQ" num apply agents 4 max message size 300; |
这段脚本创建了从 DB2_DB 到目标 Oracle 的映射并指定了映射所使用的消息队列。 Apply 服 务器会启用 4 个代理 (agents 4) 处理发送到目标数据库的消息。
6. 创建 Q 订阅
这里会为每一个复制对象创建订阅。这里我们为 MID_TEST1 创建目标对象 TRG_TEST1 并 定义所有 MID_TEST1 的变化都会复制到 TRG_TEST1 。
asnclp session set to q replication; set server capture to db DB2_DB; set server target to db FED_DB nonibm server "FED_SERVER"; set run script now stop on sql error off; set qmanager "QDB2OEM" for capture schema; set qmanager "QDB2OEM" for apply schema; set apply schema oem_user; create qsub using replqmap QDB2OEM_QMAP (subname qsub1 MID_TEST1 options has load phase I target name "oem_user".TRG_TEST1 federated TRG_TEST1 conflict action d); quit; |
7. 启动 Q Capture/Q Apply 程序
启动 Q Capture 程序
asnqcap capture_server=DB2_DB |
启动 Q Apply 程序
asnqapply apply_server=FED_DB |
8. 开始复制
启动复制程序后在 Oracle 数据源的表 TEST1 中插入一组数据并做相应的事务操作,然后检查 Oracle 目标数据库中 TRG_TEST1 的数据是否相应的变化。
在 SQL 复制中我们将 Oracle 数据源中的对象 TEST1 的变化复制到 MID_TEST1 。在 Q 复制中我们将 MID_TEST1 的数据变化复制到 Oracle 目标数据库中的 TRG_TEST1 。因此借助 MID_TEST1 我们完成了从 TEST1 到 TRG_TEST1 的数据复制。我们将会看到 TEST1,MID_TEST1,TRG_TEST1 中的数据保持一致。至此我们完成了从 Oracle 到 Oracle 的复制。
部署好 Oracle 到 Oracle 的复制后,我们即拥有完整的,可以重复利用的 ASNCLP 脚本,经过简单的修改就能够应用到更多的复制环境中。目前 DB2 的复制功能在很多的大型企业都有应用,特别是在电力,银行等行业。 Replication Server 以其稳定性和高效性在同类产品中具备很大的竞争优势,特别是其在数据容灾,数据迁移,数据集成方面有着不可估量的潜力。本文为读者提供一个初步学习 Replication Server 和 ASNCLP 的机会。通过本文,读者可以学习到如何使用 ASCNLP 脚本配置一个复杂的复制环境。
学习
- 通过访问 DB2 9 技术资源中心, 查看 DB2 9 相关技术文章和教程的资源。
- 通过访问 InfoSphere 产品专题,查看 InfoSphere 产品相关技术文章和教程的资源。
- 通过
IBM DB2 9.5 for Linux,UNIX, and Windows 信息中心,了解 DB2 更多相关信息。
-
DB2 与 Oracle 之间的远程复制,了解 DB2 与 Oracle 之间的远程复制的详细内容。
-
DB2 V9.1 复制技术新特性
,了解 DB2 V9.1 中复制技术的新特性和改进。
-
DB2 与 Microsoft SQL Server 2000 之间的 SQL 数据复制
,了解 IBM DB2 和 Microsoft SQL Server 之间的 SQL 复制技术。
获得产品和技术
- 下载
IBM Data Studio 软件。
- 下载
IBM DB2 v9.5软件。