Replication Server 产品包括 SQL 复制和 Q 复制两种技术。相比于 SQL 复制,Q 复制的数据传输技术借助于 IBM 队列机制,从而提高了数据的传输效率和可靠性,可以达到每秒复制几千个表、几十万行数据 , 在几千英里的距离下端到端的延迟不到 1 秒(从源端 DB2 commit 到目标端 DB2 commit)。Change Data Capture(CDC) 主要采用基于日志的变更数据捕获技术以实现对关键业务系统的实时数据复制,同时不影响业务系统性能。CDC 最大优点在于其对异构数据库的支持和与 IBM 产品的集成,为客户在数据迁移,整合,同步,动态数据仓库等应用中提供了卓越的解决方案。这次分享讲的是SQL replication。以下是本人亲测通过的配置,各位有兴趣的话可以按着步骤做一次。 [测试环境]
DB2 9.7.0.11
LINUX 6.5
Source Table: EMPLOYEE(ID, FAMILYNAME, GIVENNAME)
Target Table: TRGEMPLOYEE,只复制源表的第1和第3列;不需要预先定义,会自动生成
数据库名:TESTDB,本例子为源库和目标库是同一数据库
(如果源与目标不在同一物理主机上,则需要分别在每台物理主机上进行远程的catalog操作) [具体过程] Step1: 确保TESTDB数据库采用的是归档日志,create employee表并插入两行数据
1. 创建数据库
$ db2 "create database testdb on /home/db2inst1/testdb using codeset gbk territory CN pagesize 32 k"
2. 将数据库改为采用归档日志模式
$ db2 update db cfg for testdb using LOGARCHMETH1 LOGRETAIN
3. 连接数据库并查看是否更新为LOGRETAIN(修改后需重启数据库使参数生效)
$ db2 connect to testdb
$ db2 get db cfg | grep -i LOGARCHMETH1
First log archive method (LOGARCHMETH1) = LOGRETAIN
4. 备份数据库(修改归档模式之后需要备份一次数据库)
$ db2 backup db testdb
5. 创建表空间,指定表空间名,页大小以及表空间大小
$ db2 "CREATE LARGE TABLESPACE tbs_test
PAGESIZE 32768 MANAGED BY DATABASE
USING (FILE '/home/db2inst1/testdb/tbs_test' 500M )"
6. 创建源表(注意源表一定要有primary key或者unique index,否则后面操作会失败)
$ db2 "create table employee(id int NOT NULL, FAMILYNAME char(20), GIVENNAME char(20), PRIMARY KEY (ID) )"
7. 在源表中插入数据
$ db2 "insert into employee values(1,'a','aa'),(2,'b','bb')" Step2: 连到数据库,并运行以下脚本:
1. 创建一个脚本(内容包括设置 server、创建control表、创建REGISTRATION、创建预定集、创建预定集成员)
$ cat> sqlrep.asnclp
以下为脚本内容:(蓝色字体为变量,可根据实际情况设定)
#> # ('Control' and 'Target' are usually the same)
SET SERVER CAPTURE TO DB TESTDB>db2inst1 PASSWORD "pwd";
SET SERVER CONTROL TO DB TESTDB>db2inst1 PASSWORD "pwd";
SET SERVER TARGET TO DB TESTDB>db2inst1 PASSWORD "pwd";
SET RUN SCRIPT NOW STOP ON SQL ERROR ON;
# Add meta data tables to hold information about
# your source and target tables.
CREATE CONTROL TABLES FOR CAPTURE SERVER;
CREATE CONTROL TABLES FOR APPLY CONTROL SERVER;
#> # Changed data will be 'staged' (stored) in a 'CD' table
CREATE REGISTRATION (DB2INST1.EMPLOYEE) DIFFERENTIAL REFRESH STAGE CDEMPLOYEE COLS (id, GIVENNAME);
# A subscription maps a source table to a target table.
# Subscriptions are grouped in sets.
# Every subscription must be in a set, so we make a set here:
CREATE SUBSCRIPTION SET SETNAME SET00 APPLYQUAL MYQUAL1 ACTIVATE YES TIMING INTERVAL 1 START DATE "2008-01-01" TIME "01:00:00.000000";
# Each subscription is a member of a set.
# If needed, you can create the target table as we do here:
SET PROFILE TBSPROFILE FOR OBJECT TARGET TABLESPACE OPTIONS UW USING FILE "/home/db2inst1/sqllib/TSTRG.TS">700 PAGES;
CREATE MEMBER IN SETNAME SET00 APPLYQUAL MYQUAL1 ACTIVATE YES
SOURCE EMPLOYEE
TARGET NAME TRGEMPLOYEE
DEFINITION IN TSTRG00 CREATE USING PROFILE TBSPROFILE
TYPE USERCOPY COLS ALL REGISTERED;
# Now, run the file through the asnclp command
# and you are ready to replicate data.
QUIT;
2. 执行DB2 复制命令执行以上脚本
$ asnclp -f sqlrep.asnclp
Step3: 启动capture和apply
1. 启动capture(建议可放至后台,这样不用占用一个窗口)
$ asncap capture_server=testdb
(后台运行:$ nohup asncap capture_server=testdb &)
以下为正常的输出,可通过nohup.out查看,如果你是用后台跑的话
2017-09-08-01.48.04.703588 ASN0600I "Capture" : "" : "Initial" : Program "capture 9.7.11 (Build 9.7.0.11 Level s150922, PTF IP23944)" is starting.
2017-09-08-01.48.06.817804 ASN0100I CAPTURE "ASN" : "WorkerThread" : The Capture version "capture 9.7.11 (Build 9.7.0.11 Level s150922, PTF IP23944), DB2 v9.7.11" program initialized successfully.
2017-09-08-01.48.06.817850 ASN0109I CAPTURE "ASN" : "WorkerThread". The Capture program has successfully initialized and is capturing data changes for "1" registrations. "0" registrations are in a stopped state. "0" registrations are in an inactive state.
2. 启动apply
$ asnapply control_server=testdb apply_qual=MYQUAL1
(后台运行:$ nohup asnapply control_server=testdb apply_qual=MYQUAL1 &)
以下为正常的输出,可通过nohup.out查看,
2017-09-08-01.50.33.673457 ASN0600I "Apply" : "" : "Initial" : Program "apply 9.7.11 (Build 9.7.0.11 Level s150922, PTF IP23944)" is starting.
2017-09-08-01.50.35.733818 ASN1045I APPLY "MYQUAL1" : "Initial" : The Apply version "9.7.11" program was started using database "TESTDB".
Step4:观察结果(可新开一窗口查看):
1. 连接数据库
$ db2 connect to testdb
2. 显示此schema下的所有表(因为前面我们把这几个表在db2inst1下建立)
$ db2 list tables for schema db2inst1
Table/View Schema Type Creation time ------------------------------- --------------- ----- --------------------------
CDEMPLOYEE DB2INST1 T 2017-09-08-00.50.36.243736
EMPLOYEE DB2INST1 T 2017-09-08-00.41.29.577792
TRGEMPLOYEE DB2INST1 T 2017-09-08-00.50.37.243767
Name = TSTRG00
----------- ---------------
1 aa
2 bb
2 record(s) selected.
7. 在源表中插入一行数据
$ db2 "insert into EMPLOYEE values(3,'c','cc')"
等1分钟
8. 查看目标表内容
$ db2 "select * from TRGEMPLOYEE"
ID GIVENNAME
----------- --------------------
1 aa
2 bb
3 cc