DG知识点记录

 一、搭建操作

alter databaes recover managed standby database disconnect from session
此时备库是归档日志传输,所以需要在主库进行alter system switch logfile

若再执行一次alter database recover managed standby database disconnect from session.此时数据库的状态为read only with apply.主库传输文件时只需要commit就可以在备库更新数据。因为commit触发写日志LGWR进程,会将操作记录到日志文件。于是触发备库接受日志流文件,备库获取sql文件后,将数据文件进行更新。此时,因为传输的不是归档文件,所以不需要切归档,commit之后就可以在备库更新数据。

alter database recover managed standby database cancel;


二、物理备库与逻辑备库

物理备库

redo apply:将传过来的redo应用到备库的数据块进行更新数据

逻辑备库

sql apply:将传过来的redo转化为SQL语句,备库执行sql进行更新数据

三、三种保护模式

最大保护:保证主备完全一样。zero data loss.事务两边提交完成,才算任务完成。sync 同步

最大可用:和从库连接正常,运行方式等同最大保护模式;和从库失去联系时,切到最大性能,保证主库最大可用   sync

最大性能:主库把归档日志通过arch进程传递给从库,在这种方式下,主库性能最高,但不能保证数据不丢失。可通过手工切换日志的方式减小数据丢失  async


四、备库pfile参数详解

1.与角色无关的参数

1.1
db_unique_name:数据库唯一名。对于物理standby,db_name必须相同,对于逻辑standby,db_name可以不同,在10g中引入db_unique_name参数来区分DG配置中的每个数据库,

1.2
log_archive_config:定义DG配置中包含的DB_UNIQUE_NAME,它为DG提供安全检查:数据库之间的连接时允许的。前后顺序是没有区别的。

例子:
log_archive_config='dg_config=(stephen,standby)'

1.3
log_archive_max_processes:最大归档进程数。默认为2,最大可调为10.若太大,会影响归档切换速度和一致性关闭数据库。遇到归档传输瓶颈,最大建议值,最佳实践值


2 角色相关参数

2.1 log_archive_dest_n

log_archive_dest_n:DG传输redo data的主要参数,还用于指定online redo和standby redo的归档日志文件存储位置。一般用log_archive_dest_1指定本地归档目录,log_archive_dest_2指定DG传输redo data存储目录.

例子:

*.log_archive_dest_1='location=+data/vddb/archivelogfile valid_for=(all_logfiles,all_roles) db_unique_name=vddb' scope=both sid='*';
*.log_archive_dest_2='SERVICE=vddb_st LGWR async valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=vddb_st'  scope=both sid='*';

主要属性
location指定归档目录。如location=/u01
servicetnsnames.ora文件中设定的指向备端的TNS-Alias
sync同步传输redo。lgwr进程等待来自LNS的确认信息,然后告知客户端事务已经提交。对最大保护模式高可用模式的DG至少一个standby配置该参数
async异步传输redo。默认
valid_for

定义何时使用log_archive_dest_n以及作用域重做日志文件的类型

这个属性有以下值:

online_logfile:仅归档online log file时有效

syandby_logfile:仅归档standby log file时有效

all_logfiles:对所有类型的重做日志都有效

primary_role:仅对主角色的数据库有效

standby_role:仅对备角色的数据库有效

all_roles:对任何角色的数据库有效

db_unique_name数据库唯一名。该值必须同时存在于log_archive_config与log_archive_dest_n参数中,DG间才能互相通信
net_timeout        

指定LGWR进程等待LNS进程响应的时间,如果超出时间,将因故障放弃备用,稍后LNS进程发起重新连接,默认30s

reopen控制DG尝试重连备库前的等待时间。默认300s
compression

启用redo data压缩

例:log_archive_dest_2='service=standby compression=enable valid_for=(online_logfiles,primary_roles) db_unique_name=standby'

noaffirmasync默认方式
delaystandby接受redo data后,延迟指定秒数再应用
alternate重定向归档目录。当location中指定的归档满时,用此属性指定的目录代替
mandatory要求redo data必须传到standby,若无法传输,primary就无法重用redo,若主备断连,当primary遍历完所有的redo log,就会挂起。切勿设置这个属性
noregisterstandby默认注册传输过来的归档日志,DG无需设置
template

指定archivelog的路径名或者文件名模板。覆盖log_archive_format设定值,若不设置,默认采用log_archive_format。该属性仅对remote归档目标生效

%t:实例线程号

%T实例线程号,填充0

%s:logfile序列号

%T:logfile序列号,填充0

%r:resetlogs ID

$R:resetlogs ID,填充0

q1:alter system set LOG_ARCHIVE_DEST_1='LOCATION=/arch/db70a VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' scope=both sid='*';
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/arch/db70a';

这两个有什么区别?

上面两个参数结果是一样的,valid_for的默认值是(ALL_LOGFILES,ALL_ROLES),scope的默认值是both,sid的默认值是*

q2:alter system set LOG_ARCHIVE_DEST_2='SERVICE=db70b LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db70b' scope=both sid='*';

SERVICE=db70b

主备切换后不起作用

主备库指向

valid for是参数生效条件。service是目标端,通过tnsnames.ora连接到备库,还需要看db_unique_name是否一致。

lgwr是一般情况是一定要写的。

async异步模式。sync同步模式。

noaffirm。不需要在备库确认,主库传输过去就好了。

2.2 log_archive_dest_state_n

与log_archive_dest_n参数配合使用

参数值:

enable:启用log_archive_dest_n

deffer:禁用log_archive_dest_n

ALTERNATE(备用)|RESET(不用)

alternate:替代参数,指定的归档路径在主目录连接失败后启用。

3 备角色参数

3.1 db_file_name_convert

转换主库的数据文件存储目录到备库指定的目录。若主备库数据存储目录不一致,则必须设置该参数。若有多个目录需要转换,可以此设置。

例子:

DB_FILE_NAME_CONVERT='/oradata/stephen', '/oradata/standby'

DB_FILE_NAME_CONVERT='/oradata/stephen','/oradata/standby','/oradata/primary','/oradata/standby'

DB_FILE_NAME_CONVERT='+DATA/STEPHEN','+DATA/STANDBY'

3.2 log_file_name_convert

转换主库的日志文件存储目录到备库指定的目录。若是主备库日志文件存储目录不一致,必须设置

3.3 fal server 和 fal_client

fal指获取归档日志

值为oracle net service name,即tnsnames.ora中的服务名

一旦产生gap,fal_client会向fal_server请求gap的archivelog

一般情况下,是备库向主库请求gap的archivelog。故而 fal server设置为主库net service name,fal client设置为备库的net service name.   fal server设置为远端数据库的service name, fal client设置为自己的service name

3.5 standby_file_management;该参数仅作用于standby

auto:如primary端添加删除数据文件时,standby会执行相应更改

manual:standby不会自动创建删除数据文件,需要手工执行

standby端更改online redo log时,需要设定参数manual

四、相关进程

1.RFS进程

remotefile server。

standby库接受来自primary库的redo信息并写入standbyredo log中。redo信息有lgwr进程触发。RFS进程是传输的进程,需要和其他进程配合。触发同步有两个方向,一是arch,二是lgwr。若是lgwr触发,是由LNSn(10g前是LGWR进程)进程负责传输redo信息rfs进程负责接收redo信息写入standby redo log中。若是arch进程触发,即传输归档日志,就是arch进程负责传输,rfs进程负责接收,然后写入指定的归档位置,然后再应用。这里的不同设置决定了参数log_archive_dest_n的不同设置。

2.LNSn进程

lgwr触发以后真正负责传输的进程,包括初始化网络io等功能

3.LGWR进程

主库中将redo buffer中的日志写入redo log中

4.MRP进程

这个进程负责协调介质恢复管理工作,整个Physical Standby就是建立在介质恢复技术上的。

5.LSP进程

逻辑standby,与上面一致,但是多了一步将redo信息转化为sql语句再恢复。

6.arch进程/arcn进程

redo log日志满了,将会触发arch进程将redo log中的数据写入到archive log中

7.PR0x(Parallel Recover Process)进程

这是进行具体恢复工作的进程,如果是Real-Time Apply模式下,这些进程会从Standby Redo Log(SRL)文件中读日志,而在其他模式下,是从归档日志中读取日志然后再进行日志应用工作

五、传输过程详解

主要提供服务一下2种

1)redo传输服务:把primary端的redo日志传输到一个或者多个standby目的地

2)redo应用服务:在standby端应用从primary端传过来的redo日志。

1.使用arcn传输redo

默认情况下使用arcn传输redo日志,

大致过程如下:

1)primary端arc0一旦完成日志切换,arc1就将新生成的归档日志传输到standby端

2)standby端又RFS接受日志,若配置了standby redo log,记录至standby redo log,等standby redo log做log switch形成归档,再应用归档日志做恢复;若没有配置standby redo log,rfs进程接收到日之后,放到standby端归档目录下,standby在应用归档日志做恢复。

2.使用lgwr传输redo日志

使用lgwr和arcn很不一样。它不需要等primary完成日志切换后再传输。

大致过程如下:

1)一旦primary有redo日志产生,lgwr将触发lnsn进程传输redo至standby redo log;这里不能由lgwr直接传输,因为整个数据库实例只有一个lgwr,为了保证主要性能不受影响,不能直接lgwr传输

2)网络传输模式可选择sync和async。sync指primary提交时,必须等redo传输至standby成功后,才返回结果成功。若设置为同步传输,需要设置net_timeout参数,超时无响应,则返回结果错误

async是指primary提交是否成功和日志是否传输成功没有关系,对primary的性能影响最小。

3)standby端的rfs进程把redo写入standby redo log,若是开启了实时应用,就将redo应用至standby数据库,如果没有开始实时应用,等standby redo log归档后再应用到standby数据库。

六、为什么主库要创建standby redo文件,standby redo文件在dataguard中是怎么起作用的

standby redo在备库中的作用是接受主库传输过来的日志文件,以便被rfs进程或者lsp进程应用。

主库中的作用?

主库中standby redo没有作用,standby redo只有在备库中起在线日志文件的作用。主库中·同时创建standby redo是为了做主备切换时主库变被库,日志文件由主库redo变成standby redo文件

七、监控DG试图v$managed_standby字段注解

用于监控各进程的状态,以及归档应用情况

下为主库中v$managed_standby示例

SQL> select process,status,thread#,sequence# from v$managed_standby;

SQL> select process,status,thread#,sequence# from v$managed_standby;

PROCESS            STATUS                      THREAD#  SEQUENCE#
------------------ ------------------------ ---------- ----------
DGRD               ALLOCATED                         0          0
DGRD               ALLOCATED                         0          0
ARCH               CLOSING                           1         67
ARCH               CLOSING                           1         79
ARCH               CLOSING                           1         68
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CLOSING                           1         70
ARCH               CONNECTED                         0          0

PROCESS            STATUS                      THREAD#  SEQUENCE#
------------------ ------------------------ ---------- ----------
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CLOSING                           1         72
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CLOSING                           1         75
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0

PROCESS            STATUS                      THREAD#  SEQUENCE#
------------------ ------------------------ ---------- ----------
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CONNECTED                         0          0
ARCH               CLOSING                           1         77
ARCH               CLOSING                           1         78
ARCH               CONNECTED                         0          0
ARCH               OPENING                           1         67
ARCH               CONNECTED                         0          0
LNS                OPENING                           1         68

PROCESS            STATUS                      THREAD#  SEQUENCE#
------------------ ------------------------ ---------- ----------
DGRD               ALLOCATED                         0          0
LNS                WRITING                           1         80

process,进程名,具体详细可见目录四相关进程

sequence#为归档日志序列号

thread区分不同节点

status的参数比较重要

status参数详解
allocated正在准备但还未连接到主库
attached正在连接到主库
connected已经连接到主库
idle空闲
error失败的进程,需要关注
receiving归档日志接受中
opening归档日志处理中(上面的例子中arch和lns进程都在处理,说明归档日志和redo日志都在传输与处理)
closing归档日志处理完,正在收尾中
writing进程在将redo数据写向归档文件中
wait_for_log等待新的redo归档数据中
wait_for_gap归档有中断,正在等待中断的那部分redo数据
applying_log正在应用redo归档数据到备库

一般情况下,主库存在lns进程,状态为writing,表明数据正在传输,或者状态为connect,均说明数据发送正常;

备库存在 rfs进程写数据到redo日志,存在mrp进程运用数据,则说明数据库接受数据正常,同时应用数据正常。

八、archive_log试图

本试图包含了归档重做日志文件的信息,如归档文件的名称归档路径等。

该视图数据来自于控制文件

一般当一个Online Redologs完成归档后,就会在控制文件中插入一条记录,如果归档目录有多个,则同时插入对应数量的记录,

另外当通过rman恢复归档文件或复制归档文件时,也会插入对应的记录。

通常需要关注的字段有:

archive_log字段详解
name记录归档文件路径或名称
thread#归档线程号,rac环境下适用
sequence#归档文件序号
first_time等同于创建时间
creator

该条记录的创建者

creator有以下几种值

arch归档进程创建
fgrd前台进程创建
rman由rman创建
sman由备库rman创建
lgwr由logwriter进程创建
applied是否被应用,dataguard环境适用
status

该条记录的状态

有以下几种值

A正常归档状态
D指该记录指向的归档文件已被删除
U指该记录指向的归档以不存在
X该条记录失效,通常在rman中执行了crosscheck archivelog后有可能出现

九、dg相关语句试图

1.v$archived_log

可以通过v$archived_log查看归档日志是否一致

DG:
SQL> select thread#, max(sequence#) from v$archived_log where applied='YES' group by thread#;

   THREAD# MAX(SEQUENCE#)
---------- --------------
         1             79
         2             59

RAC:
SQL> select thread#, max(sequence#) from v$archived_log group by thread#;

   THREAD# MAX(SEQUENCE#)
---------- --------------
         1             81
         2             60

2.v$managed_standby

查询状态是否正常,详细见目录7

3.v$database

查询主库DG状态是否正常

SQL> select switchover_status from v$database ;

SWITCHOVER_STATUS
----------------------------------------
TO STANDBY

4.standby_log

SQL> SELECT GROUP#,THREAD#,sequence#,STATUS,BYTES/1024/1024 M FROM V$STANDBY_LOG;

    GROUP#    THREAD#  SEQUENCE# STATUS              M
---------- ---------- ---------- ---------- ----------
         4          1         66 ACTIVE            200
         5          1          0 UNASSIGNED        200
         6          1          0 UNASSIGNED        200
         7          0          0 UNASSIGNED        200

十、dg搭建实例

1.a->b->c级联备库搭建

1.1.准备工作:a-b已经搭建完成

参数配置
db_unique_namesingle01_prisingle01_stdsingle01_std2
db_namesingle01single01single01
ip192.168.1.31192.168.1.32192.168.1.30

1.2主库修改参数

alter system set log_archive_config='DG_CONFIG=(single01_pri,single01_std,single01_std2)' scope=both;

1.3第一备库修改参数

alter system set log_archive_config='DG_CONFIG=(single01_pri,single01_std,single01_std2)' scope=both;
alter system set LOG_ARCHIVE_DEST_2='SERVICE=single01_std2 LGWR ASYNC VALID_FOR=(STNDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=single01_std2';

//这个参数非常重要,lgwr和async都需要写,否则lns进程不能从备库传输数据到级联库

1.4第二备库修改参数

*.DB_UNIQUE_NAME=single01_std2
*.FAL_SERVER=single01_std
*.log_archive_config='DG_CONFIG=(single01_pri,single01_std,single01_std2)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u02/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=single01_std2'
*.LOG_ARCHIVE_DEST_state_1='enable'

1.5主备库创建tnsname.ora

SINGLE01_STD2=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.30)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = single01)
    )
  )

1.6 级联库rman duplicate复制数据库到级联库

2.主备切换

2.1 主库状态检查

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO STANDBY

2.2 主库将primary转换成standby角色

SQL> alter database commit to switchover to physical standby;

Database altered.

此时数据库由open状态变为关闭状态,若是集群,将会两节点都关闭

2.3 主库重启到mount状态

若是集群,只需要将一个节点mount,另一个节点不动,直到最后切换完成


SQL> startup mount;
ORACLE instance started.

Total System Global Area 1660940984 bytes
Fixed Size                  8897208 bytes
Variable Size            1426063360 bytes
Database Buffers          218103808 bytes
Redo Buffers                7876608 bytes
Database mounted.

此时检查数据库状态

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED

2.4 备库检查转换状态

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO PRIMARY

2.5 备库更改备库角色为主库角色

SQL> alter database commit to switchover to primary;

Database altered.

此时备库状态为mounted
若是集群从备库切换到主库,则将两节点都为mount状态

SQL> alter database open;

Database altered.

并启动数据库

2.6 检查主库状态

SQL> select name,open_mode,database_role,protection_mode,SWITCHOVER_STATUS  From v$database;

NAME      OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE
--------- -------------------- ---------------- --------------------
SWITCHOVER_STATUS
--------------------
SINGLE01  READ WRITE           PRIMARY          MAXIMUM PERFORMANCE
FAILED DESTINATION

2.7 修改主库参数

SQL> alter system set log_archive_dest_2='SERVICE=single01_pri LGWR ASYNC VALID_FOR=(online_logfiles,primary_role) DB_UNIQUE_NAME=single01_pri';

System altered.

2.8 open备库数据库

SQL> alter database recover managed standby database disconnect from session;

Database altered.

SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database open;

Database altered.

应用在线日志文件,并open备库数据库

2.9 应用备库在线日志

SQL> alter database recover managed standby database disconnect from session;

Database altered.

2.10 检查备库状态

SQL> select name,open_mode,database_role,protection_mode,SWITCHOVER_STATUS  From v$database;

NAME      OPEN_MODE            DATABASE_ROLE    PROTECTION_MODE      SWITCHOVER_STATUS
--------- -------------------- ---------------- -------------------- --------------------
SINGLE01  READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE  NOT ALLOWED


SQL> select process,thread#,status from v$managed_standby;

PROCESS      THREAD# STATUS
--------- ---------- ------------
ARCH               0 CONNECTED
DGRD               0 ALLOCATED
DGRD               0 ALLOCATED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED

PROCESS      THREAD# STATUS
--------- ---------- ------------
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED

PROCESS      THREAD# STATUS
--------- ---------- ------------
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
ARCH               0 CONNECTED
MRP0               1 APPLYING_LOG    #说明日志正在应用

PROCESS      THREAD# STATUS
--------- ---------- ------------
RFS                1 IDLE
RFS                1 IDLE
RFS                0 IDLE

36 rows selected.

2.11 在主库中向test0728表中插入数据,并在备库中检查数据是否同步

#主库中

SQL> insert into test0728 values (18);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test0728;

         X
----------
         2
         3
         4
        10
        12
        16
        18

7 rows selected.


#备库1中

SQL> select * from test0728;

         X
----------
         2
         3
         4
        10
        12
        16
        18

7 rows selected.

#备库2中
SQL> select * from test0728;

         X
----------
         2
         3
         4
        10
        12
        16
        18

7 rows selected.


至此,主备库成功切换。

2.12 如果一主库,两备库情况下

若是备库指向了新的主库,需要更改db_file_name_convert和log_file_name_convert;

具体做法如下

主备库中检查如下数据

SQL> select member from v$logfile;

MEMBER
---------------------------------------------------------------------------------
/u01/app/oracle/oradata/SINGLE01/onlinelog/o1_mf_3_jgzv66xc_.log
/u01/app/oracle/fast_recovery_area/SINGLE01/onlinelog/o1_mf_3_jgzv68pl_.log
/u01/app/oracle/oradata/SINGLE01/onlinelog/o1_mf_2_jgzv66wx_.log
/u01/app/oracle/fast_recovery_area/SINGLE01/onlinelog/o1_mf_2_jgzv68pk_.log
/u01/app/oracle/oradata/SINGLE01/onlinelog/o1_mf_1_jgzv66wb_.log
/u01/app/oracle/fast_recovery_area/SINGLE01/onlinelog/o1_mf_1_jgzv68r5_.log
/u01/app/oracle/oradata/SINGLE01/standby/redo4_std1.log
/u01/app/oracle/oradata/SINGLE01/standby/redo5_std2.log
/u01/app/oracle/oradata/SINGLE01/standby/redo6_std3.log
/u01/app/oracle/oradata/SINGLE01/standby/redo7_std4.log


SQL>  select name from v$datafile;

NAME
----------------------------------------------------------------------------
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_system_jgzv3tk7_.dbf
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_sysaux_jgzv4mr3_.dbf
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_undotbs1_jgzv52tf_.dbf
/u01/app/oracle/oradata/SINGLE01/datafile/o1_mf_users_jgzv53vx_.dbf


利用主备库中的上述参数,修改如下参数

SQL>  alter system set db_file_name_convert='/u01/app/oracle/oradata/SINGLE01','/u01/app/oracle/oradata/SINGLE01_STD2' scope=spfile;

System altered.

用相同的方法在备库中修改log_file_name_convert,并重启备库到mount状态,应用日志恢复数据,启到open状态,并再次应用日志恢复数据,到adg状态

2.13 切换总结

重点:

修改主备库角色,重点语句为

alter database commit to switchover to primary;

alter database commit to switchover to physical standby;

修改主库的log_archive_dest_n参数,修改standby_roles为primary_roles,否则数据同步将存在问题

来源:

oracle是arch还是arcn,Oracle]DataGuard之Redo传输详解_猫腻MX的博客-CSDN博客

dataguard中比较重要的进程_weixin_33729196的博客-CSDN博客

DG 参数详解 - kingle-l - 博客园

v$archived_log详解_jlds123的专栏-CSDN博客_v$archived_log详解

Oracle12c DG环境搭建级联备库_Expec-乐的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值