Oracle 11g R2 Rman备份与恢复

Oracle 11g R2 Rman备份

 备份与恢复的定义及分类

备份的定义及分类:

         备份就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库副本的磁带或磁盘。通常也将存放于转储设备中的数据库的副本称为原数据库的备份或转储。备份是一份数据副本,从不同的角度分类如下:

从物理与逻辑的角度来分类:

从物理与逻辑的,备份可以分为物理备份和逻辑备份。

物理备份:对数据库操作系统的物理文件(数据文件,控制文件和日志文件)的备份。物理备份又可以分为脱机备份(冷备份)和联机备份(热备份),前者是在关闭数据库的时候进行的,后者是以归档日志的方式对运行的数据库进行备份。可以使用oracle的恢复管理器(RMAN)或操作系统命令进行数据库的物理备份。

逻辑备份:对数据库逻辑组件(如表和存储过程等数据库对象)的备份。逻辑备份的手段很多,如传统的EXP,数据泵(EXPDP),数据库闪回技术等第三方工具,都可以进行数据库的逻辑备份。

从数据库的备份角度分类:

从数据库的备份角度,备份可以分为完全备份增量备份差异备份

完全备份:每次对数据库进行完整备份,当发生数据丢失的灾难时,完全备份无需依赖其他信息即可实现100%的数据恢复,其恢复时间最短且操作最方便。

增量备份:只有那些在上次完全备份或增量备份后被修改的文件才会被备份。优点是备份数据量小,需要的时间短,缺点是恢复的时候需要依赖以前备份记录,出问题的风险较大。

差异备份:备份那些自从上次完全备份之后被修改过的文件。从差异备份中恢复数据的时间较短,因此只需要两份数据---最后一次完整备份和最后一次差异备份,缺点是每次备份需要的时间较长。

恢复的定义及分类

         恢复就是发生故障后,利用已备份的数据文件或控制文件,重新建立一个完整的数据库,恢复分为以下两种类型:

实例恢复:当oracle实例出现失败后,oracle自动进行的恢复

介质恢复:当存放数据库的介质出现故障时所作的恢复。介质恢复又分为完全恢复和不完全恢复

完全恢复:将数据库恢复到数据库失败时的状态。这种恢复是通过装载数据库备份并应用全部的重做日志做到的。

不完全恢复:将数据库恢复到数据库失败前的某一时刻的状态。这种恢复是通过装载数据库备份并应用部分的重做日志做到的。进行不完全恢复后,必须在启动数据库时用resetlogs选项重设联机重做日志。

RMAN的存储类型有三种方式:

1.备份集 默认类型

2.压缩备份集

3.镜像copy

组成每个备份集的每个文件称之为备份片

RMAN备份可以存放在两种位置:

1.目标数据库的控制文件

2.恢复目录中

RMAN备份的优点:

1.RMAN只备份有效数据

2.RMAN可以实现增量备份

 使用RMAN工具

RMAN是oracle的一个重要工具,用于备份和恢复数据文件,归档日志和控制文件,也可以用来执行完全或不完全的数据库恢复。RMAN有3种不同的用户接口,命令行方式,GUI方式(集成在OEM中的备份管理器),API方式(用于集成到第三方的备份软件中),它具有以下特点:

支持在线热备份

支持多级增量备份

支持并行备份、恢复

减少所需要备份量

备份、恢复使用简单

RMAN的组件

target database(目标数据库)

目标数据库就是需要RMAN 对其进行备份与恢复的数据库,RMAN可以备份数据文件,控制文件,归档日志,spfile;

service session(服务器会话)

RMAN启动数据库上的oracle服务器进程,将建立一个与目标数据库的会话,有目标数据库上的服务器进程进行备份、还原、恢复的实际操作。

RMAN Repository(RMAN资料库)

RMAN使用过程中会用到的控制信息,是一些关于备份、归档日志及RMAN活动的元数据

Recovery Catalog(恢复目录)

恢复目录是建立在RMAN恢复目录数据库上的一种schema对象,用于保存RMAN资料库数据。恢复目录是一个可选的组件。RMAN会将资料数据记录在目标数据库的控制文件中,但这样不够安全,因为一旦目标数据库的控制文件损坏就意味着所有的RMAN备份失效。所以建议在单独的一个数据库中建立一个恢复目录另外保存一份资料库数据。

MML(媒体管理库)

MML是第三方工具或软件,用于管理对磁带的读写与文件的跟踪管理。如果你想直接通过RMAN备份到磁带上,就必须配置媒体管理层,媒体管理层的工具和RMAN共同配合完成备份与恢复。

快闪恢复区

快闪恢复区是oracle数据库用于保存所有与恢复相关的文件的默认磁盘位置。这些相关文件包括归档日志,RMAN备份,控制文件自动备份,复用的控制文件和重做日志副本及闪回日志文件。

辅助数据库

在正常使用时,RMAN会与目标数据库一起使用,如果创建了恢复目录数据库,那么也会与恢复目录数据库一起使用。在某些情况下,希望创建辅助数据库。辅助数据库时使用RMAN从目标数据库的备份中创建的新数据库。辅助数据库能够被创建作为备用数据库使用。在数据库发生灾难时,能够在不丢失任何数据及停机时间最短的情况下切换至备用数据库。

创建恢复目录

恢复目录存在于RMAN的目录数据库中,类似于标准的数据库目录,主要包含如下几个部分信息:

备份恢复信息,可以是多个目标数据库

RMAN脚本,可以存储重复使用

关于数据文件和日志文件的备份信息

关于目标数据库的表空间和数据文件信息

RMAN资料库可以存放在目标数据库控制文件里,也可以存放在恢复目录中;

创建恢复目录:用来存储RMAN资料库的。

SQL>create tablespace yy datafile '/opt/oracle/oradata/yy.dbf' size 20m autoextend on next 5m maxsize unlimited;

在恢复目录数据库中创建RMAN用户并授权

SQL>create user lilei identified by oracle default tablespace yy quota unlimited on yy;

 

SQL>grant connect,resource,recovery_catalog_owner to lilei;

 

连接到RMAN恢复目录数据库

 

创建恢复目录

 

提示已经连接到目标数据库、连接到恢复目录数据库

 

 

 

向恢复目录注册数据库ORCL,提示已经启动全部恢复目录的resync,已完成全部的resync。此时就可以使用RMAN的恢复目录对目标数据库进行备份和恢复操作。

 

通道的分配

使用RMAN进行备份和恢复时,必须进行通道的分配,一个通道是RMAN和目标数据库之间的一个连接,通道指定了某种类型的设备用于备份和恢复,RMAN可以使用的通道设备包括磁盘与磁带两种。

通道分配可以自动或手动进行

自动通道配置

RMAN>configure device type disk paralielism 5;

RMAN>configure default device type to disk;

手动通道配置

 RMAN>run

2>{

3>allocate channel ch1 device type disk;

4>allocate channel ch2 device type disk;

5>allocate channel ch3 device type disk;

6>}

可以使用show all命令可以显示已经配置过的有默认值的参数,其中包括通道参数

RMAN>show all;

 备份与恢复的概念与操作

备份集与备份片

备份集(backup set)

备份集是一次备份的集合,它包含本次备份的所有备份片,以oracle专有的格式保存,是一个逻辑数据的集合。

备份片:

一个备份集由若干个备份片组成。每个备份片是一个单独输出文件,一个备份片的大小是有限制的,他的大小不能大于文件系统所支持的文件长度的最大值。

配置备份集文件的格式:

使用backup命令进行备份时,需要明确备份文件的存储路径及文件名称的格式。其路径和格式可以使用FORMAT参数进行统一设置。FORMAT格式由两部分组成:即存储路径和文件名称格式;

如果没有使用FORMAT指定存储路径和文件名称格式,则默认情况下BACKUP所产生的备份集将存储在快闪恢复区中,RMAN自动使用%U来确定文件名称不会被重复。

FORMAT命令格式如下:

FORMAT '格式字符串'

其中格式字符串的文件名称部分可以使用替换变量,例如FORMAT '/BACKUP/YY/%U'.

常用的替换变量如下:

%c : 备份片的拷贝数

%d:数据库名称

%D : 位于该月中的第几天(DD)

%M : 位于该年中第几月(MM)

%F : 一个基于DBID的唯一名称,它的形式为C-DBID-YYYYMMDD-QQ。其中DBID为数据库的DBID,YYYYMMDD为日志,QQ是一个1-256的序列

%n:数据库名称,向右填补到最大8个字符

%u:一个8个字符的名称,它是根据备份集个数与创建时间信息生成的。

%p:该备份集中的备份片号,从1开始到创建的文件数。

%U:系统生成的一个唯一文件名,对于备份片来说,它的含义相当于%u_%p_%c。

%s:备份集的号

%t:备份集时间戳

%T:年月日格式(YYYYMMDD)

备份与恢复命令

backup命令用于备份数据库文件,可以将多个文件、表空间、整个数据库已备份集形式备份到磁盘或磁带上,在RUN命令外使用BACKUP命令,会自动使用自动通道。在RUN命令内使用BACKUP命令,如果定义了手动通道,则优先使用手动定义通道。

使用RMAN备份的数据库也只能使用RMAN提供的恢复命令进行恢复。RMAN的恢复目录中存储了目标数据库的备份信息。RMAN根据恢复目录中的存储信息,自动将数据库同步到某一个数据一致的状态。

RMAN恢复数据库时用到两个命令,即RESTORE和RECOVER。RESTORE命令将备份数据恢复到指定的目录,RECOVER命令对数据库进行同步恢复。

RESTORE命令:由于备份集中的备份片是以专有的RMAN格式存储的,需要使用RESTORE命令进行重建。重建的结果是自动产生目标数据库的物理文件结构。

RECOVER命令:负责把归档日志文件用于重建的数据文件,来完成数据库的同步恢复。在执行RECOVER命令时,RMAN需要读取归档日志。如果没有归档日志,或者数据库运行在非归档模式下,则恢复过程会报错。

举例说明在归档模式下备份与恢复

要用RMAN进行联机备份,数据库必须处于归档模式,恢复目录必须打开,目标数据库进程必须启动,数据库已加载或者打开。

查看数据库是否处于归档模式下:

 

关闭数据库并启动数据库到mount状态

 

使用ALTER DATABASE ARCHIVELOG命令将数据设置为归档模式,并验证数据库的归档模式是否改变

 

备份和恢复整个数据库

 

备份和恢复整个数据库,自动分配通道,FORMAT默认使用%U,备份集存储在数据库快闪恢复区内,备份文件包括数据文件,控制文件,重做日志文件和参数文件

RMAN>backup database;

备份到了快闪恢复区,

 

如果备份整个数据库时要包含归档日志文件,则要加上plus archivelog关键字,delete input的意思是在备份完成后,删除archivelog文件

RMAN>backup database plus archivelog delete input;

 

创建目录/OPT/ORACLE/ORADATA

 

自动分配通道,通过FORMAT制定具体的路径和格式

RMAN>backup database FORMAT '/opt/oracle/oradata/backup/rmanbak/%U';

 

备份文件存储的路径

 

使用手动分配通道,备份数据库的方法:

RMAN>run

2>{

3>allocate channel ch1 device type disk;

4>backup database format '/opt/oracle/oradata/backup/rmanbak/%U';

5>release channel ch1;

6>}

 

备份结果

如何恢复数据库

全库备份的恢复,数据库要在mount状态下执行,删除system01.dbf,使用RMAN恢复

 

此时数据库无法启动了,因为删除了system01.dbf

 

数据库的当前状态,连接RMAN

 

恢复数据库

 

打开数据库

 

 

数据库已经处于OPEN状态了

 

system01.dbf表空间已经被恢复了

 

备份和恢复表空间

备份表空间

 

备份USERS表空间

RMAN>backup tablespace users;

 

备份多个表空间

RMAN>backup filesperset=3 tablespace users,system,sysaux;

 

在RUN命令中备份表空间

RMAN>run

2>{

3>allocate channel ch1 device type disk;

4>backup format '/opt/oracle/oradata/backup/rmanbak/%U' (tablespaceusers,system,sysaux);

5>release channel ch1;

6>}

 

如果只丢失了特定的表空间的数据文件,那么可以选择只恢复这个表空间,而不是恢复整个数据库,表空间恢复可以在不关闭数据库的情况下进行,只需要将需要恢复的表空间offline

模拟删除表空间

 

恢复被删除的表空间

 

已经恢复了users01.dbf

 

备份数据文件2

 

备份sysaux01.dbf

 

查看当前系统中的数据文件

 

删除数据文件sysaux01.dbf

 

对数据文件或表空间做恢复的时候数据文件和表空间一定要处于offline状态, 数据文件丢失了,但数据库实例还可以用,

 

此时数据文件sysaux01.dbf的状态为RECOVER

 

恢复数据文件sysaux01.dbf

 

将数据文件datafile 2处于online状态

 

查看数据文件的状态,已经变成online状态了

 

使用数据泵技术实现逻辑备份

逻辑备份概述

逻辑备份时创建数据库对象的逻辑副本,并存入一个二进制转储文件的过程。从本质上来讲逻辑备份与恢复实际就是对数据库事实数据的导入和导出。

导出:

导出就是数据库的逻辑备份,实质是读取一个数据库记录并将这个记录集写入一个文件(扩展名通常是dmp),这些记录的导出与物理位置无关

导入:

导入即数据库的逻辑恢复,实质是读取被导出的二进制转储文件并将其恢复到数据库。

使用数据泵技术导入/导出

数据泵(DATA PUMP)是一种在数据库之间或在数据库与操作系统之间高速传输数据的技术。数据泵工具运行在服务器上,数据库管理员需要指定数据库目录来保存转储的数据。

连接oracle 数据库

 

创建一个操作目录

 

授予用户操作dump_dir目录的权限

 

使用EXPDP命令导出数据(可以按照表导出,按照用户模式导出,按照表空间导出和全库导出),使用IMPDP命令导入数据(可以按照表导入,按照用户模式导入,按照表空间导出和全库导入)。

使用基于命令行的数据泵技术对数据库实施导入和导出。

SQL>col DIRECTORY_NAME for a20

SQL>col DIRECTOR_PATH for a60

SQL>col OWNER for a8

 

创建测试用户tom并授权

 

导出SCOTT用户下的emp和dept表

[oracle@dbserver~]$ expdp scott/oracle directory=dump_dir dumpfile=scotttab.dmp tables=emp,dept

 

以SCOTT用户连接,删除SCOTT用户下的EMP表

 

导入emp表

[oracle@dbserver~]$ impdp scott/oracle directory=dump_dir dumpfile=scotttab.dmp tables=emp

 

emp表已经导入成功了。

 

将导出的SCOTT用户下的DEPT表和EMP表导入到tom用户下

[oracle@dbserver~]$ impdp system/oracle11g directory=dump_dir dumpfile=scotttab.dmptables=scott.emp,scott.dept REMAP_SCHEMA=SCOTT:TOM

 

查看导入的结果,使用tom用户连接

 

导出表空间

 

在xx表空间上创建一个表aa,并为表插入记录

 

导出表空间

 

删除表空间xx的同时删除数据文件

 

aa表没有了。

 

导入表空间

导入表空间之前,需要创建一个xx表空间

 

导入表空间xx

 

验证,aa表恢复回来了。

 

导出全库

 

[oracle@dbserverorcl]$ expdp system/oracle11g directory=dump_dir dumpfile=full.dmp full=y

 

导入全库

[oracle@dbserverorcl]$ impdp system/oracle11g directory=dump_dir dumpfile=full.dmp full=y

 

使用闪回技术

为了使数据库能够从任何逻辑错误中迅速恢复,oracle推出了闪回技术。采用该技术,可以对行级和事物级的数据变化进行恢复,减少了数据恢复的时间,而且操作简单。通过SQL语句就可以实现数据的恢复,大大提高了数据库恢复的效率。闪回技术是数据库恢复技术历史上一次重大的进步,从根本上改变了数据恢复。

闪回技术包括以下各项:

闪回查询:(FLASHBACK QUERY):查询过去某个时间点或某个SCN值时表中的数据信息

闪回版本查询(FLASHBACK Version query):查询过去某个时间段或某个SCN段内表中数据变化的情况。

闪回事物查询(FLASHBACK Transaction Query):查看某个事物或所有事物在过去一段时间对数据进行的修改。

闪回数据库(FLASHBACK Database):将数据库恢复到过去某个时间点或某个SCN值时的状态

闪回删除(FLASHBACK drop):将已经删除的表及其关联的对象恢复到删除前的状态。

闪回表(FLASHBACK table):将表恢复到过去的某个时间点或某个SCN值时的状态。

SCN是当oracle数据库更新后,有DBMS自动维护而累积递增的一个数字。可以通过查询数据字典V$DATABASE中的CURRENT_SCN获得当前的SCN号。

闪回恢复区的含义

oracle推荐指定一个闪回恢复区(FLASHRECOVERY AERA)作为存放备份与恢复相关的默认位置,这样ORACLE就可以实现自动的基于磁盘的备份与恢复。闪回恢复区是一块用来存储恢复相关的文件的存储空间,允许用户集中存储所有恢复相关的文件。以下几种文件可以存放在闪回恢复区。

控制文件

归档日志文件

闪回日志

控制文件和SPFILE自动备份

RMAN备份集

数据文件拷贝

闪回恢复区主要通过以下3个初始化参数来设置和管理

db_recovery_file_dest:指定闪回恢复区的位置

db_recovery_file_dest_size:指定闪回恢复区的可用空间

db_flashback_retention_target:该参数用来控制闪回日志中数据保留的时间,或者说,希望闪回数据库能够恢复到的最早的时间点。单位为min,默认是1440min,即一天。当然实际上可回退的时间还取决于闪回恢复区的大小,因为里面保存了回退所需要的闪回日志,所以这个参数要和db_recovery_file_dest_size配合修改。

如果要撤销闪回恢复区,把初始化参数DB_RECOVERY_FILE_DEST的值清空。

db_recovery_file_dest_size只有在DB_RECOVERY_FILE_DEST清空之后才可以清空

 设置闪回数据库

设置了闪回恢复区,要启动闪回数据库功能,还需要进一步配置,数据必须处于归档模式,在设置闪回数据库

数据库已经处于归档模式:

 

数据库未启用闪回数据库

 

建立闪回区域

 

设置闪回数据库的数据保留周期为一天以min为单位

 

启用闪回日志

 

查询是否成功启用闪回恢复区

 

查询是否成功启用闪回数据库

 

闪回数据库

闪回数据库能够使数据迅速的回滚到以前的某个时间点或者某个SCN上,这对数据库从逻辑错误中恢复特别有用。而且也是大多数发生逻辑损坏时恢复数据库最佳的选择。

使用SCN闪回数据库

查看数据库系统当前SCN

 

改变数据库当前状态,模拟创建表TEST10,并插入一条记录

 

进行闪回数据库恢复,将数据库恢复到创建表之前的状态,即SCN为1238544

 

用RESETLOGS选项打开数据库

 

验证数据库的状态,TEST10表不存在。

 

查询数据库中当前最早的闪回SCN和时间

 

按照指定时间闪回数据库

查询数据库中当前时间和当前SCN

 

改变数据库的当前状态,模拟创建表test11,并插入1条记录

 

进行闪回数据库恢复,将数据库恢复到创建表之前的状态。

使用RESETLOGS打开数据库

 

验证数据库的状态test11表是否存在。

 

闪回数据库操作的限制:

 数据文件损坏或丢失等介质故障不能使用闪回数据库进行恢复。闪回数据库只能基于当前正常运行的数据文件

闪回数据库功能启动后,如果发生数据控制文件重建或利用备份恢复控制文件,则不能使用闪回数据库

不能使用闪回数据库进行数据文件收缩操作

不能使用闪回数据库将数据库恢复到在闪回日志中可获得的最早的SCN之前的SCN,因为闪回日志文件在一定的条件下被删除,而不是始终保存在闪回恢复区中

 

闪回表

         闪回表是将表恢复到过去的某个时间点或者指定的SCN而不用恢复数据文件,为DBA提供了一种在线、快速、便捷的恢复方式,可以恢复对表进行的修改、删除、插入等错误的操作。

         利用闪回表技术恢复表中的数据的过程,实际上是对表进行DML操作的过程。oracle自动维护与表相关联的索引、触发器、约束等。

为了使用数据库闪回功能,必须满足下列条件

用户具有FALSHBACKANY TABLE系统权限,或者具有所操作表的FLASHBACK对象权限

用户具有所操作表的SELECT/INSERT/DELETE/ALTER对象权限

启动被操作表的ROW MOVEMENT特性,可以采用下列方式进行:

SQL> ALTER TABLE 表名 ENABLE ROWMOVEMENT;

闪回表语法格式:

FLASHBACK TABLE [schema].table TO SCN |TIMESTAMP expression [ENABLE|DISABLE TRIGGERS]

参数说明:

SCN:将表恢复到指定的SCN时的状态

TIMESTAMP:将表恢复到指定额时间点

ENABLE|DISABLETRIGGERS:在恢复表中数据的过程中,表上的触发器时禁用还是激活(默认是引用)

举例说明:

使用SCOTT用户登录

 

创建表,插入记录,提交事物

 

查询当前SCN号,如果当前用户没有权限查询v$database,则以sys用户登录,授予当前用户访问数据字典的权限。

 

更新记录,并提交事物

 

查看表中的记录

 

删除ID=3的记录

 

启动test01表的ROW MOVEMENT特性

 

将test01表恢复到2015-11-22 05:44:48时刻的状态

 

将test01表恢复到SCN为1240503的状态。

 

闪回删除

闪回删除可以恢复使用DROP table语句删除的表,是一种对意外删除的表恢复机制。闪回删除的功能的实现主要是通过oracle数据库中的“回收站”技术实现的。在oracle数据库中,当执行DROP table操作时,并不立即收回表及其关联对象的空间,而是将他们重命名后放入一个称为“回收站”的逻辑容器中保存,直到用户决定永久删除他们或存储该表的表空间或存储空间不足时,表才真正被删除,为了使用数据库的闪回删除技术,必须开启数据库的“回收站”

启动“回收站”将参数RECYCLEBIN设置为ON,在默认情况下“回收站”已经启动

 

如果没有启动可以使用:

 

查看回收站。当执行DROP table 时,表及关联的对象被命名后保存在“回收站”中,可以通过查询USER_RECYCLEBIN DBA_RECYCLEBIN视图获得被删除的表及其关联对象。

 

通过USER_RECYCLEBIN查看被删除的表

 

不支持sys用户和system用户,这两个用户下的表被删除之后,无法从回收站里拿到,查询时为“空”

 

如果删除表的时候使用了PURGE短语,则表及其关联对象呗直接释放,空间被回收,相关信息不会进入“回收站”中

 

清空回收站,由于被删除的表级其关联对象信息保存在“回收站”中,其存储空间并没有释放,因此需要定期清空“回收站”。或清除“回收站”中没有用的对象(表,索引,表空间)释放其所占用的磁盘空间

语法如下:

PURGE [TABLE 表名 | INDEX index]

[RECYCLEBIN | DBA_RECYCLEBIN] | [TABLESPACEtablespace [USER user]]

参数说明:

TABLE:从回收站中清除指定的表

INDEX:从回收站中清除指定的索引,并回收其磁盘空间

RECYCLEBIN:清空用户“回收站”,并回收所有对象的磁盘空间

DBA_RECYCLEBIN:清空整个数据库系统的“回收站”,只有具有SYSDBA权限的用户才可以使用

TABLESPACE :清除“回收站”中指定额表空间,并回收磁盘空间

USER:清除回收站中指定表空间中特定用户的对象,并回收磁盘空间

 

闪回删除操作,闪回删除的基本语法

FLASHBACK TABLE [schema.]table to BEFOREDROP [RENAME TO table]

 

闪回删除

 

闪回删除举例说明:

 

需要注意:只有本地管理的,非系统表空间中的表可以使用闪回删除操作。

 闪回查询

允许根据时间点timestamp或SCN查看就的数据,除了可以查看旧数据,需要时可以通过检索旧数据来撤销错误的更改。

使用SCOTT用户登录,对EMP表基于AS of TIMESTAMP的闪回查询

SQL> show user;

USER is "SCOTT"

 

更新员工号为7900的工资,更新为2000,并提交事物

 

更新员工号为7900的工资,更新两次,提交事物。

 

更新员工号为7900的工资,更新为3500,并提交事物

 

查看7900号员工的更新后工资。

查询7900号员工前一个小时的工资是多少

 

查询第一个事物提交,第二个事物还没有提交时7900员工的工资

查询第二个事物提交,第三个事物还没有提交时的7900号员工的工资

如果需要,可以将数据恢复到过去某个时刻的状态。

 

如果对此有兴趣,请扫下面二维码免费获取更多详情

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页