<!-- [if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8</w:DrawingGridVerticalSpacing><w:View>Normal</w:View><w:Compatibility></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->
1. 系统环境准备
1.1 用户和组
创建如下用户,用户的属组如下所示:
A机:源数据库 10.68.22.231
uid=301(db2inst1)gid=301(db2ig rp1)groups=1(staff),501(mqm)
uid=303(db2fusr1)gid=30 3 (db2fgrp1)groups=1(staff),501(mqm)
uid=501(mqm)gid=501(mqm)groups=1(staff)
uid=305(dasusr1)gid=305(dasgrp1)groups=1(staff),501(mqm)
B机:目标数据库 10.68.22.23 2
uid=302(db2inst2)gid=30 2 (db2igrp 2 )groups=1(staff),50 2 (mqm)
uid=304(db2fusr2)gid=30 4 (db2fgrp 2 )groups=1(staff),50 2 (mqm)
uid=50 2 (mqm)gid=50 2 (mqm)groups=1(staff)
uid=306(dasusr2)gid=306(dasgrp2)groups=1(staff),502(mqm)
1.2 文件系统
在A机创建如下文件系统:
文件系统名 |
大小 |
裸设备名 |
描述 |
/caplog |
10G |
/dev/caploglv |
|
/var/mqm/QMCAP |
3G |
/dev/qmcaplv |
|
/var/mqm/QMCAP/log |
7G |
/dev/qmcaploglv |
|
在B机创建如下文件系统:
文件系统名 |
大小 |
裸设备名 |
描述 |
/applog |
10G |
/dev/apploglv |
|
/var/mqm/QMAPP |
3G |
/dev/qmapplv |
|
/var/mqm/QMAPP/log |
7G |
/dev/qmapploglv |
|
2. 软件安装
2.1 DB2UDB安装
DB2UDB版本情况:
$db2level
DB21085IInstance"db2inst1"uses"64"bitsandDB2coderelease"SQL09013"withlevelidentifier"01040107".
Informationaltokensare"DB2v9. 5 .0. 7 ","s070719","U811590",andFixPack" 7 ".Productisinstalledat"/db2/V9. 5 ".
2.2 WebSphereMQ安装
$dspmqver
Name:WebSphereMQ
Version:6.0. 0 . 0
CMVClevel:p600-101-060504
BuildType:IKAP-(Production)
2.3 注册Q复制服务器license
在A机注册Q复制服务器license
$su – db2inst1
$db2licm-awsrs.lic
在B机注册Q复制服务器license
$su – db2inst1
$db2licm-awsrs.lic
3. DB2UDB配置
3.1 介绍数据环境
在A机和B机上创建数据库,数据库名都为 BPFDB,apply
3.2 配置编目信息
在A机的db2inst1用户进行如下编目:
$su – db2inst1
$db2catalogtcpipnode CCZFDB1 remote 10.68.22.231 server 50010
$db2catalogtcpipnode CCZFDB 2remote 10.68.22.232 server 500 2 0
$db2catalogdb APPLY atnode CCZFDB 2
$db2terminate
在B机的db2inst2用户进行如下编目:
$su – db2inst2
$db2catalogtcpipnode CCZFDB1 remote 10.68.22.231 server 50010
$db2catalogtcpipnode CCZFDB 2remote 10.68.22.232 server 500 2 0
$db2catalogdb BPFDB atnode CCZFDB1
$db2terminate
4. WebSphereMQ配置
4.1 创建MQ对象
4.1.1. A机MQ配置
$su-mqm
$envMQSPREFIX= /var/mqm/QMCAP
$crtmqm-ld /var/mqm/QMCAP/log -lc-lf15000-lp30-ls10QMCAP
$strmqmQMCAP
$runmqscQMCAP<crt_cap_obj.tst>crt_cap_obj.log
创建QMCAP队列和通道的脚本crt_cap_obj.tst内容:
DEFINEQLOCAL('DEADQ')MAXMSGL(4194403)MAXDEPTH(5000) ALTERQMGRDEADQ('DEADQ') DEFINEQLOCAL('ASN.QMCAP.RESTARTQ')DEFPSIST(YES)PUT(ENABLED)GET(ENABLED)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQLOCAL('ASN.QMCAP.ADMINQ')DEFPSIST(YES)PUT(ENABLED)GET(ENABLED)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQLOCAL('ASN.QMAPP_TO_QMCAP.DATAQ')DEFPSIST(YES)SHAREMSGDLVSQ(PRIORITY)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQREMOTE('ASN.QMAPP.ADMINQ')RNAME('ASN.QMAPP.ADMINQ')RQMNAME('QMAPP')XMITQ('QMAPP')DEFPSIST(YES) DEFINEQLOCAL('QMAPP')USAGE(XMITQ)DEFPSIST(YES)TRIGGERTRIGTYPE(FIRST)TRIGDATA(QMCAP_TO_QMAPP)INITQ(SYSTEM.CHANNEL.INITQ)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQREMOTE('ASN.QMCAP_TO_QMAPP.DATAQ')RNAME('ASN.QMCAP_TO_QMAPP.DATAQ')RQMNAME('QMAPP')XMITQ('QMAPP')DEFPSIST(YES) DEFINECHL('QMCAP_TO_QMAPP')CHLTYPE(SDR)TRPTYPE(TCP)CONNAME(' 10.68.22.23 2 (1415)')XMITQ('QMAPP')DISCINT(0)HBINT(300) DEFINECHL('QMAPP_TO_QMCAP')CHLTYPE(RCVR)TRPTYPE(TCP)HBINT(300) DEFINEQMODEL('IBMQREP.SPILL.MODELQ')DEFSOPT(SHARED)MAXDEPTH(500000)MSGDLVSQ(FIFO)DEFTYPE(PERMDYN)MAXMSGL( 5 00000) ALTERQMGRMAXUMSGS(10000)MAXMSGL(4194403) definelistener(listener1)trptype(TCP)control(MANUAL)IPADDR(' 10.68.22.23 1 ')PORT(1414) startlistener(listener1) STARTCHL('QMCAP_TO_QMAPP')
|
4.1.2. B机MQ配置
创建MQ队列管理器(QMAPP):
$su-mqm
$envMQSPREFIX= /var/mqm/QMAPP
$crtmqm-ld /var/mqm/QMAPP/log -lc - lf15000-lp30-ls10QMAPP
$strmqmQMAPP
$runmqscQMAPP<crt_app_obj.tst>crt_app_obj.log
创建QMAPP队列和通道的脚本crt_app_obj.tst内容:
DEFINEQLOCAL('DEADQ')MAXMSGL(4194403)MAXDEPTH(5000) ALTERQMGRDEADQ('DEADQ') DEFINEQLOCAL('ASN.QMAPP.RESTARTQ')DEFPSIST(YES)PUT(ENABLED)GET(ENABLED)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQLOCAL('ASN.QMAPP.ADMINQ')DEFPSIST(YES)PUT(ENABLED)GET(ENABLED)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQLOCAL('ASN.QMCAP_TO_QMAPP.DATAQ')DEFPSIST(YES)SHAREMSGDLVSQ(PRIORITY)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQREMOTE('ASN.QMCAP.ADMINQ')RNAME('ASN.QMCAP.ADMINQ')RQMNAME('QMCAP')XMITQ('QMCAP')DEFPSIST(YES) DEFINEQLOCAL('QMCAP')USAGE(XMITQ)DEFPSIST(YES)TRIGGERTRIGTYPE(FIRST)TRIGDATA(QMAPP_TO_Q1)INITQ(SYSTEM.CHANNEL.INITQ)MAXMSGL(4194403)MAXDEPTH(5000) DEFINEQREMOTE('ASN.QMAPP_TO_QMCAP.DATAQ')RNAME('ASN.QMAPP_TO_QMCAP.DATAQ')RQMNAME('QMCAP')XMITQ('QMCAP')DEFPSIST(YES) DEFINECHL('QMAPP_TO_QMCAP')CHLTYPE(SDR)TRPTYPE(TCP)CONNAME(' 10.68.22.231 (1414)')XMITQ('QMCAP')DISCINT(0)HBINT(300) DEFINECHL('QMCAP_TO_QMAPP')CHLTYPE(RCVR)TRPTYPE(TCP)HBINT(300) DEFINEQMODEL('IBMQREP.SPILL.MODELQ')DEFSOPT(SHARED)MAXDEPTH(500000)MSGDLVSQ(FIFO)DEFTYPE(PERMDYN)MAXMSGL( 5 00000) ALTERQMGRMAXUMSGS(10000)MAXMSGL(4194403) definelistener(listener1)trptype(TCP)control(MANUAL)IPADDR(' 10.68.22.23 2 ')PORT(1415) startlistener(listener1) STARTCHL('QMAPP_TO_QMCAP')
|
4.2 刷新用户安全信息
在A机刷新实例用户的MQ安全信息:
$su-mqm
$runmqscQMCAP
refreshsecurity
end
在B机刷新实例用户的MQ安全信息:
$su-mqm
$runmqscQMAPP
refreshsecurity
end
5. 实施DB2Q复制
以下内容建议使用 windows 客户端编目后的 db2rc 复制中心实施。
在 DB2RC 的所在客户端惊醒 DB2 编目:
db2=>catalogtcpipnodeCCZFDB1remote10.68.22.231server50010
DB20000ICATALOGTCPIPNODE 命令成功完成。
DB21056W 直到刷新目录高速缓存之后,目录更改才生效。
db2=>catalogtcpipnodeCCZFDB2remote10.68.22.232server50020
DB20000ICATALOGTCPIPNODE 命令成功完成。
DB21056W 直到刷新目录高速缓存之后,目录更改才生效。
db2=>catalogdbAPPLYatnodeCCZFDB2
DB20000ICATALOGDATABASE 命令成功完成。
DB21056W 直到刷新目录高速缓存之后,目录更改才生效。
db2=>db2catalogdbBPFDBatnodeCCZFDB1
SQL0104N 在 " 语句开始 " 后面找到异常标记 "db2" 。预期标记可能包括: "SELECT" 。
SQLSTATE=42601
db2=>catalogdbBPFDBatnodeCCZFDB1
DB20000ICATALOGDATABASE 命令成功完成。
DB21056W 直到刷新目录高速缓存之后,目录更改才生效。
db2=>terminate
DB20000ITERMINATE 命令成功完成。
C:/IBM/SQLLIB/BIN>
5.1 创建Qcapture和Qapply控制表
使用initii.txt脚本产生capture控制表脚本qcapctrl.sql和apply控制表脚本qappctrl.sql。
在源数据库中执行capture控制表脚本qcapctrl.sql,在目标数据库中执行apply控制表脚本qappctrl.sql。
操作步骤如下:
$su – db2inst1
$cd/caplog
$asnclp - finitii.txt
$db2connectto BPFDB userdb2inst1using 123456
$db2 – tvfqcapctrl.sql
$db2connectto APPLY userdb2inst2using 123456
$db2 – tvfqappctrl.sql
Initii.txt脚本内容:
#setenvironment ASNCLPSESSIONSETTOQREPLICATION; SETLOG"qcontrol.err"; SETSERVERCAPTURETODB BPFDB IDdb2inst1PASSWORD" 123456 "; SETQMANAGER"QMCAP"FORCAPTURESCHEMA; SETCAPTURESCHEMASOURCEASN; SETSERVERTARGETTODB APPLY IDdb2inst2PASSWORD" 123456 "; SETQMANAGER"QMAPP"FORAPPLYSCHEMA; SETAPPLYSCHEMAASN; SETOUTPUTCAPTURESCRIPT"qcapctrl.sql"TARGETSCRIPT"qappctrl.sql"; SETRUNSCRIPTLATER;
#2CreatingQCapturecontroltables. CREATECONTROLTABLESFORCAPTURESERVERUSING RESTARTQ"ASN.QMCAP.RESTARTQ"ADMINQ"ASN.QMCAP.ADMINQ" MEMORYLIMIT64MONITORINTERVAL600000 INUWTBSPACE TBSCAP ;
#3CreatingQApplycontroltables. #Thiscommandspecifiesapasswordfile,asnpwd.aut.TheQApplyprogamusesthis #filetoconnecttotheQCaptureserverwhenitloadsthetargettable. CREATECONTROLTABLESFORAPPLYSERVERUSINGPWDFILE"asnpwd.aut" INUWTBSPACETBSAPP;
#4EndingtheASNCLPsession. QUIT;
|
5.2 创建Q复制队列映射
使用crt_map.txt脚本产生Qcapture队列映射脚本 qcapmap .sql和Qapply队列映射脚本 qappmap .sql。
在源数据库中执行Qcapture复制队列脚本 qcapmap .sql,在目标数据库中执行apply复制队列脚本 qappmap .sql。
操作步骤如下:
$su – db2inst1
$cd/caplog
$asnclp – fcrt_map.txt
$db2connectto BPFDB userdb2inst1using 123456
$db2 – tvf qcapmap .sql
$db2connectto APPLY userdb2inst2using 123456
$db2 – tvf qappmap .sql
crt_map.txt脚本内容如下:
#1Settingtheenvironment. ASNCLPSESSIONSETTOQREPLICATION; SETLOG"rqmap.err"; SETSERVERCAPTURETODB BPFDB IDdb2inst1PASSWORD" 123456 "; SETCAPTURESCHEMASOURCEASN; SETSERVERTARGETTODB APPLY IDdb2inst2PASSWORD" 123456 "; SETAPPLYSCHEMAASN; SETOUTPUTCAPTURESCRIPT"qcapmap.sql"TARGETSCRIPT"qappmap.sql"; SETRUNSCRIPTLATER;
#2Creatingareplicationqueuemap. CREATEREPLQMAPS_ASN_TO_T_ASNUSING ADMINQ"ASN.QMCAP.ADMINQ"RECVQ"ASN.QMCAP_TO_QMAPP.DATAQ" SENDQ"ASN.QMCAP_TO_QMAPP.DATAQ"NUMAPPLYAGENTS8HEARTBEATINTERVAL5;
#3EndingtheASNCLPsession.
QUIT;
|
5.3 创建Q预订
使用crt_q_order.txt脚本产生QcaptureQ预订脚本qcapsub.sql和QapplyQ预订脚本qappsub.sql。
在源数据库中执行QcaptureQ预订脚本qcapsub.sql,在目标数据库中执行applyQ预订脚本qappsub.sql。
操作步骤如下:
$su - db2inst1
$cd/caplog
$asnclp - fcrt_q_order.txt
$db2connectto BPFDB userdb2inst1using 123456
$db2 - tvfqcapsub.sql
$db2connectto APPLY userdb2inst2using 123456
$db2 – tvfqappsub.sql
crt_q_order.txt内容:
#1Settingtheenvironment. #TheSETOUTPUTcommandcreatestwoSQLscripts:qcapsub.sql,whichadds #definitionsfortheQsubscriptiontotheQCapturecontroltables,and #qappsub.sql,whichaddsdefinitionsfortheQsubscriptiontotheQApply #controltables.
ASNCLPSESSIONSETTOQREPLICATION; SETLOG"qsub.err"; SETSERVERCAPTURETODB BPFDB IDdb2inst1PASSWORD" 123456 "; SETCAPTURESCHEMASOURCEASN; SETSERVERTARGETTODB APPLY IDdb2inst2PASSWORD" 123456 "; SETAPPLYSCHEMAASN; SETOUTPUTCAPTURESCRIPT"qcapsub.sql"TARGETSCRIPT"qappsub.sql"; SETRUNSCRIPTLATER;
CREATEQSUBUSINGREPLQMAPS_ASN_TO_T_ASN(SUBNAME Q订阅名称 源表名 OPTIONSHASLOADPHASEIexistTARGETNAME 目标表名 LOADTYPE2);
#3EndingtheASNCLPsession.
QUIT; |
以上 OPTIONSHASLOADPHASEI
HASLOADPHASE
指定是否使用源中的数据装入 Q 预订的目标表。
N
目标中没有装入阶段。这是缺省值。
I
指定自动装入。 QApply 程序将装入目标。装入方法取决于 LOAD_TYPE 关键字。对于将存储过程指定为目标的 Q 预订,此参数无效。
E
指定手工装入。除 QApply 程序外的应用程序将装入目标。在这种情况下,应使用 LOADDONE 命令指示装入已完成。
以上 EXIST
EXIST
指定目标表已存在。
· 如果指定 EXIST 但未提供目标表名称,则 ASNCLP 程序将查找缺省表 TGT-SOURCETABLENAME 。
· 如果指定 EXIST 和单个 TARGETNAME ,并且使用 SOURCEALL 或 SOURCENAMELIKE ,则所有源表将映射至指定的那个现有目标表。
· 如果未指定 EXIST 并且使用 SOURCEALL 或 SOURCENAMELIKE ,则源表将与使用缺省名称 TGT-SOURCETABLENAME 的目标表配对。
以上软件 LOADTYPE2
LOADTYPE
指定装入类型。
0
自动选择最佳类型。
1
仅使用 LOADfromCURSOR 。此参数对于经典复制无效。
2
仅使用 SELECT/IMPORT 。此参数对于经典复制无效。
3
仅使用 SELECT/LOAD 。此参数对于经典复制无效。
4
从经典源装入。
5.4 口令配置
在A机配置口令:
$su – db2inst1
$cd/caplog
$asnpwdinit
$asnpwdaddalias BPFDB iddb2inst1password 123456
$asnpwdaddalias APPLY iddb2inst2password 123456
在B机
$su – db2inst2
$cd/applog
$asnpwdinit
$asnpwdaddalias BPFDB iddb2inst1password 123456
注意:由于创建数据库BPFDB的时候没有指定别名,所以这里别名自动成为数据库名
$asnpwdaddalias APPLY iddb2inst2password 123456
6. 常用DB2Q复制命令
6.1 检查Websphere ReplicationServer 环境
使用check_mq.txt脚本检查WebSphereMQ环境。
操作步骤如下:
$su – db2inst1
$cd/caplog
$asnclp - fcheck_mq.txt
确保命令执行后没有错误输出。
WebSphereMQ环境检查脚本check_mq.txt内容:
#1Settingtheenvironment. #NoSETRUNstatementisrequired.Thecommandsrunimmediatelyandsend #resultstothecommandwindowandlog. ASNCLPSESSIONSETTOQREPLICATION; SETLOG"qchecks.err"; SETSERVERCAPTURETODB BPFDB IDdb2inst1PASSWORD" 123456 "; SETQMANAGER"QMCAP"FORCAPTURESCHEMA; SETCAPTURESCHEMASOURCEASN; SETSERVERTARGETTODB APPLY IDdb2inst2PASSWORD" 123456 "; SETQMANAGER"QMAPP"FORAPPLYSCHEMA; SETAPPLYSCHEMAASN;
#2Checkingthequeuemanagersandqueues. #Thesecommandscheckwhetherthequeuemanagersandqueuesexist,andvalidate #theirsettingsagainsttherequirementsforQreplication.Iferrorsaredetected, #youmustcorrectthembeforeyoustarttheQCaptureandQApplyprograms. VALIDATEWSMQENVIRONMENTFORCAPTURESCHEMA; VALIDATEWSMQENVIRONMENTFORAPPLYSCHEMA; VALIDATEWSMQENVIRONMENTFORREPLQMAPS_ASN_TO_T_ASN;
#3Sendingtestmessages. #Thiscommandputsatestmessageonthesendqueue,ASN1.QM1_TO_QM2.DATAQ, #andtriestogetthemessagefromthereceivequeue,ASN1.QM1_TO_QM2.DATAQ. #ThecommandalsoputsatestmessageontheQApplyadministrationqueue, #ASN1.QM1.ADMINQ,andtriestogetthemessagefromtheQCaptureadministration #queue,ASN1.QM1.ADMINQ.
VALIDATEWSMQMESSAGEFLOWFORREPLQMAPS_ASN_TO_T_ASN;
#4EndingtheASNCLPsession. QUIT; |
6.2 启动caputer和apply
第一次启动,startmode=cold执行
以下是这三种模式的解释:
在A机启动caputer
$su - db2inst1
$nohupasnqcapcapture_server= BPFDB startmode=coldcapture_path="/caplog"logreuse=ylogstdout=ymemory_limit=512&
在B机启动apply
$su - db2inst2
$nohupasnqappapply_server= APPLY apply_path="/applog"logreuse=y&
以后第二次及以后的维护过程中进行同步启动,使用模式为 WARMSI
在A机启动caputer
$su - db2inst1
$nohupasnqcapcapture_server= BPFDB startmode= WARMSI capture_path="/caplog"logreuse=ylogstdout=ymemory_limit=512&
在B机启动apply
$su - db2inst2
$nohupasnqappapply_server= APPLY apply_path="/applog"logreuse=y&
6.3 停止caputer和apply
在A机停止capture
$su - db2inst1
$asnqccmdCAPTURE_SERVER= BPFDB STOP
在B机停止apply
$su - db2inst2
$asnqacmdapply_server= APPLY STOP
6.4 启动Q预订
$su – db2inst1
$cd/caplog
$asnclp – fq_start.txt
$db2connectto BPFDB userdb2inst1using 123456
$db2 – tvf q_start .sql
WebSphere ReplicationServer 环境检查脚本q_start.txt内容:
ASNCLPSESSIONSETTOQREPLICATION; SETLOG"start_q_sub.err"; SETSERVERCAPTURETODB BPFDB IDdb2inst1PASSWORD" 123456 "; SETQMANAGER"QMCAP"FORCAPTURESCHEMA; SETCAPTURESCHEMASOURCEASN; SETSERVERTARGETTODB APPLY IDdb2inst2PASSWORD" 123456 "; SETQMANAGER"QMAPP"FORAPPLYSCHEMA; SETAPPLYSCHEMAASN; SETOUTPUTCAPTURESCRIPT"q_start.sql"TARGETSCRIPT"q_start1.sql"; STARTQSUBforSUBNAMElike"SUB%"; |
7. 简单测试
7.1
插入:
在
10.68.22.231
上的
BPFDB
库执行:
INSERTINTO
表名
values(
值
1
,'
值
2
')
在
10.68.22.232
上的
APPLY
库执行:
SELECT*FROM
表名
确认在
apply
库可以看到新插入的数据
7.2
更新:
在
10.68.22.231
上的
BPFDB
库执行:
UPDATE
表名
SETname='
值
1
'WHEREid=1
在
10.68.22.232
上的
apply
库执行:
SELECT*FROM
表名
确认在
apply
库可以看到修改后的数据
7.3
删除:
在
10.68.22.231
上的
BPFDB
库执行:
DELETEFROM
表名
WHEREid=1
在
10.68.22.232
上的
apply
库执行:
SELECT*FROM
表名
确认在
apply
库不可以看到已删除的数据
8. 常见问题
问题一:
ASN2270EThestoredprocedure"ASN.ADMINIF"indatabase" APPLY "isnotauthor
izedtoaccesstheWebSphereMQqueuemanager"CCZFDB2_SVC-QMAPP"becausetheo
peratingsystemuserID"db2inst2",whichistheDB2fenceduseroftheinstance
thatcontainsthisdatabase,isnotamemberoftheoperatingsystemgroupfor
WebSphereMQapplications(usuallymqm)atthehost"CCZFDB2_SVC".
分析:
需要把db2fence用户属于mqm组。