达梦数据库 物理备份还原

1.背景

物理备份是找出那些已经分配、使用的数据页,拷贝并保存到备份集中。物理还原是物理备份的逆过程,物理还原一般通过 DMRMAN 工具(或者 SQL 语句),把备份集中的数据内容(数据文件、数据页、归档文件)重新拷贝、写入目标文件。

2.要求

学习物理备份还原的机制原理

3.实验步骤

3.1 相关术语

  • 联机备份还原:联机备份还原指数据库处于运行状态时,并正常提供数据库服务情况下进行的备份还原操作,称为联机备份还原。
  • 脱机备份还原:脱机还原指数据库处于关闭状态时执行的还原操作。库备份、表空间备份和归档备份,可以执行脱机还原。脱机还原操作的目标库必须处于关闭状态。
  • 备份集:备份集用来存放备份过程中产生的备份数据及备份信息。一个备份集对应了一次完整的备份。一般情况下,一个备份集就是一个目录,备份集包含一个或多个备份片文件,以及一个备份元数据文件。

3.2 准备工作

联机备份数据库必须要配置归档。联机备份时,大量的事务处于活动状态,为确保备份数据的一致性,需要同时备份一段日志(备份期间产生的 REDO 日志),因此要求数据库必须配置本地归档且归档处于开启状态。

脱机备份数据库可配置归档也可以不配置。正常退出的库的备份不需要考虑本地归档日志的完整性,可以不配置归档;但对于故障退出的库的备份要求因故障未刷盘的日志也必须存在于本地归档中,因此必须配置归档。

归档配置有两种方式:一是联机归档配置,数据库实例启动情况下,使用 SQL 语句完成 dmarch.ini 和 ARCH_INI 配置;二是手动配置归档,数据库实例未启动的情况下,手动编写 dmarch.ini 文件和设置参数 ARCH_INI。下面将分别说明这两种归档如何配置。

方式一:联机配置归档

##修改数据库为 Mount 状态
ALTER  DATABASE  MOUNT;

##开启归档模式
ALTER  DATABASE  ARCHIVELOG;

##配置本地归档
ALTER DATABASE ADD ARCHIVELOG 'DEST = /home/dm_arch/arch, TYPE = local,FILE_SIZE = 1024, SPACE_LIMIT = 2048';

##修改数据库为 Open 状态
ALTER  DATABASE  OPEN;

方式二:手动配置归档

##关闭数据库
##在 dm.ini 所在目录,创建 dmarch.ini 文件。dmarch.ini 文件内容如下:
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /home/dm_arch/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 2048

##编辑 dm.ini 文件,设置参数ARCH_INI=1
##启动数据库实例,数据库已运行于归档模式。

3.3 联机备份还原

联机方式支持数据库、用户表空间、用户表和归档的备份以及用户表的还原。在进行联机库级备份、归档备份和表空间备份时,必须保证系统处于归档模式,否则联机备份不能进行。

3.3.1 数据备份

3.3.1.1 手动备份

1、数据库备份
在 disql 工具或图形化管理工具 SQL 编辑区中使用 BACKUP 语句可以备份整个数据库,执行以下命令:

##全备
BACKUP  DATABASE  FULL  BACKUPSET '/opt/dmdbms/BAK/db_full_bak_01';

设置联机数据库备份集路径

##指定备份集路径为 /home/dm_bak/db_bak_3_01
##BACKUPSET 参数用于指定备份集的输出路径
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_01';

设置备份名

##创建备份集,备份名设置为“WEEKLY_FULL_BAK”
BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/home/dm_bak/db_bak_3_02';

##备份名的设置不可以使用特殊格式,例如%NAME。

添加备份描述

##创建备份为备份集添加描述信息为“完全备份”。
##描述信息可以更详细地对备份类型、用途等进行说明
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_04' BACKUPINFO  '完全备份';

限制备份片大小

##MAXPIECESIZE 参数用于控制单个备份片的大小
##MAXPIECESIZE 不能大于磁盘剩余空间大小,否则报错磁盘空间不足。

##创建备份限制备份片大小为300M
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_05' MAXPIECESIZE 300;

备份压缩

##执行备份压缩,压缩级别设置为 5。
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_06' COMPRESSED LEVEL 5;

##压缩选项有不同的压缩级别可以选择,取值范围为 0~9。
##应根据存储空间、数据文件大小等确定合适地压缩级别

设置并行备份

##可通过关键字 PARALLEL 指定是否执行并行备份,以及执行并行备份的并行数。

##创建并行备份,指定并行数为8
BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_07' PARALLEL 8;

2、表空间备份
在 disql 工具中使用 BACKUP 语句可以备份单个表空间。同备份数据库一样,执行表空间备份数据库实例也必须运行在归档模式下,启动 disql 输入以下语句即可备份表空间:

BACKUP TABLESPACE MAIN BACKUPSET 'ts_bak_01';

增量备份指定基备份路径

##以增量备份用户 MAIN 表空间为例,指定 BASE ON BACKUPSET 参数执行增量备份

BACKUP TABLESPACE MAIN BACKUPSET 'ts_full_bak_01';

BACKUP TABLESPACE MAIN INCREMENT BACKUPSET 'ts_increment_bak_01';

BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET'ts_full_bak_01' BACKUPSET  'ts_increment_bak_02';

完全备份

BACKUP TABLESPACE MAIN FULL BACKUPSET '/home/dm_bak/ts_full_bak_01';

增量备份

BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/home/dm_bak' BACKUPSET  '/home/dm_bak/ts_increment_bak_02';

3、表备份
与备份数据库与表空间不同,备份表不需要服务器配置归档,disql 输入以下命令即可备份用户表

BACKUP TABLE TAB_01 BACKUPSET 'tab_bak_01';
##备份集“tab_bak_01”会生成到默认的备份路径下

4、归档备份
在 disql 工具中使用 BACKUP 语句可以备份归档日志。归档备份的前提:

  • 数据库必须配置归档;
  • 归档文件的 db_magic、permanent_magic 值和数据库的 db_magic、permanent_magic 值必须一样;
  • 归档日志必须连续,如果出现不连续的情况,前面的连续部分会忽略,仅备份最新的连续部分。
    disql 输入以下命令即可备份归档:
SQL>BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01'; 
##备份集“arch_bak_01”会生成到默认的备份路径下。

归档备份常用的备份选项有设置备份名、设置备份集路径、指定介质参数、添加备份描述等,详细设置方式可参考设置数据库备份选项。

3.3.1.2 定时备份

1、图形化方式创建定时备份
右击管理工具-【代理】-【作业】-【新建作业】。
在这里插入图片描述
出现如下图所示界面,在作业名称和作业描述中填写备份名称和描述
在这里插入图片描述
在作业步骤中选择具体的备份方式,如下图所示
在这里插入图片描述
执行完上述步骤后点击【确定】
2、定时日志备份查看
右击管理工具,选择【代理】-【作业】-【job 名称】,点击【查看历史作业信息】,即可查看定时备份日志。
在这里插入图片描述

3.3.2 管理备份

3.3.2.1 备份目录管理

添加备份目录

--函数 SF_BAKSET_BACKUP_DIR_ADD (device_type,backup_dir) 用于添加备份目录

--使用方法:
SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/home/dm_bak');

删除备份目录

--函数 SF_BAKSET_BACKUP_DIR_REMOVE (device_type,backup_dir) 用于删除备份目录

--使用方法:
SELECT SF_BAKSET_BACKUP_DIR_REMOVE('DISK','/home/dm_bak');

清理全部备份目录

--函数 SF_BAKSET_BACKUP_DIR_REMOVE_ALL () 用于清理全部备份目录

--使用方法:
SELECT SF_BAKSET_BACKUP_DIR_REMOVE_ALL();
3.3.2.2 备份集校验与删除

备份集校验

--SF_BAKSET_CHECK (device_type,backup_dir)
SELECT  SF_BAKSET_CHECK ('DISK','/home/dm_bak/db_bak_for_check');

备份集删除
备份集删除相关函数参考如下,相关函数具体使用方法可参考数据库安装目录下 doc 目录中《DM8 备份与还原》手册

--删除指定设备类型和指定备份集目录地备份集
SF_BAKSET_REMOVE

--批量删除满足指定条件的所有备份集
SF_BAKSET_REMOVE_BATCH

--批量删除指定时间之前的数据库备份集
SP_DB_BAKSET_REMOVE_BATCH

--批量删除指定表空间对象及指定时间之前的表空间备份集
SP_TS_BAKSET_REMOVE_BATCH

--批量删除指定表对象及指定时间之前的表备份集。
SP_TAB_BAKSET_REMOVE_BATCH

--批量删除指定时间之前的归档备份集。
SP_ARCH_BAKSET_REMOVE_BATCH

3.3.3 数据还原

达梦数据库仅支持表的联机还原,数据库、表空间和归档日志的还原必须通过脱机工具 DMRMAN 执行。
表还原的具体操作如下,表还原之后不需要恢复操作。disql 中输入以下 RESTORE 语句即可还原表:

SQL>RESTORE TABLE TAB_01 FROM BACKUPSET 'tab_bak_01'; 

3.4 脱机备份还原

3.4.1 DMRMAN工具

DMRMAN(DM RECOVERY MANAGER)是脱机备份还原命令行工具,无需额外安装,由它来统一负责库级脱机备份、脱机还原、脱机恢复等相关操作,该工具支持命令行指定参数方式和控制台交互方式执行,降低用户的操作难度。
启动和退出 DMRMAN。进入数据库安装目录的 bin 目录下,例如 /dm8/bin,执行以下命令:

##启动DMRMAN
./dmrman

##退出DMRMAN
##启动后控制台中输入 exit 命令
RMAN>exit;

3.4.2 数据备份

因表空间备份和表备份都只能在联机状态下进行,因此脱机状态下的数据备份只包括数据库备份和归档备份。

3.4.2.1 数据库备份

1、创建完全备份
创建一个完整的数据库脱机备份的步骤如下:

##保证数据库处于脱机状态
##启动DMRMAN命令行工具
./dmrman

##DMRMAN中输入以下命令:
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini ' FULL BACKUPSET  '/home/dm_bak/db_full_bak_01'; 

##FULL参数表示执行的备份为完全备份

2、创建增量备份
增量备份指基于指定的库的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改了的数据页。脱机增量备份要求两次备份之间数据库必须有操作,否则备份会报错。
创建脱机增量备份数据库的步骤如下:

##保证数据库处于脱机状态
##启动DMRMAN命令行工具
./dmrman

##DMRMAN中输入以下命令:
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' INCREMENT WITH BACKUPDIR '/home/dm_bak'BACKUPSET '/home/dm_bak/db_increment_bak_02';

##INCREMENT参数表示执行的备份为增量备份
3.4.2.2 归档备份

使用 DMRMAN 备份归档需要设置归档,否则会报错。同时,归档备份得是归档日志,防止归档日志的丢失导致重要数据缺失。
执行归档备份要求数据库处于脱机状态,完整的创建脱机归档备份的过程如下:

##配置归档,请参考归档配置;
##保证数据库处于脱机状态;
##启动 DMRMAN 命令行工具;

##DMRMAN 中输入以下命令:
RMAN>BACKUP ARCHIVE LOG ALL DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' BACKUPSET  '/home/dm_bak/arch_all_bak_01'; 

3.4.3 备份管理

管理备份一个重要的目的是删除不再需要的备份。DMRMAN 工具提供 SHOW、CHECK、REMOVE、LOAD 等命令分别用来查看、校验、删除和导出备份集。

3.4.3.1 备份信息查看

DMRMAN 中使用 SHOW 命令可以查看备份集的信息,若指定具体备份集目录,则会生成相应的备份集链表信息。使用方法如下:

##查看单个备份集信息
RMAN> show backupset '/home/test/yy/dm_bak/db_full_bak_01' 

##批量显示备份集信息
##SHOW BACKUPSETS...命令用于批量显示指定搜索目录下的备份集信息。
##可通过WITH BACKUPDIR 参数指定多个备份集搜索目录,同时查看所有的备份集。
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' 
BACKUPSET'/home/dm_bak1/db_bak_for_show_01'; 
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' 
BACKUPSET'/home/dm_bak2/db_bak_for_show_01'; 
RMAN>SHOW BACKUPSETS WITH BACKUPDIR '/home/dm_bak1','/home/dm_bak2';
3.4.3.2 备份集校验

DMRMAN 中使用 CHECK 命令对备份集进行校验,校验备份集是否存在及合法。

##语法:CHECK BACKUPSET '<备份集目录>' ;
##CHECK BACKUPSET...命令用于校验特定备份集,每次只能检验一个备份集。
RMAN>CHECK BACKUPSET '/home/dmbak/dbbakforcheck01';
3.4.3.3 备份集删除

DMRMAN 中使用 REMOVE 命令删除备份集,可删除单个备份集,也可批量删除备份集。单个备份集删除时并行备份中的子备份集不允许单独删除;在指定备份集搜集目录中,发现存在引用待删除备份集作为基备份的需要执行级联删除,默认报错。批量删除备份集时,跳过收集到的单独的子备份集。

RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' 
BACKUPSET'/home/dm_bak/db_bak_for_remove_01'; 
RMAN>REMOVE BACKUPSET '/home/dm_bak/db_bak_for_remove_01'
3.4.3.4 备份集导出

DMRMAN 中使用 LOAD 命令导出备份集。

##导出磁带/dev/nst0 上所有备份集的 meta 文件到目录/mnt/hgfs/dmsrc/bak_ dir中。直接输##入导出语句将报错,如下所示:
RMAN>LOAD BACKUPSETS FROM DEVICE TYPE TAPE TO BACKUPDIR '/mnt/hgfs/dmsrc/bak_dir'; 
LOAD BACKUPSETS FROM DEVICE TYPE TAPE TO BACKUPDIR '/mnt/hgfs/dmsrc/bak_dir'; 
##load backupsets failed.error code:-10000  [-10000]:[错误码:-20022]磁带打开失败

##退出 dmrman,设置环境变量 TAPE,值为/dev/nst0: 
[root@192 debug]#export TAPE=/dev/nst0 
[root@192 debug]#echo $TAPE  /dev/nst0

##启动 dmrman,再次执行
[root@192 debug]# ./dmrman 
RMAN>LOAD BACKUPSETS FROM DEVICE TYPE TAPE TO BACKUPDIR '/mnt/hgfs/dmsrc/bak_dir'; 
LOAD BACKUPSETS FROM DEVICE TYPE TAPE TO BACKUPDIR '/mnt/hgfs/dmsrc/bak_dir'; 
load meta file [SBT_TEST_T-20140909192629000000-4966] to path 
[/mnt/hgfs/dmsrc/bak_dir/0/0.meta]... 
load meta file [SBT_TEST_T-20140909192629000000-4966] to path 
[/mnt/hgfs/dmsrc/bak_dir/0/0.meta]...success 
load meta file [SBT_TEST_T2-20140909192746000000-9983] to path 
[/mnt/hgfs/dmsrc/bak_dir/1/1.meta]... 
load meta file [SBT_TEST_T2-20140909192746000000-9983] to path 
[/mnt/hgfs/dmsrc/bak_dir/1/1.meta]...success 
load backupsets successfully.

##退出 dmrman,查看本地磁盘目录/mnt/hgfs/dmsrc/bak_dir: 
[root@192 debug]# ls -1 /mnt/hgfs/dmsrc/bak_dir  total 0 
drwxrwxrwx 1 root root 0 Sep 11 00:23 0 
drwxrwxrwx 1 root root 0 Sep 11 00:23 1 
[root@192 debug]# ls -1 /mnt/hgfs/dmsrc/bak_dir/0  total 12 
-rwxrwxrwx 1 root root 24576 Sep 11 00:23 0.meta 
[root@192 debug]# ls -1 /mnt/hgfs/dmsrc/bak_dir/1 
total 12 
-rwxrwxrwx 1 root root 24576 Sep 11 00:23 1.meta 
3.4.3.5 备份集映射文件导出

备份集映射文件,又称为 mapped file。备份集映射文件导出,是将备份集中各数据文件的原始路径或者调整后的路径生成到一个本地文件中,可通过关键字 MAPPED FILE 应用于表空间和库的还原操作中。
DMRMAN 中使用 DUMP 命令导出映射文件。不支持导出到 DMASM 文件系统中。

##导出备份集中数据文件的原始路径
RMAN>DUMP  BACKUPSET'/mnt/dmsrc/db_bak'DEVICE TYPE DISK MAPPED FILE  '/mnt/dmsrc/db_bak_mapped.txt';

##指定 ini_path,导出调整后的数据文件路径到映射文件:
RMAN>DUMP  BACKUPSET'/mnt/dmsrc/db_bak'DEVICE TYPE DISK DATABASE  '/opt/dmdbms/data/DAMENG/dm.ini'
MAPPED  FILE '/mnt/dmsrc/db_bak_mapped.txt';

3.4.4 数据还原恢复

3.4.4.1 数据库还原与恢复

1、数据库还原
使用 RESTORE 命令完成脱机还原操作,在还原语句中指定库级备份集,可以是脱机库级备份集,也可以是联机库级备份集。
以联机数据库备份说明使用 DMRMAN 如何执行数据库还原操作:

##联机备份数据库,保证数据库运行在归档模式及 OPEN 状态; 
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 

##准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始化一个新库。如下所示: 
./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE 

##校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验; 
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

##还原数据库。启动 DMRMAN,输入以下命令: 
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM 
BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

2、数据库恢复
使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使用本地归档日志的恢复工作。数据库恢复是指重做 REDO 日志,有两种方式:从备份集恢复,即重做备份集中的 REDO 日志;或从归档恢复,即重做归档中的 REDO 日志。
方式一:从备份集恢复

##执行还原数据库的命令之后,可以直接执行恢复数据库的命令,如下:
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM  BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';

方式二:从归档恢复

##通过使用 WITH ARCHIVEDIR 关键字进行归档恢复,如下:
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR'/home/dm_arch/arch' 

3、数据库更新
数据库更新是指更新数据库的 DB_MAGIC,并将数据库调整为可正常工作状态,与数据库恢复一样使用 RECOVER 命令完成。数据库更新发生在重做 REDO 日志恢复数据库后。

3.4.4.2 表空间还原与恢复

1、表空间还原
使用 RESTORE 命令完成表空间的脱机还原,还原的备份集可以是联机或脱机生成的库备份集,也可以是联机生成的表空间备份集。脱机表空间还原仅涉及表空间数据文件的重建与数据页的拷贝。不需要事先设置目标表空间为 OFFLINE 状态。
表空间还原后,表空间状态被置为 RES_OFFLINE,并设置数据标记 FIL_TS_RECV_STATE_RESTORED,表示经过还原但数据不完整。表空间还原命令如下:

RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' TABLESPACE  MAIN FROM BACKUPSET '/home/dm_bak/ts_full_bak_for_restore';

2、表空间恢复
表空间恢复通过重做 REDO 日志,以将数据更新到一致状态。由于日志重做过程中,修改好的数据页首先存入缓冲区,缓冲区分批次将修改好的数据页写入磁盘,如果在此过程中发生异常中断,可能导致缓冲区中的数据页无法写入磁盘,造成数据的不一致,数据库启动时校验失败,所以表空间恢复过程中不允许异常中断。
恢复完成后,表空间状态置为 ONLINE,并设置数据标记为 FIL_TS_RECV_STAT_RECOVERED,表示数据已恢复到一致状态。恢复表空间命令如下:

RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RECOVER/dm.ini' TABLESPACE  MAIN;
3.4.4.3 归档还原与恢复

1、归档还原
使用 RESTORE 命令完成脱机还原归档操作,在还原语句中指定归档备份集。备份集可以是脱机归档备份集,也可以是联机归档备份集。归档还原的命令如下:

##还原归档。启动 DMRMAN,设置 OVERWRITE 为 2,如果归档文件已存在,会报错。 
##1、指定还原的目标归档日志目录:
RMAN>RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO ARCHIVEDIR'/opt/dmdbms/data/DAMENG_FOR_RESTORE/arch_dest' OVERWRITE 2; 

##2、指定还原目标库的 dm.ini 文件路径:
RMAN>RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO  DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' OVERWRITE 2; 

2、归档修复
使用 REPAIR 命令完成指定数据库的归档修复,归档修复会对目标库 dmarch.ini 中配置的所有本地归档日志目录执行修复。若目标库没有配置本地归档,则不执行修复。执行修复时,目标库一定不能处于运行状态。一般建议在数据库故障后,应立即执行归档修复,否则后续还原恢复将会导致联机日志中未刷入本地归档的 REDO 日志中而丢失,届时再利用本地归档恢复将无法恢复到故障前的最新状态。归档恢复的命令如下:

##单机环境下,确保目标库已经停止工作后,执行归档修复;
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/data/dm.ini'; 

##DSC 环境下,需要每个节点停止工作后,每个节点独立执行修复操作;
##对于两节点 DSC01、DSC02 执行修复如下: 
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/dsc/dm01.ini'; 
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/dsc/dm02.ini'

4.实验结论

数据库备份是 DBA 日常最重要的工作内容,数据库备份可以提高系统的高可用性和灾难可恢复性,当数据库系统崩溃时,没有备份就无法恢复,数据库备份可以减少数据丢失的风险,数据库备份是一种防范灾难于未然的强力手段,没有数据就没有一切,合适的备份恢复方案可以最小化数据丢失,最短的时间内恢复数据。

达梦社区地址 https://eco.dameng.com

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值