<!-- [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]-->
创建如下用户,用户的属组如下所示:
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)
在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 |
DB2UDB版本情况:
$db2level
DB21085IInstance"db2inst1"uses"64"bitsandDB2coderelease"SQL09013"withlevelidentifier"01040107".
Informationaltokensare"DB2v9. 5 .0. 7 ","s070719","U811590",andFixPack" 7 ".Productisinstalledat"/db2/V9. 5 ".
$dspmqver
Name:WebSphereMQ
Version:6.0. 0 . 0
CMVClevel:p600-101-060504
BuildType:IKAP-(Production)
在A机注册Q复制服务器license
$su – db2inst1
$db2licm-awsrs.lic
在B机注册Q复制服务器license
$su – db2inst1
$db2licm-awsrs.lic
在A机和B机上创建数据库,数据库名都为 BPFDB,apply
在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
$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') |
创建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') |
在A机刷新实例用户的MQ安全信息:
$su-mqm
$runmqscQMCAP
refreshsecurity
end
在B机刷新实例用户的MQ安全信息:
$su-mqm
$runmqscQMAPP
refreshsecurity
end
以下内容建议使用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>
使用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; |
使用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; |
使用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
从经典源装入。
在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
使用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; |
第一次启动,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&
在A机停止capture
$su - db2inst1
$asnqccmdCAPTURE_SERVER= BPFDB STOP
在B机停止apply
$su - db2inst2
$asnqacmdapply_server= APPLY STOP
$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.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 库不可以看到已删除的数据
问题一:
ASN2270EThestoredprocedure"ASN.ADMINIF"indatabase" APPLY "isnotauthor
izedtoaccesstheWebSphereMQqueuemanager"CCZFDB2_SVC-QMAPP"becausetheo
peratingsystemuserID"db2inst2",whichistheDB2fenceduseroftheinstance
thatcontainsthisdatabase,isnotamemberoftheoperatingsystemgroupfor
WebSphereMQapplications(usuallymqm)atthehost"CCZFDB2_SVC".
分析:
需要把db2fence用户属于mqm组。