武汉竟升Q复制实施文档

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安装

DB2 UDB版本情况:

$db2level

DB21085I  Instance "db2inst1" uses "64" bits and DB2 code release "SQL09013" with level identifier "01040107".

Informational tokens are "DB2 v9. 5 .0. 7 ", "s070719", "U811590", and Fix Pack " 7 ". Product is installed at "/db2/V9. 5 ".

2.2  WebSphere MQ安装

$dspmqver

Name:        WebSphere MQ

Version:     6.0. 0 . 0

CMVC level:  p600-101-060504

BuildType:   IKAP - (Production)

2.3  注册Q复制服务器license

在A机注册Q复制服务器license

$su   db2inst1

$db2licm -a  wsrs.lic

在B机注册Q复制服务器license

$su   db2inst1

$db2licm -a  wsrs.lic

 

3.  DB2 UDB配置

3.1  介绍数据环境

在A机和B机上创建数据库,数据库名都为 BPFDB,apply

 

3.2  配置编目信息

在A机的db2inst1用户进行如下编目:

$su   db2inst1

$db2 catalog tcpip node  CCZFDB1  remote  10.68.22.231  server  50010

$db2 catalog tcpip node  CCZFDB 2 remote  10.68.22.232  server  500 2 0

$db2 catalog db  APPLY  at node  CCZFDB 2

$db2 terminate

 

在B机的db2inst2用户进行如下编目:

$su   db2inst2

$db2 catalog tcpip node  CCZFDB1  remote  10.68.22.231  server  50010

$db2 catalog tcpip node  CCZFDB 2 remote  10.68.22.232  server  500 2 0

$db2 catalog db  BPFDB  at node  CCZFDB1

$db2 terminate

 

4.  WebSphere MQ配置

4.1  创建MQ对象

4.1.1.  A机MQ配置

$su - mqm

$env MQSPREFIX= /var/mqm/QMCAP  

$crtmqm -ld  /var/mqm/QMCAP/log  -lc -lf 15000 -lp 30 -ls 10 QMCAP

$strmqm QMCAP

$ runmqsc QMCAP <crt_cap_obj.tst >crt_cap_obj.log

 

创建QMCAP队列和通道的脚本crt_cap_obj.tst内容:

DEFINE  QLOCAL('DEADQ') MAXMSGL(4194403) MAXDEPTH(5000)

ALTER QMGR DEADQ('DEADQ')

DEFINE QLOCAL('ASN.QMCAP.RESTARTQ') DEFPSIST(YES) PUT(ENABLED) GET(ENABLED)  MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QLOCAL('ASN.QMCAP.ADMINQ') DEFPSIST(YES) PUT(ENABLED) GET(ENABLED)  MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QLOCAL('ASN.QMAPP_TO_QMCAP.DATAQ') DEFPSIST(YES) SHARE  MSGDLVSQ(PRIORITY) MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QREMOTE('ASN.QMAPP.ADMINQ') RNAME('ASN.QMAPP.ADMINQ') RQMNAME('QMAPP') XMITQ('QMAPP') DEFPSIST(YES)

DEFINE QLOCAL('QMAPP') USAGE(XMITQ) DEFPSIST(YES) TRIGGER TRIGTYPE(FIRST) TRIGDATA(QMCAP_TO_QMAPP) INITQ(SYSTEM.CHANNEL.INITQ) MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QREMOTE('ASN.QMCAP_TO_QMAPP.DATAQ') RNAME('ASN.QMCAP_TO_QMAPP.DATAQ') RQMNAME('QMAPP') XMITQ ('QMAPP') DEFPSIST(YES)

DEFINE CHL ('QMCAP_TO_QMAPP') CHLTYPE(SDR) TRPTYPE(TCP) CONNAME(' 10.68.22.23 2 (1415)') XMITQ ('QMAPP') DISCINT (0) HBINT(300)

DEFINE CHL ('QMAPP_TO_QMCAP') CHLTYPE(RCVR) TRPTYPE(TCP) HBINT(300)

DEFINE QMODEL('IBMQREP.SPILL.MODELQ') DEFSOPT(SHARED) MAXDEPTH(500000) MSGDLVSQ(FIFO) DEFTYPE(PERMDYN) MAXMSGL( 5 00000)

ALTER QMGR MAXUMSGS(10000) MAXMSGL(4194403)

define listener(listener1) trptype(TCP) control(MANUAL) IPADDR(' 10.68.22.23 1 ') PORT(1414)

start listener(listener1)

START CHL ('QMCAP_TO_QMAPP')

 

 

4.1.2.  B机MQ配置

创建MQ队列管理器(QMAPP):

$su - mqm

$env MQSPREFIX= /var/mqm/QMAPP

$crtmqm -ld  /var/mqm/QMAPP/log  -lc  - lf 15000 -lp 30 -ls 10 QMAPP

$strmqm QMAPP

$ runmqsc QMAPP < crt_app_obj.tst>crt_app_obj.log

 

创建QMAPP队列和通道的脚本crt_app_obj.tst内容:

DEFINE  QLOCAL('DEADQ') MAXMSGL(4194403) MAXDEPTH(5000)

ALTER QMGR DEADQ('DEADQ')

DEFINE QLOCAL('ASN.QMAPP.RESTARTQ') DEFPSIST(YES)  PUT(ENABLED) GET(ENABLED)  MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QLOCAL('ASN.QMAPP.ADMINQ')  DEFPSIST(YES) PUT(ENABLED) GET(ENABLED)  MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QLOCAL('ASN.QMCAP_TO_QMAPP.DATAQ') DEFPSIST(YES) SHARE  MSGDLVSQ(PRIORITY) MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QREMOTE('ASN.QMCAP.ADMINQ') RNAME('ASN.QMCAP.ADMINQ') RQMNAME('QMCAP') XMITQ('QMCAP') DEFPSIST(YES)

DEFINE QLOCAL('QMCAP') USAGE(XMITQ)  DEFPSIST(YES) TRIGGER TRIGTYPE(FIRST) TRIGDATA(QMAPP_TO_Q1) INITQ(SYSTEM.CHANNEL.INITQ) MAXMSGL(4194403) MAXDEPTH(5000)

DEFINE QREMOTE('ASN.QMAPP_TO_QMCAP.DATAQ') RNAME('ASN.QMAPP_TO_QMCAP.DATAQ') RQMNAME('QMCAP') XMITQ('QMCAP') DEFPSIST(YES)

DEFINE CHL ('QMAPP_TO_QMCAP') CHLTYPE(SDR) TRPTYPE(TCP) CONNAME(' 10.68.22.231 (1414)') XMITQ ('QMCAP') DISCINT (0)  HBINT(300)

DEFINE CHL ('QMCAP_TO_QMAPP') CHLTYPE(RCVR) TRPTYPE(TCP)  HBINT(300)

DEFINE QMODEL('IBMQREP.SPILL.MODELQ') DEFSOPT(SHARED) MAXDEPTH(500000) MSGDLVSQ(FIFO) DEFTYPE(PERMDYN)  MAXMSGL( 5 00000)

ALTER QMGR MAXUMSGS(10000) MAXMSGL(4194403)

define listener(listener1) trptype(TCP) control(MANUAL) IPADDR(' 10.68.22.23 2 ') PORT(1415)

start listener(listener1)

START CHL ('QMAPP_TO_QMCAP')

 

 

4.2  刷新用户安全信息

在A机刷新实例用户的MQ安全信息:

$su - mqm

$runmqsc QMCAP

  refresh security

end

 

在B机刷新实例用户的MQ安全信息:

$su - mqm

$runmqsc QMAPP

  refresh security

end

5.  实施DB2 Q复制

以下内容建议使用windows 客户端编目后的  db2rc 复制中心实施。

 

DB2RC 的所在客户端惊醒 DB2 编目:

db2 => catalog tcpip node CCZFDB1 remote 10.68.22.231 server 50010

DB20000I  CATALOG TCPIP NODE 命令成功完成。

DB21056W  直到刷新目录高速缓存之后,目录更改才生效。

db2 => catalog tcpip node CCZFDB2 remote 10.68.22.232 server 50020

DB20000I  CATALOG TCPIP NODE 命令成功完成。

DB21056W  直到刷新目录高速缓存之后,目录更改才生效。

db2 => catalog db APPLY at node CCZFDB2

DB20000I  CATALOG DATABASE 命令成功完成。

DB21056W  直到刷新目录高速缓存之后,目录更改才生效。

db2 => db2 catalog db BPFDB at node CCZFDB1

SQL0104N  在  " 语句开始 后面找到异常标记  "db2" 。预期标记可能包括: "SELECT"

SQLSTATE=42601

db2 => catalog db BPFDB at node CCZFDB1

DB20000I  CATALOG DATABASE 命令成功完成。

DB21056W  直到刷新目录高速缓存之后,目录更改才生效。

db2 => terminate

DB20000I  TERMINATE 命令成功完成。

 

C:/IBM/SQLLIB/BIN>

 

 

 

5.1  创建Q capture和Q apply控制表

使用initii.txt脚本产生capture控制表脚本qcapctrl.sql和apply控制表脚本qappctrl.sql。

在源数据库中执行capture控制表脚本qcapctrl.sql,在目标数据库中执行apply控制表脚本qappctrl.sql。

操作步骤如下:

$su   db2inst1

$cd /caplog

$asnclp  - f initii.txt

$db2 connect to  BPFDB  user db2inst1 using  123456

$db2  tvf qcapctrl.sql

$db2 connect to  APPLY  user db2inst2 using  123456

$db2  tvf qappctrl.sql

Initii.txt脚本内容:

#set environment

ASNCLP SESSION SET TO Q REPLICATION;

SET LOG "qcontrol.err";

SET SERVER CAPTURE TO DB  BPFDB  ID db2inst1 PASSWORD " 123456 ";

SET QMANAGER "QMCAP" FOR CAPTURE SCHEMA;

SET CAPTURE SCHEMA SOURCE ASN;

SET SERVER TARGET TO DB  APPLY  ID db2inst2 PASSWORD " 123456 ";

SET QMANAGER "QMAPP" FOR APPLY SCHEMA;

SET APPLY SCHEMA ASN;

SET OUTPUT CAPTURE SCRIPT "qcapctrl.sql" TARGET SCRIPT "qappctrl.sql";

SET RUN SCRIPT LATER;

 

#  2  Creating Q Capture control tables.

CREATE CONTROL TABLES FOR CAPTURE SERVER USING

RESTARTQ "ASN.QMCAP.RESTARTQ" ADMINQ "ASN.QMCAP.ADMINQ"

MEMORY LIMIT 64 MONITOR INTERVAL 600000  IN UW TBSPACE  TBSCAP ;

 

#  3  Creating Q Apply control tables.

# This command specifies a password file, asnpwd.aut. The Q Apply progam uses this

# file to connect to the Q Capture server when it loads the target table.

CREATE CONTROL TABLES FOR APPLY SERVER USING PWDFILE "asnpwd.aut"

IN UW TBSPACE TBSAPP;

 

#  4  Ending the ASNCLP session.

QUIT;

 

 

5.2  创建Q复制队列映射

使用crt_map.txt脚本产生Q capture队列映射脚本 qcapmap .sql和Q apply队列映射脚本 qappmap .sql。

在源数据库中执行Q capture复制队列脚本 qcapmap .sql,在目标数据库中执行apply复制队列脚本 qappmap .sql。

操作步骤如下:

$su   db2inst1

$cd /caplog

$asnclp  f crt_map.txt

$db2 connect to  BPFDB  user db2inst1 using  123456

$db2  tvf  qcapmap .sql

$db2 connect to  APPLY  user db2inst2 using  123456

$db2  tvf  qappmap .sql

 

crt_map.txt脚本内容如下:

#  1  Setting the environment.

ASNCLP SESSION SET TO Q REPLICATION;

SET LOG "rqmap.err";

SET SERVER CAPTURE TO DB  BPFDB  ID db2inst1 PASSWORD " 123456 ";

SET CAPTURE SCHEMA SOURCE ASN;

SET SERVER TARGET TO DB  APPLY  ID db2inst2 PASSWORD " 123456 ";

SET APPLY SCHEMA ASN;

SET OUTPUT CAPTURE SCRIPT "qcapmap.sql" TARGET SCRIPT "qappmap.sql";

SET RUN SCRIPT LATER;

 

#  2  Creating a replication queue map.

CREATE REPLQMAP S_ASN_TO_T_ASN USING

ADMINQ "ASN.QMCAP.ADMINQ" RECVQ "ASN.QMCAP_TO_QMAPP.DATAQ"

SENDQ "ASN.QMCAP_TO_QMAPP.DATAQ" NUM APPLY AGENTS 8 HEARTBEAT INTERVAL 5;

 

#  3  Ending the ASNCLP session.

 

QUIT;

 

 

5.3  创建Q预订

使用crt_q_order.txt脚本产生Q capture Q预订脚本qcapsub.sql和Q apply Q预订脚本qappsub.sql。

在源数据库中执行Q capture Q预订脚本qcapsub.sql,在目标数据库中执行applyQ预订脚本qappsub.sql。

操作步骤如下:

$su  -  db2inst1

$cd /caplog

$asnclp  - f crt_q_order.txt

$db2 connect to  BPFDB  user db2inst1 using  123456

$db2  - tvf qcapsub.sql

$db2 connect to  APPLY  user db2inst2 using  123456

$db2  tvf qappsub.sql

 

crt_q_order.txt内容:

#  1  Setting the environment.

# The SET OUTPUT command creates two SQL scripts: qcapsub.sql, which adds

# definitions for the Q subscription to the Q Capture control tables, and

# qappsub.sql, which adds definitions for the Q subscription to the Q Apply

# control tables.

 

ASNCLP SESSION SET TO Q REPLICATION;

SET LOG "qsub.err";

SET SERVER CAPTURE TO DB  BPFDB  ID db2inst1 PASSWORD " 123456 ";

SET CAPTURE SCHEMA SOURCE ASN;

SET SERVER TARGET TO DB  APPLY  ID db2inst2 PASSWORD " 123456 ";

SET APPLY SCHEMA ASN;

SET OUTPUT CAPTURE SCRIPT "qcapsub.sql" TARGET SCRIPT "qappsub.sql";

SET RUN SCRIPT LATER;

 

CREATE QSUB USING REPLQMAP S_ASN_TO_T_ASN(SUBNAME  Q订阅名称   源表名  OPTIONS HAS LOAD PHASE I exist TARGET NAME  目标表名  LOAD TYPE 2);

 

#  3  Ending the ASNCLP session.

 

QUIT;

 

 

以上 OPTIONS HAS LOAD PHASE I

 

HAS LOAD PHASE

指定是否使用源中的数据装入  预订的目标表。

N

目标中没有装入阶段。这是缺省值。

I

指定自动装入。Q Apply  程序将装入目标。装入方法取决于  LOAD_TYPE  关键字。对于将存储过程指定为目标的  预订,此参数无效。

E

指定手工装入。除 Q Apply  程序外的应用程序将装入目标。在这种情况下,应使用  LOADDONE  命令指示装入已完成。

 

 

以上 EXIST

EXIST

指定目标表已存在。

·  如果指定 EXIST  但未提供目标表名称,则  ASNCLP  程序将查找缺省表  TGT-SOURCE TABLE NAME

·  如果指定 EXIST  和单个  TARGET NAME ,并且使用  SOURCE ALL  或  SOURCE NAME LIKE ,则所有源表将映射至指定的那个现有目标表。

·  如果未指定 EXIST  并且使用  SOURCE ALL  或  SOURCE NAME LIKE ,则源表将与使用缺省名称  TGT-SOURCE TABLE NAME  的目标表配对。

以上软件 LOAD TYPE 2

LOAD TYPE

指定装入类型。

0

自动选择最佳类型。

1

仅使用 LOAD from CURSOR 。此参数对于经典复制无效。

2

仅使用 SELECT/IMPORT 。此参数对于经典复制无效。

3

仅使用 SELECT/LOAD 。此参数对于经典复制无效。

4

从经典源装入。

5.4  口令配置

在A机配置口令:

$su   db2inst1

$cd /caplog

$asnpwd init

$asnpwd add alias  BPFDB  id db2inst1 password  123456

$asnpwd add alias  APPLY  id db2inst2 password  123456

 

在B机

$su   db2inst2

$cd /applog

$asnpwd init

$asnpwd add alias  BPFDB  id db2inst1 password  123456

注意:由于创建数据库BPFDB的时候没有指定别名,所以这里别名自动成为数据库名

$asnpwd add alias  APPLY  id db2inst2 password  123456

 

6.  常用DB2 Q复制命令

6.1  检查Websphere  Replication Server 环境

使用check_mq.txt脚本检查WebSphere MQ环境。

操作步骤如下:

$su   db2inst1

$cd /caplog

$asnclp  - f check_mq.txt

确保命令执行后没有错误输出。

 

WebSphere MQ环境检查脚本check_mq.txt内容:

# 1 Setting the environment. 

# No SET RUN statement is required. The commands run immediately and send 

# results to the command window and log. 

ASNCLP SESSION SET TO Q REPLICATION; 

SET LOG "qchecks.err"; 

SET SERVER CAPTURE TO DB  BPFDB  ID db2inst1 PASSWORD " 123456 "; 

SET QMANAGER "QMCAP" FOR CAPTURE SCHEMA; 

SET CAPTURE SCHEMA SOURCE ASN; 

SET SERVER TARGET TO DB  APPLY  ID db2inst2 PASSWORD " 123456 "; 

SET QMANAGER "QMAPP" FOR APPLY SCHEMA; 

SET APPLY SCHEMA ASN;

 

# 2 Checking the queue managers and queues. 

# These commands check whether the queue managers and queues exist, and validate 

# their settings against the requirements for Q replication. If errors are detected, 

# you must correct them before you start the Q Capture and Q Apply programs. 

VALIDATE WSMQ ENVIRONMENT FOR CAPTURE SCHEMA; 

VALIDATE WSMQ ENVIRONMENT FOR APPLY SCHEMA; 

VALIDATE WSMQ ENVIRONMENT FOR REPLQMAP S_ASN_TO_T_ASN; 

 

# 3 Sending test messages. 

# This command puts a test message on the send queue, ASN1.QM1_TO_QM2.DATAQ, 

# and tries to get the message from the receive queue, ASN1.QM1_TO_QM2.DATAQ. 

# The command also puts a test message on the Q Apply administration queue, 

# ASN1.QM1.ADMINQ, and tries to get the message from the Q Capture administration 

# queue, ASN1.QM1.ADMINQ. 

 

VALIDATE WSMQ MESSAGE FLOW FOR REPLQMAP S_ASN_TO_T_ASN; 

 

# 4 Ending the ASNCLP session. 

QUIT;

6.2  启动caputer和apply

第一次启动,startmode=cold 执行

 

以下是这三种模式的解释:

 

 

在A机启动caputer

$su  -  db2inst1

$ nohup asnqcap capture_server= BPFDB  startmode=cold capture_path="/caplog" logreuse=y logstdout=y memory_limit=512 &

 

在B机启动apply

$su  -  db2inst2

$ nohup asnqapp apply_server= APPLY  apply_path="/applog" logreuse=y  &

 

 

以后第二次及以后的维护过程中进行同步启动,使用模式为  WARMSI

 

在A机启动caputer

$su  -  db2inst1

$ nohup asnqcap capture_server= BPFDB  startmode= WARMSI  capture_path="/caplog" logreuse=y logstdout=y memory_limit=512 &

 

在B机启动apply

$su  -  db2inst2

$ nohup asnqapp apply_server= APPLY  apply_path="/applog" logreuse=y  &

 

6.3  停止caputer和apply

在A机停止capture

$su  db2inst1

$asnqccmd CAPTURE_SERVER= BPFDB  STOP

 

在B机停止apply

$su  -  db2inst2

$asnqacmd apply_server= APPLY  STOP

6.4  启动Q预订

$su   db2inst1

$cd /caplog

$asnclp  f q_start.txt

$db2 connect to  BPFDB  user db2inst1 using  123456

$db2  tvf  q_start .sql

 

WebSphere  Replication Server 环境检查脚本q_start.txt内容:

ASNCLP SESSION SET TO Q REPLICATION;

SET LOG "start_q_sub.err";

SET SERVER CAPTURE TO DB  BPFDB  ID db2inst1 PASSWORD " 123456 ";

SET QMANAGER "QMCAP" FOR CAPTURE SCHEMA;

SET CAPTURE SCHEMA SOURCE ASN;

SET SERVER TARGET TO DB  APPLY  ID db2inst2 PASSWORD " 123456 ";

SET QMANAGER "QMAPP" FOR APPLY SCHEMA;

SET APPLY SCHEMA ASN;

SET OUTPUT CAPTURE SCRIPT "q_start.sql" TARGET SCRIPT "q_start1.sql";

START QSUB for SUBNAME like "SUB%";

 

7.  简单测试

7.1 插入:
    
    在 10.68.22.231上的 BPFDB   库执行:INSERT INTO   表名 values ( 1 , ' 2 ')
    在 10.68.22.232上的 APPLY 库执行:SELECT * FROM  表名
    
    确认在 apply 库可以看到新插入的数据
    
     7.2更新:
    
    在 10.68.22.231上的 BPFDB   库执行:UPDATE  表名  SET name = ' 1 ' WHERE id = 1
    在 10.68.22.232上的 apply 库执行:SELECT * FROM  表名
    
    确认在 apply 库可以看到修改后的数据
    
     7.3删除:
    
    在 10.68.22.231上的 BPFDB   库执行:DELETE FROM  表名  WHERE id = 1
    在 10.68.22.232上的 apply 库执行:SELECT * FROM  表名
    
    确认在 apply 库不可以看到已删除的数据

 

 

8.  常见问题

问题一:

 

ASN2270E  The stored procedure "ASN.ADMINIF" in database " APPLY " is not author

ized to access the WebSphere MQ queue manager "CCZFDB2_SVC - QMAPP"because the o

perating system user ID "db2inst2", which is the DB2 fenced user of the instance

 that contains this database, is not a member of the operating system group for

WebSphere MQ applications (usually mqm) at the host "CCZFDB2_SVC".

 

分析:

需要把db2 fence用户属于mqm组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值