高性能数据库技术方案综述——SQL复制和Q复制
高性能数据库技术方案综述——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 消息队列发送到目标。目标系统将会从队列中读取消息并将消息转化为相应的事务提交到目标表。
Capture 和 Apply 程序
Replication Server 是一组程序的集合,主要包括 Capture 和 Apply 程序。 Capture 程序负责捕捉数据源的变化并将更改发送到目标数据库,Apply 程序负责将捕捉到的数据应用到目标数据库。对于 Capture 程序捕捉到的数据源变化也可以通过 Replication Server 的另外一个应用 -Event Publisher 发布出来,这些更改被转化成特殊格式的消息,例如 XML 消息格式,为商业智能提供一个推送数据继承模型。 Capture 和 Apply 程序都必须依赖 DB2 才能运行。
SQL复制表定义及复制数据行
一、复制表定义
假定一个数据表OnlineRecord,有Id,No,EmployeeID,Name,Status5个列,如果想创建一个新表叫OnlineRecordtest,表结构和OnlineRecord一模一样,也就是列名和数据类型都一致。我们可以通过复制OnlineRecord表的结构而不是复制表中的记录来创建这个表。
数据库是Sql Server
sql server使用带有不返回任何行的查询和INTO子句:
SELECT No,EmployeeID,Name,Status INTO People
FROM OnlineRecord WHERE 1=0;
当使用INTO命令来复制表时,查询所返回的行都会加入新生成的表OnlineRecord中,除非我们在WHERE子句条件中定义一个恒为false的条件,即1=0。并且OnlineRecord表的Id是自增的主键,但是复制后新建的OnlineRecordtest表的Id没有变成主键。
二、从一个表向另外的表复制行
假如OnlineRecord和OnlineRecordtest表都已经存在,把OnlineRecord表中几个字段复制到OnlineRecordtest表中:
insert into OnlineRecordtest(No,EmployeeID,Name,Status)
Select No,EmployeeID,Name,Status
from OnlineRecord where No=‘7001’;
INSERT INTO语句指定要插入的列,SELECT列的顺序和插入处写的列顺序要一致,如果没有指定则插入所有列。
目前 SQL 复制支持非 DB2 数据源到 DB2 以及 DB2 到非 DB2 数据源的复制,而 Q 复制只支持 DB2 到非 DB2 数据源的复制。表 1 所示的是 SQL 复制和 Q 复制的关键属性的对比。
针对 DB2 数据源,Q 和 SQL 复制都是采用基于 LOG 的方式。基于 LOG 的读取源数据的方式不会对客户的生产环境造成太大影响。针对非 DB2 数据源只能以触发的方式实现 SQL 复制。 Q 复制的优点很明显,工作效率高。但其缺点也很明显:不能从异种数据源读取数据,而 SQL 复制采用触发的方式则可以对异种数据源的读取。因此我们在本文的复制系统中采用 SQL 复制从非 DB2 数据源读取数据,用 Q 复制的方式分发数据。
Q 和 SQL 复制过程可以完全通过 SQL 语句来创建,但对于普通用户来讲难度较大,因此Replication Server 提供了另外两种配置 Q 和 SQL 复制的工具:ASNCLP(API) 和 Replication Center(GUI) 。
DB2搭建SQL复制环境
DB2 9.7.0.6
AIX 6.1
Source Table: EMPLOYEE(ID, FAMILYNAME, GIVENNAME)
Target Table: TRGEMPLOYEE,只复制源表的第1和第3列;不需要预先定义,会自动生成
数据库名:sample,且源库和目标库是同一数据库
1: 确保SAMPLE数据库采用的是归档日志,create employee表并插入两行数据
$ db2 create db sample
$ db2 update db cfg for sample using LOGARCHMETH1 LOGRETAIN
$ db2 backup db sample
$ db2 connect to sample
2: 连到数据库,并运行脚本:oasnclp -f sqlrep.asnclp其中,sqlrep.asnclp内容,命令包括:设置 server、创建control表、创建REGISTRATION、创建预定集、创建预定集成员
3: 启动capture和apply
错误及解决
employee表一定要有primary key或者unique index,否则会失败。
第一次试验的时候,创建表定义如下
$ db2 “create table employee(id int, FIRSTNAME char(20), GIVENNAME char(20))”
SQL复制的配置方法:
Step1: 确保TESTDB数据库采用的是归档日志,创建表并插入两行数据
- 创建数据库
- 将数据库改为采用归档日志模式
- 连接数据库并查看是否更新为LOGRETAIN(修改后需重启数据库使参数生效)
- 备份数据库(修改归档模式之后需要备份一次数据库)
- 创建表空间,指定表空间名,页大小以及表空间大小
- 创建源表(注意源表一定要有primary key或者unique index,否则后面操作会失败)
- 在源表中插入数据
Step2: 连到数据库,并运行以下脚本: - 创建一个脚本(内容包括设置 server、创建control表、创建REGISTRATION、创建预定集、创建预定集成员)
- 执行DB2 复制命令执行脚本
Step3: 启动capture和apply - 启动capture(建议可放至后台,这样不用占用一个窗口)
- 启动apply
Step4:观察结果(可新开一窗口查看): - 可通过以下方法查看源表与目标表的区别
$ asntdiff db=testdb where=“target_table = ‘TRGEMPLOYEE’ and apply_qual = ‘MYQUAL1’ and set_name = ‘SET00’” - 如果发现源表与目标表出现差异,可使用以下方法修复
$ asntrep db=testdb where=“target_table = ‘TRGEMPLOYEE’ and apply_qual = ‘MYQUAL1’ and set_name = ‘SET00’”
Step5:停止capture和apply - 停止capture
- 停止apply