hchao
作者hchao·2015-11-05 16:45
网站运营经理·TWT

DPF备份恢复实践

字数 37964阅读 2805评论 0赞 1

企业对数据处理资源越来越多地依赖于关系型数据管理系统 (RDBMS),以满足日益增长的数据存储和处理需求。当数据库和数据仓库变得越来越大时,管理不断增长的存储数据的成为影响 RDBMS 性能的一个关键因素。要应对数据库的增长,数据库系统必须具有可扩展性能,以便能够应用额外计算资源。DB2 DPF提供的数据分区功能支持将单个数据库扩展到多个服务器上。有了分区以后,就可以实现跨分区分布数据。

使用 DPF 之后,数据库将变得可伸缩,因为可以根据数据增长添加新机器或者节点,并将数据库扩展到它们上面。这意味着每个附加机器可为数据库提供更多的 CPU、更多的内存、更多的磁盘。对于管理数据仓储、数据挖掘和在线分析处理 (OLAP) 工作负载而言 DPF 是一个完美的选择。它可以与在线事物处理 (OLTP) 工作负载和睦相处。

对于任何数据库管理系统而言,备份和恢复都是确保数据可恢复性的关键功能。DB2 中的备份操作可以是在线操作,也可以是离线操作。您不可能知道系统何时会出现灾难或故障而导致停机,因此,最好就是随时做好准备,不仅仅要保护数据不受外部因素干扰,也要考虑来自内部的因素,例如,某一个内部用户可能不小心使用非正确信息而导致数据库损坏。鉴于这些原因,理解备份和恢复功能如何用于您的数据库管理系统是至关重要的,您应该有一个计划周密的备份策略。

 DPF备份区别于普通单分区数据库备份的一个点是,DPF在每次做备份时必须先对0节点(协调节点)进行备份,之后才可以对其他节点进行串行或者并行的备份。同理DPF数据库进行恢复时也是同样的道理,必须先对0节点(协调节点)进行恢复,才可以对其他节点进行恢复。

在 DPF 中,您可以在一个数据库分区服务器上逐个运行命令,也可以并行运行。您可以使用 db2_all 在所有指定的数据库分区服务器上运行命令。您可以使用 <<-xxx< 和 <<+xxx< 前缀序列限制数据库分区服务器的个数。您可以使用 <<-xxx< 前缀向 DPF 中的所有分区发出命令,除了 xxx 指定的节点外。类似地,您可以使用 '<<+xxx<' 前缀仅向 xxx 指定的分区发出命令。db2_all 可前置下列任务到您的命令中。

 

export DB2NODE=xxxKorn shell 语法)

在此任务中,xxx 是数据库分区号,可以从 db2nodes.cfg 文件中获取,因此,该命令被路由到一个特定数据库分区服务器上。在进行操作时,默认会连接到当前指定的节点进行操作。

 

我们对以下场景进行了测试,用以验证在生产环境中是否可用。

测试场景:

多分区数据库全备

多分区数据库全库恢复

多分区数据库表空间备份

多分区数据库前滚恢复

多分区数据库copy yes 前滚

 

测试软件:

操作系统

AIX 6.1 

备份软件

NBU 7

数据库版本

DB2 9.7.5

数据库

TEST 9分区数据库

 

多分区数据库全备测试

要备份分区数据库,必须要首先在编目分区上调用备份实用程序,然后在其他数据库分区上调用备份实用程序。

 

离线备份命令范例:

对协调节点进行备份:

db2_all "<<+0< db2 BACKUP DB TEST to /data/BACKUPS"

对其他节点进行并行备份(数据库自动进行并行备份操作)

db2_all "|<<-0< db2 BACKUP DB TEST to /data/BACKUPS"

在线备份命令范例:

对协调节点进行备份:

db2_all "<<+0< db2 BACKUP DB TEST ONLINE to /data/BACKUPS"

对其他节点进行并行备份(数据库自动进行并行备份操作)

 

db2_all "|<<-0< db2 BACKUP DB TEST ONLINE to /data/BACKUPS"

备份完成之后对文件验证可以看到类似如下的文件:

TEST.0.db2inst1.NODE0000.CATN0000.20120531103515.001

TEST.0.db2inst1.NODE0007.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0003.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0002.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0001.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0008.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0006.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0005.CATN0000.20120531103528.001

TEST.0.db2inst1.NODE0004.CATN0000.20120531103528.001

其中信息如下:

· TEST:代表的数据库名

· 0:备份操作类型,0 代表完全离线数据库级备份

· inst_test:实例名

· NODE0000:分区号

· CATN0000:目录节点 (syscatspace) 驻留的数据库分区号

· 20120531103528:时间戳

· 001:序列号

使用备份进行全库恢复

当发生数据损坏或者数据丢失,数据库的副本将被用于恢复数据库,至少可以恢复到执行备份操作时数据库的状态。恢复也是数据库升级或者迁移的一部分。在 DPF 中,恢复是一个较为麻烦的操作。如果您正在使用 DPF,那您首先需要恢复目录节点,然后继续恢复其余节点。在示例中,分区 是目录节点。

2.1使用备份本机进行恢复

查询各节点上备份及备份时间戳:

/usr/openv/netbackup/bin/bplist -C TESTDB00 -S SBNBUsvc -t 18 -R /|grep TEST.

/usr/openv/netbackup/bin/bplist -C TESTDB01 -S SBNBUsvc -t 18 -R /|grep TEST.

/usr/openv/netbackup/bin/bplist -C TESTDB02 -S SBNBUsvc -t 18 -R /|grep TEST.

 

生成恢复脚本:

db2_all "<<+0< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170003 redirect generate script /db2home/db2TEST/nbu/r.scr.node0" 

 

db2_all "<<+1< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node1" 

db2_all "<<+2< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node2" 

db2_all "<<+3< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node3" 

db2_all "<<+4< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node4" 

db2_all "<<+5< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node5" 

db2_all "<<+6< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170618 redirect generate script /db2home/db2TEST/nbu/r.scr.node6" 

db2_all "<<+7< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170618 redirect generate script /db2home/db2TEST/nbu/r.scr.node7" 

db2_all "<<+8< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170618 redirect generate script /db2home/db2TEST/nbu/r.scr.node8" 

修改脚本,1-8节点需要加上without prompting,否则会确认是否overwrite db.

 

恢复后,数据处于前滚悬挂状态

$ db2 connect to test

SQL1117N  A connection to or activation of database "TEST" cannot be made

because of ROLL-FORWARD PENDING.  SQLSTATE=57019

 

要解决这个不一致性问题,需要前滚数据库到日志终点,使其达到一致。对于离线备份恢复,如果您在恢复命令中指定 WITHOUT ROLLING FORWARD 选项,那么数据库在成功恢复以后不会置于前滚悬挂状态。对于在线备份恢复,前滚是强制性的。

 

执行数据库恢复:

0分区进行恢复之后才能对其他分区进行并行恢复。

nohup db2_all "<<+0< db2 -tvf /db2home/db2TEST/nbu/r.scr.node0" &

 

nohup db2_all "<<+1< db2 -tvf /db2home/db2TEST/nbu/r.scr.node1" &

nohup db2_all "<<+2< db2 -tvf /db2home/db2TEST/nbu/r.scr.node2" &

nohup db2_all "<<+3< db2 -tvf /db2home/db2TEST/nbu/r.scr.node3" &

nohup db2_all "<<+4< db2 -tvf /db2home/db2TEST/nbu/r.scr.node4" &

nohup db2_all "<<+5< db2 -tvf /db2home/db2TEST/nbu/r.scr.node5" &

nohup db2_all "<<+6< db2 -tvf /db2home/db2TEST/nbu/r.scr.node6" &

nohup db2_all "<<+7< db2 -tvf /db2home/db2TEST/nbu/r.scr.node7" &

nohup db2_all "<<+8< db2 -tvf /db2home/db2TEST/nbu/r.scr.node8" &

 

查询数据库是否处于rollforward pending状态:

db2 rollforward db TEST query status

 

 

                                 Rollforward Status

 

 Input database alias                   = TEST

 Number of nodes have returned status   = 9

 

 Node number  Rollforward                 Next log             Log files processed        Last committed transaction

              status                      to be read

 -----------  --------------------------  -------------------  -------------------------  --------------------------

           0  DB  pending                 S0008054.LOG                     -              2012-02-19-09.06.00.000000 UTC

           1  DB  pending                 S0004320.LOG                     -              2012-02-19-09.09.27.000000 UTC

           2  DB  pending                 S0004268.LOG                     -              2012-02-19-09.10.08.000000 UTC

           3  DB  pending                 S0004685.LOG                     -              2012-02-19-09.10.13.000000 UTC

           4  DB  pending                 S0004247.LOG                     -              2012-02-19-09.10.19.000000 UTC

           5  DB  pending                 S0004195.LOG                     -              2012-02-19-09.10.12.000000 UTC

           6  DB  pending                 S0006033.LOG                     -              2012-02-19-09.09.51.000000 UTC

           7  DB  pending                 S0004492.LOG                     -              2012-02-19-09.09.44.000000 UTC

           8  DB  pending                 S0004382.LOG                     -              2012-02-19-09.09.47.000000 UTC

 

TESTDB00: db2 rollforward db ... completed ok

 

前滚数据库:

 

db2 "rollforward db TEST to end of logs and complete overflow log path

(/db2/db2TEST/db2arc0/logtarget,

/db2/db2TEST/db2arc1/logtarget on dbpartitionnum 1,

/db2/db2TEST/db2arc2/logtarget on dbpartitionnum 2,

/db2/db2TEST/db2arc3/logtarget on dbpartitionnum 3,

/db2/db2TEST/db2arc4/logtarget on dbpartitionnum 4,

/db2/db2TEST/db2arc5/logtarget on dbpartitionnum 5,

/db2/db2TEST/db2arc6/logtarget on dbpartitionnum 6,

/db2/db2TEST/db2arc7/logtarget on dbpartitionnum 7,

/db2/db2TEST/db2arc8/logtarget on dbpartitionnum 8

)"  

 

2.2使用备份异机进行恢复(即重定向恢复)

恢复前准备:

根据原实例信息创建用户和实例,其中实例用户必须和原用户ID保持一致。

创建用户组及用户:

mkgroup -'A' id='1001' db2iadm1

mkuser id=1001 pgrp=db2iadm1 home=/db2home/db2TEST db2TEST (实例用户)

配置RSH到用户db2TEST

$ vi ~/.rhosts

CASHMAPP2 db2TEST

创建实例:

./db2icrt -p db2c_db2TEST -s ese -u db2TEST db2TEST

修改/etc/servicesdb2nodes.cfg文件。

创建数据存储路径保持和原库一致。

 

开始恢复:

查询各节点上备份及备份时间戳:

/usr/openv/netbackup/bin/bplist -C TESTDB00 -S SBNBUsvc -t 18 -R /|grep TEST.

/usr/openv/netbackup/bin/bplist -C TESTDB01 -S SBNBUsvc -t 18 -R /|grep TEST.

/usr/openv/netbackup/bin/bplist -C TESTDB02 -S SBNBUsvc -t 18 -R /|grep TEST.

修改master serverbp.conf,添加异机恢复配置:

FORCE_RESTORE_MEDIA_SERVER=TESTDB00 SBNBUsvc

FORCE_RESTORE_MEDIA_SERVER=TESTDB01 SBNBUsvc

FORCE_RESTORE_MEDIA_SERVER=TESTDB02 SBNBUsvc

生成恢复脚本:

修改db2TEST实例目录下的bp.confCLIENT_NAME参数为TESTDB00,

db2_all "<<+0< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170003 redirect generate script /db2home/db2TEST/nbu/r.scr.node0" 

修改db2TEST实例目录下的bp.confCLIENT_NAME参数为TESTDB01,

db2_all "<<+1< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node1" 

db2_all "<<+2< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node2" 

db2_all "<<+3< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node3" 

db2_all "<<+4< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node4" 

修改db2TEST实例目录下的bp.confCLIENT_NAME参数为TESTDB02,

db2_all "<<+5< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170617 redirect generate script /db2home/db2TEST/nbu/r.scr.node5" 

db2_all "<<+6< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170618 redirect generate script /db2home/db2TEST/nbu/r.scr.node6" 

db2_all "<<+7< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170618 redirect generate script /db2home/db2TEST/nbu/r.scr.node7" 

db2_all "<<+8< db2 restore db TEST load /usr/openv/netbackup/bin/nbdb2.sl64 taken at 20120219170618 redirect generate script /db2home/db2TEST/nbu/r.scr.node8" 

修改脚本,1-8节点需要加上without prompting,否则会确认是否overwrite db.

 

执行数据库恢复:

 

修改db2TEST实例目录下的bp.confCLIENT_NAME参数为TESTDB00,

nohup db2_all "<<+0< db2 -tvf /db2home/db2TEST/nbu/r.scr.node0" &

修改db2TEST实例目录下的bp.confCLIENT_NAME参数为TESTDB01,

nohup db2_all "<<+1< db2 -tvf /db2home/db2TEST/nbu/r.scr.node1" &

nohup db2_all "<<+2< db2 -tvf /db2home/db2TEST/nbu/r.scr.node2" &

nohup db2_all "<<+3< db2 -tvf /db2home/db2TEST/nbu/r.scr.node3" &

nohup db2_all "<<+4< db2 -tvf /db2home/db2TEST/nbu/r.scr.node4" &

修改db2TEST实例目录下的bp.confCLIENT_NAME参数为TESTDB02,

nohup db2_all "<<+5< db2 -tvf /db2home/db2TEST/nbu/r.scr.node5" &

nohup db2_all "<<+6< db2 -tvf /db2home/db2TEST/nbu/r.scr.node6" &

nohup db2_all "<<+7< db2 -tvf /db2home/db2TEST/nbu/r.scr.node7" &

nohup db2_all "<<+8< db2 -tvf /db2home/db2TEST/nbu/r.scr.node8" &

 

查询数据库是否处于rollforward pending状态:

db2 rollforward db TEST query status

 

 

                                 Rollforward Status

 

 Input database alias                   = TEST

 Number of nodes have returned status   = 9

 

 Node number  Rollforward                 Next log             Log files processed        Last committed transaction

              status                      to be read

 -----------  --------------------------  -------------------  -------------------------  --------------------------

           0  DB  pending                 S0008054.LOG                     -              2012-02-19-09.06.00.000000 UTC

           1  DB  pending                 S0004320.LOG                     -              2012-02-19-09.09.27.000000 UTC

           2  DB  pending                 S0004268.LOG                     -              2012-02-19-09.10.08.000000 UTC

           3  DB  pending                 S0004685.LOG                     -              2012-02-19-09.10.13.000000 UTC

           4  DB  pending                 S0004247.LOG                     -              2012-02-19-09.10.19.000000 UTC

           5  DB  pending                 S0004195.LOG                     -              2012-02-19-09.10.12.000000 UTC

           6  DB  pending                 S0006033.LOG                     -              2012-02-19-09.09.51.000000 UTC

           7  DB  pending                 S0004492.LOG                     -              2012-02-19-09.09.44.000000 UTC

           8  DB  pending                 S0004382.LOG                     -              2012-02-19-09.09.47.000000 UTC

 

TESTDB00: db2 rollforward db ... completed ok

 

前滚数据库:

 

db2 "rollforward db TEST to end of logs and complete overflow log path

(/db2/db2TEST/db2arc0/logtarget,

/db2/db2TEST/db2arc1/logtarget on dbpartitionnum 1,

/db2/db2TEST/db2arc2/logtarget on dbpartitionnum 2,

/db2/db2TEST/db2arc3/logtarget on dbpartitionnum 3,

/db2/db2TEST/db2arc4/logtarget on dbpartitionnum 4,

/db2/db2TEST/db2arc5/logtarget on dbpartitionnum 5,

/db2/db2TEST/db2arc6/logtarget on dbpartitionnum 6,

/db2/db2TEST/db2arc7/logtarget on dbpartitionnum 7,

/db2/db2TEST/db2arc8/logtarget on dbpartitionnum 8

)"  

 

3 load copy yes 和 copy yes方式的前滚方法

因为load操作不记录日志,在多分区环境下如果不采用load copy yes方式,在数据库异常之后进行恢复操作,在前滚时有load操作的表将不可用,为了保证数据的安全。我们在多分区环境下也采用load copy yes的方式导入数据。

 

Load copy yes操作

在多分区环境下load copy yes使用的存储路径必须保证每个节点可见,目前TEST采用的是GPFS文件系统,三台服务器可见(/db2/db2TEST/copy_yes)。

Load copy yes 操作举例如下:

load from /db2/db2TEST/backup/temp1.del of del replace into TEST.temp1 copy yes 

to /db2/db2TEST/copy_yes

在导入数据完成之后在目录下会生成类似如下的文件,在数据库恢复前滚时会使用这些备份进行前滚恢复。

TEST.4.db2inst1.NODE0008.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0007.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0006.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0005.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0004.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0003.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0002.CATN0000.20120507165714.001

TEST.4.db2inst1.NODE0001.CATN0000.20120507165714.001

 

Copy yes 方式前滚方法

多分区数据库在恢复数据库完成之后,不能立即的前滚,我们需要从数据库历史记录中查看是否有load 操作在备份时间戳之后。

查看是否有load的命令为:

db2 LIST HISTORY LOAD SINCE 20120507135212 FOR TEST

找到时间戳之后的表之后,在copy yes存储路径找到具体的备份文件。

 

设置全局load recovery 配置文件:

db2_all "db2set DB2LOADREC=/db2/db2TEST/load/loadrec"

修改配置文件,配置内容具体如下:

TIM 20120229095908          --->时间戳

DBP 0                        --->连接分区号

SCH DB2TEST                   --->tabschema

TAB TEMP1                     --->tabname

DAT TEST                       --->database

DB2 db2TEST                    --->instance

BUF NULL                      

SES NULL

TYP L                          --->使用备份介质的连接方式

LOC 8                          --->表所设计的分区数,如下是指定每个分区的归档文件路径

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0008.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0007.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0006.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0005.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0004.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0003.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0002.CATN0000.20120229095908.001

ENT /db2/db2TEST/load/TEST.4.db2TEST.NODE0001.CATN0000.20120229095908.001

 

查看当前数据库是否处于pending状态:

db2 rollforward db TEST query status 

 

                                 Rollforward Status

 

 Input database alias                   = TEST

 Number of nodes have returned status   = 9

 

 Node number  Rollforward                 Next log             Log files processed        Last committed transaction

              status                      to be read

 -----------  --------------------------  -------------------  -------------------------  --------------------------

           0  DB  pending                 S0000001.LOG                     -              2012-02-29-01.57.31.000000 UTC

           1  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.39.000000 UTC

           2  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.42.000000 UTC

           3  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.45.000000 UTC

           4  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.48.000000 UTC

           5  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.51.000000 UTC

           6  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.54.000000 UTC

           7  DB  pending                 S0000005.LOG                     -              2012-02-29-01.57.57.000000 UTC

           8  DB  pending                 S0000005.LOG                     -              2012-02-29-01.58.00.000000 UTC

对数据库进行前滚恢复:

db2 "rollforward db TEST to end of logs and complete "

                                 Rollforward Status

 

 Input database alias                   = TEST

 Number of nodes have returned status   = 9

 

 Node number  Rollforward                 Next log             Log files processed        Last committed transaction

              status                      to be read

 -----------  --------------------------  -------------------  -------------------------  --------------------------

           0  not pending                                      S0000001.LOG-S0000003.LOG  2012-02-29-01.59.11.000000 UTC

           1  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           2  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           3  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           4  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           5  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           6  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           7  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

           8  not pending                                      S0000005.LOG-S0000007.LOG  2012-02-29-01.59.11.000000 UTC

 

 

 本文节选自《数据库与信息治理》,作者:民生银行  王健、翟红波袁春光

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广