武汉竟升Q复制实施文档

系统 1491 0

<!-- [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组。

武汉竟升Q复制实施文档


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论