单实例数据库迁移到RAC

一.准备工作

因为要完全恢复,所以在拿到除数据库的备份片外,还要拿备份后时间跑出的归档文件,当然,还要拿到最后一个curren日志组的归档。当然如果做不完全恢复的话,不需要current日志组的归档也是可以的。

注:因为我的本次实验是在rac下,已经有数据库后,删除后模拟做的迁移,所以有些小细节可能不同,不过原理都是一样的。

1.环境:数据库 11.2.0.4 Linux:centos 6.5

2.RAC配置

--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.FRA.dg
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.LISTENER.lsnr
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.asm
               ONLINE  ONLINE       hua1                     Started            
               ONLINE  ONLINE       hua2                     Started            
ora.gsd
               OFFLINE OFFLINE      hua1                                        
               OFFLINE OFFLINE      hua2                                        
ora.net1.network
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.ons
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       hua1                                        
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       hua2                                        
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       hua2                                        
ora.cvu
      1        ONLINE  ONLINE       hua2                                        
ora.hua1.vip
      1        ONLINE  ONLINE       hua1                                        
ora.hua2.vip
      1        ONLINE  ONLINE       hua2                                        
ora.oc4j
      1        ONLINE  ONLINE       hua2                                        
ora.scan1.vip
      1        ONLINE  ONLINE       hua1                                        
ora.scan2.vip
      1        ONLINE  ONLINE       hua2                                        
ora.scan3.vip
      1        ONLINE  ONLINE       hua2  

二.目标端数据恢复

2.1 在节点1上创建所需目录

[oracle@hua1 ~]$ mkdir -p /u01/app/oracle/admin/PROD1/adump

[oracle@hua1 ~]$ mkdir -p /u01/app/oracle/archivelog

[oracle@hua1 ~]$ mkdir -p /u01/app/oracle/oradata/PROD1

[oracle@hua1 ~]$ mkdir -p /u01/app/oracle/backup

2.2 拷贝源数据库的备份片、归档文件和最后一个redo.log

2.3 新建参数文件 vim initPROD1.ora

PROD2.__db_cache_size=272629760
PROD1.__db_cache_size=310378496
PROD2.__java_pool_size=4194304
PROD1.__java_pool_size=4194304
PROD2.__large_pool_size=8388608
PROD1.__large_pool_size=71303168
PROD1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
PROD2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
PROD2.__pga_aggregate_target=335544320
PROD1.__pga_aggregate_target=310378496
PROD2.__sga_target=503316480
PROD1.__sga_target=528482304
PROD2.__shared_io_pool_size=0
PROD1.__shared_io_pool_size=0
PROD2.__shared_pool_size=209715200
PROD1.__shared_pool_size=134217728
PROD2.__streams_pool_size=0
PROD1.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/PROD1/adump'
*.audit_trail='db'
*.cluster_database=false
*.compatible='11.2.0.4.0'
*.control_files='+DATA/prod1/controlfile/current.258.991842525'#Restore Controlfile
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_name='PROD1'
*.db_recovery_file_dest='+FRA'
*.db_recovery_file_dest_size=4621074432
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=PRODXDB)'
PROD2.instance_number=2
PROD1.instance_number=1
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=838860800
*.open_cursors=300

注:等数据库恢复完毕后,再把luster_database设置为true。

2.4 用pfile文件创建spfile文件

2.4.1启动数据库

[oracle@hua1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Sat Nov 10 19:32:27 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount pfile='/home/oracle/initPROD1.ora'
;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size      2257840 bytes
Variable Size    520096848 bytes
Database Buffers   310378496 bytes
Redo Buffers      2371584 bytes

SQL> create spfile='+DATA' from pfile='/home/oracle/initPROD1.ora'
  2  ;

File created.

SQL> shutdown abort;  
ORACLE instance shut down.

 2.5 将所有节点上的pfile中 写上路径指到spfile

2.5.1 查看spfile在ASM磁盘组中的位置

[root@hua1 ~]# su - grid
[grid@hua1 ~]$ asmcmd
ASMCMD> ls
DATA/
FRA/
ASMCMD> cd data
ASMCMD> ls
PROD1/
hua-cluster/
ASMCMD> cd PROD1
ASMCMD> ls
PARAMETERFILE/
ASMCMD> cd PAREMETERFILE
ASMCMD-8002: entry 'PAREMETERFILE' does not exist in directory '+data/PROD1/'
ASMCMD> cd PARAMETERFILE
ASMCMD> ls
spfile.258.991856479
ASMCMD> pwd
+data/PROD1/PARAMETERFILE

2.5.2 把pfile中路径指向spfile

[oracle@hua1 dbs]$ vim initPROD1.ora
[oracle@hua1 dbs]$ cat initPROD1.ora
spfile='+data/PROD1/PARAMETERFILE/spfile.258.991856479'

[oracle@hua2 dbs]$ vim initPROD2.ora
[oracle@hua2 dbs]$ cat initPROD2.ora
spfile='+data/PROD1/PARAMETERFILE/spfile.258.991856479'

2.6 创建口令文件 

[oracle@hua1 dbs]$ orapwd file=orapwPROD1 password=oracle
[oracle@hua1 dbs]$ ls
hc_PROD1.dat  init.ora  initPROD1.ora  orapwPROD1

[oracle@hua2 dbs]$ orapwd file=orapwPROD1 password=oracle
[oracle@hua2 dbs]$ ls
hc_PROD2.dat  init.ora  initPROD1.ora  orapwPROD1

2.7 还原控制文件

2.7.1 修改控制文件位置

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size      2257840 bytes
Variable Size    520096848 bytes
Database Buffers   310378496 bytes
Redo Buffers      2371584 bytes
SQL> show parameter control_file

NAME         TYPE
------------------------------------ ----------------------
VALUE
------------------------------
control_file_record_keep_time      integer
7
control_files        string
+DATA/prod1/controlfile/curren
t.258.991842525
SQL> alter system set control_files='+DATA' scope=spfile sid='*';

System altered.

SQL> startup force nomount;
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size      2257840 bytes
Variable Size    520096848 bytes
Database Buffers   310378496 bytes
Redo Buffers      2371584 bytes

 2.7.2 恢复控制文件

[oracle@hua1 dbs]$ rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on Sat Nov 10 20:09:43 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: PROD1 (not mounted)

RMAN> restore controlfile from '/home/oracle/back/o1_mf_s_991757598_fybjdz2g_.bkp';

Starting restore at 2018-11-10 20:11:56
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=31 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=+DATA/prod1/controlfile/current.267.991858317
Finished restore at 2018-11-10 20:11:58

2.8 恢复数据文件 

2.8.1 反注册备份信息

RMAN> alter database mount;

database mounted
released channel: ORA_DISK_1

RMAN> list backup;

specification does not match any backup in the repository

RMAN> catalog start with '/home/oracle/back';

searching for all files that match the pattern /home/oracle/back

List of Files Unknown to the Database
=====================================
File Name: /home/oracle/back/o1_mf_1_167_fybht5sz_.arc
File Name: /home/oracle/back/o1_mf_1_164_fyb47n6c_.arc
File Name: /home/oracle/back/o1_mf_1_160_fy9x5kcv_.arc
File Name: /home/oracle/back/redo03.log
File Name: /home/oracle/back/o1_mf_1_166_fybht3v4_.arc
File Name: /home/oracle/back/o1_mf_s_991757598_fybjdz2g_.bkp
File Name: /home/oracle/back/o1_mf_1_171_fybjnhdq_.arc
File Name: /home/oracle/back/o1_mf_1_170_fybjnf1z_.arc
File Name: /home/oracle/back/o1_mf_1_168_fybjn7gb_.arc
File Name: /home/oracle/back/o1_mf_nnndf_TAG20181109T160911_fybj589n_.bkp
File Name: /home/oracle/back/o1_mf_1_163_fyb46lho_.arc
File Name: /home/oracle/back/o1_mf_1_165_fyb8ncdt_.arc
File Name: /home/oracle/back/o1_mf_1_162_fy9xhp96_.arc
File Name: /home/oracle/back/o1_mf_1_158_fy9x5ddn_.arc
File Name: /home/oracle/back/o1_mf_1_161_fy9x5lrh_.arc
File Name: /home/oracle/back/o1_mf_1_159_fy9x5got_.arc
File Name: /home/oracle/back/o1_mf_1_169_fybjn8mr_.arc

Do you really want to catalog the above files (enter YES or NO)? yes
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /home/oracle/back/o1_mf_1_167_fybht5sz_.arc
File Name: /home/oracle/back/o1_mf_1_164_fyb47n6c_.arc
File Name: /home/oracle/back/o1_mf_1_160_fy9x5kcv_.arc
File Name: /home/oracle/back/o1_mf_1_166_fybht3v4_.arc
File Name: /home/oracle/back/o1_mf_s_991757598_fybjdz2g_.bkp
File Name: /home/oracle/back/o1_mf_1_171_fybjnhdq_.arc
File Name: /home/oracle/back/o1_mf_1_170_fybjnf1z_.arc
File Name: /home/oracle/back/o1_mf_1_168_fybjn7gb_.arc
File Name: /home/oracle/back/o1_mf_nnndf_TAG20181109T160911_fybj589n_.bkp
File Name: /home/oracle/back/o1_mf_1_163_fyb46lho_.arc
File Name: /home/oracle/back/o1_mf_1_165_fyb8ncdt_.arc
File Name: /home/oracle/back/o1_mf_1_162_fy9xhp96_.arc
File Name: /home/oracle/back/o1_mf_1_158_fy9x5ddn_.arc
File Name: /home/oracle/back/o1_mf_1_161_fy9x5lrh_.arc
File Name: /home/oracle/back/o1_mf_1_159_fy9x5got_.arc
File Name: /home/oracle/back/o1_mf_1_169_fybjn8mr_.arc

List of Files Which Where Not Cataloged
=======================================
File Name: /home/oracle/back/redo03.log
  RMAN-07529: Reason: catalog is not supported for this file type

 2.8.1 修改日志组位置

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD1/redo03.log
/u01/app/oracle/oradata/PROD1/redo02.log
/u01/app/oracle/oradata/PROD1/redo01.log

SQL> alter database rename file '/u01/app/oracle/oradata/PROD1/redo03.log' to '+DATA';

Database altered.

SQL> alter database rename file '/u01/app/oracle/oradata/PROD1/redo02.log' to '+DATA';

Database altered.

SQL> alter database rename file '/u01/app/oracle/oradata/PROD1/redo01.log' to '+DATA';

Database altered.

2.8.2 还原数据文件

RMAN> run{
2> set newname for database to '+DATA';
3> restore database;
4> switch datafile all;
5> }

executing command: SET NEWNAME

Starting restore at 2018-11-10 20:36:39
using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to +DATA
channel ORA_DISK_1: restoring datafile 00002 to +DATA
channel ORA_DISK_1: restoring datafile 00003 to +DATA
channel ORA_DISK_1: restoring datafile 00004 to +DATA
channel ORA_DISK_1: restoring datafile 00005 to +DATA
channel ORA_DISK_1: restoring datafile 00006 to +DATA
channel ORA_DISK_1: reading from backup piece /home/oracle/back/o1_mf_nnndf_TAG20181109T160911_fybj589n_.bkp
channel ORA_DISK_1: piece handle=/home/oracle/back/o1_mf_nnndf_TAG20181109T160911_fybj589n_.bkp tag=TAG20181109T160911
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:02:55
Finished restore at 2018-11-10 20:39:37

datafile 1 switched to datafile copy
input datafile copy RECID=11 STAMP=991859979 file name=+DATA/prod1/datafile/system.260.991859801
datafile 2 switched to datafile copy
input datafile copy RECID=12 STAMP=991859979 file name=+DATA/prod1/datafile/sysaux.272.991859803
datafile 3 switched to datafile copy
input datafile copy RECID=13 STAMP=991859980 file name=+DATA/prod1/datafile/undotbs1.271.991859803
datafile 4 switched to datafile copy
input datafile copy RECID=14 STAMP=991859981 file name=+DATA/prod1/datafile/users.268.991859803
datafile 5 switched to datafile copy
input datafile copy RECID=15 STAMP=991859982 file name=+DATA/prod1/datafile/example.270.991859803
datafile 6 switched to datafile copy
input datafile copy RECID=16 STAMP=991859983 file name=+DATA/prod1/datafile/vastdata.269.991859803

 三.开机

最激动人心的时刻到了,参数文件、控制文件、数据文件我们都已经恢复了,所以,我们要跑归档了

RMAN> recover database;

Starting recover at 2018-11-10 20:43:45
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 168 is already on disk as file /home/oracle/back/o1_mf_1_168_fybjn7gb_.arc
archived log for thread 1 with sequence 169 is already on disk as file /home/oracle/back/o1_mf_1_169_fybjn8mr_.arc
archived log for thread 1 with sequence 170 is already on disk as file /home/oracle/back/o1_mf_1_170_fybjnf1z_.arc
archived log for thread 1 with sequence 171 is already on disk as file /home/oracle/back/o1_mf_1_171_fybjnhdq_.arc
archived log file name=/home/oracle/back/o1_mf_1_168_fybjn7gb_.arc thread=1 sequence=168
archived log file name=/home/oracle/back/o1_mf_1_169_fybjn8mr_.arc thread=1 sequence=169
archived log file name=/home/oracle/back/o1_mf_1_170_fybjnf1z_.arc thread=1 sequence=170
archived log file name=/home/oracle/back/o1_mf_1_171_fybjnhdq_.arc thread=1 sequence=171
unable to find archived log
archived log thread=1 sequence=172
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 11/10/2018 20:43:54
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 172 and starting SCN of 2648979

 这个时候呢,如果做不完全恢复,或者没有拿到current日志组的归档文件,用这个scn值,做不完全恢复

用命令 recover database using backup until scn 值; alter database open resetlogs; 是可以开启数据库的

不过,要做完全恢复

SQL> recover database using backup controlfile until cancel;
ORA-00279: change 2648979 generated at 11/09/2018 16:17:19 needed for thread 1
ORA-00289: suggestion : +FRA
ORA-15173: entry 'ARCHIVELOG' does not exist in directory 'PROD1'
ORA-00280: change 2648979 for thread 1 is in sequence #172


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/home/oracle/back/redo03.log
Log applied.
Media recovery complete.
SQL> alter database open resetlogs;

Database altered.

四.配置数据库参数

4.1 查看数据情况

SQL> col value for a10
SQL> select * from v$option where parameter='Real Application Clusters';
PARAMETER        VALUE
----------------------------------------------- ----------
Real Application Clusters      TRUE

SQL> show parameter cluster
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
cluster_database       boolean  FALSE
cluster_database_instances      integer  1
cluster_interconnects       string

SQL> show parameter thread
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
parallel_threads_per_cpu      integer  2
thread         integer  1

SQL> show parameter instance_number
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
instance_number        integer  1

SQL> alter system set cluster_database=true scope=spfile sid='*';
System altered.

SQL> alter system set cluster_database_instances=2 scope=spfile sid='*';
System altered.

SQL> alter system set instance_number=1 scope=spfile sid='hua1';
System altered.

SQL> alter system set instance_number=2 scope=spfile sid='hua2';
System altered.

SQL> alter system set thread=1 scope=spfile sid='hua1';
System altered.

SQL> alter system set thread=2 scope=spfile sid='hua2';
System altered.

SQL> show parameter undo_tablespace
NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace        string  UNDOTBS1

SQL> create undo tablespace UNDOTBS2 datafile '+DATA/wxqyh/datafile/undotbs02.dbf' size 100M;
Tablespace created.

SQL> alter system set undo_tablespace='UNDOTBS2' scope=spfile sid='hua2';
System altered.

SQL> alter database add logfile thread 2 group 4 ('+DATA','+FRA') size 50M;
Database altered.

SQL> alter database add logfile thread 2 group 5 ('+DATA','+FRA') size 50M;
Database altered.

SQL> alter database add logfile thread 2 group 6 ('+DATA','+FRA') size 50M;
Database altered.

注:根据实际情况分配日志文件大小,可以增加日志组文件
    alter database add logfile member '+FRA' to group 4;

SQL> alter database enable thread 2;
Database altered

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

 4.2 将信息注册到CRS里

[oracle@hua1 ~]$ srvctl add database -d PROD1 -o $ORACLE_HOME -p +data/PROD1/PARAMETERFILE/spfile.265.992007825[oracle@hua1 ~]$ srvctl add instance -d PROD1 -i PROD1 -n hua1
[oracle@hua1 ~]$ srvctl add instance -d PROD1 -i PROD2 -n hua2
[oracle@hua1 ~]$ srvctl start database -d PROD1 -o open

4.3 确定实例情况

[oracle@hua1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Mon Nov 12 14:44:34 2018

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options


SQL> select instance_number,instance_name,host_name from gv$instance;

INSTANCE_NUMBER INSTANCE_NAME      HOST_NAME
--------------- -------------------- ----------
       1 PROD1       hua1.us.or
         acle.com

       2 PROD2       hua2

4.4 执行catclust.sql脚本创建相关视图

SQL> @$ORACLE_HOME/rdbms/admin/catclust.sql

4.5  重建temp表空间

SQL> alter tablespace temp add tempfile '+DATA' size 100M;

Tablespace altered.

SQL> select name from v$tempfile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/PROD1/temp01.dbf
+DATA/prod1/tempfile/temp.263.992011789

重启数据库删除原表空间

[oracle@hua1 db_1]$ srvctl stop database -d PROD1 -o immediate
[oracle@hua1 db_1]$ srvctl start database -d PROD1 -o open

SQL> alter database tempfile '/u01/app/oracle/oradata/PROD1/temp01.dbf' drop including datafiles;

Database altered.

五.验证数据库及集群情况

5.1查看数据库的状态

[oracle@hua1 dbs]$ srvctl status database -d PROD1
Instance PROD1 is running on node hua1
Instance PROD2 is running on node hua2

5.2查看数据的配置情况

[oracle@hua1 dbs]$ srvctl config database -d PROD1
Database unique name: PROD1
Database name:
Oracle home: /u01/app/oracle/product/11.2.0/db_1
Oracle user: oracle
Spfile: +data/PROD1/PARAMETERFILE/spfile.265.992007825
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: PROD1
Database instances: PROD1,PROD2
Disk Groups: DATA,FRA
Mount point paths:
Services:
Type: RAC
Database is administrator managed

5.3查看集群配置

[root@hua1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.FRA.dg
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.LISTENER.lsnr
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.asm
               ONLINE  ONLINE       hua1                     Started            
               ONLINE  ONLINE       hua2                     Started            
ora.gsd
               OFFLINE OFFLINE      hua1                                        
               OFFLINE OFFLINE      hua2                                        
ora.net1.network
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
ora.ons
               ONLINE  ONLINE       hua1                                        
               ONLINE  ONLINE       hua2                                        
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       hua1                                        
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       hua2                                        
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       hua2                                        
ora.cvu
      1        ONLINE  ONLINE       hua2                                        
ora.hua1.vip
      1        ONLINE  ONLINE       hua1                                        
ora.hua2.vip
      1        ONLINE  ONLINE       hua2                                        
ora.oc4j
      1        ONLINE  ONLINE       hua2                                        
ora.prod1.db
      1        ONLINE  ONLINE       hua1                     Open               
      2        ONLINE  ONLINE       hua2                     Open               
ora.scan1.vip
      1        ONLINE  ONLINE       hua1                                        
ora.scan2.vip
      1        ONLINE  ONLINE       hua2                                        
ora.scan3.vip
      1        ONLINE  ONLINE       hua2

[root@hua1 ~]# olsnodes -s
hua1 Active
hua2 Active

猜你喜欢

转载自blog.csdn.net/cxy_sakura/article/details/83930523