DM数据库备份

〇、概述

DM数据备份还原分为两种类型:

  • 物理备份还原:指对数据库的操作系统文件的备份还原,如RMAN
  • 逻辑备份还原:对数据库逻辑组件如表视图等对象的备份还原,如dexp/dimp

一、逻辑导入导出

逻辑导入导出命令:

  • dexp/dimp:服务端和客户端都可以执行
  • dexpdp/dimpdp:数据泵方式,只能在服务端执行,并且需要在库内创建逻辑目录和物理目录

命令位置:${DM_HOME}/bin

逻辑导入导出数据库对象分级

  • 数据库级(FULL)
  • 用户级(OWNER)
  • 模式级(SCHEMAS)
  • 表级(TABLES)

四种级别独立互斥,不能同时存在

01| dexp 参数一览表

参数含义备注
USERID数据库的连接信息必选
FILE明确指定导出文件名称可选。如果缺省该参数,则导出文件名为 dexp.dmp
LOG明确指定日志文件名称可选,如果缺省该参 数,则导出文件名为 dexp.log
DIRECTORY导出文件所在目录可选
PARFILE参数文件名,如果 dexp 的参数很多,可以存成参数文件可选
FULL导出整个数据库(N)可选,OWNER、SCHEMAS、TABLES、FULL四者中选其一。
缺省为 SCHEMAS
OWNER用户名列表,导出一个或多个用户所拥有的所有对象
SCHEMAS模式列表,导出一个或多个模式下的所有对象
TABLES表名列表,导出一个或多个指定的表或表分区
FUZZY_MATCHTABLES 选项是否支持模糊匹配(N)可选
QUERY用于指定对导出表的数据进行过滤的条件。可选
PARALLEL用于指定导出的过程中所使用的线程数目可选
TABLE_PARALLEL用于指定导出每张表所使用的线程数,在MPP模式下会转换成单线程可选
EXCLUDE1. 导出内容中忽略指定的对象。
对象有 CONSTRAINTS、INDEXES、ROWS、TRIGGERS 和 GRANTS。
比如:EXCLUDE= (CONSTRAINTS,INDEXES)
2. 忽略指定的表,使用 TABLES:INFO 格式,如果 使用表级导出方式导出,则使用 TABLES:INFO 格式的 EXCLUDE 无效。
例如:EXCLUDE= TABLE: table1,table2
3. 忽略指定的模式,使用 SCHEMAS:INFO 格式,如果使用表级,模式级导出方式导出,则使用 SCHEMAS:INFO 格式的 EXCLUDE 无效。
例如: EXCLUDE=SCHEMAS:SCH1,SCH2
可选
INCLUDE导出内容中包含指定的对象,
对象有 CONSTRAINTS、INDEXES、ROWS、TRIGGERS 和 GRANTS。
例如:INCLUDE=(CONSTRAINTS,INDEXES)
或者 INCLUDE=TABLES:table1,table2
可选
CONSTRAINTS导出约束 (Y) ,如 CONSTRAINTS=y可选。
此处单独设置与 和 EXCLUDE/INCLUDE 中批量设置功能一样。 设置一个即可
TABLESPACE导出的对象定义是否包含表空间(N)
GRANTS导出权限 (Y)
INDEXES导出索引 (Y)
TRIGGERS导出触发器(Y)
ROWS导出数据行 (Y)
TABLE_POOL用于设置导出过程中存储表的缓冲区个数 可选可选
FEEDBACK每 x 行显示进度 (0)可选
NOLOGFILE不使用日志文件(N)可选
NOLOG屏幕上不显示日志信息(N)可选
LOG_WRITE日志信息实时写入文件 (N)可选
DUMMY交互信息处理: 打印§, 所有交互都按 YES 处理 (Y),NO(N)。默认为 NO,不打印交互信息。可选
COMPRESS是否压缩导出数据文件(N)可选
ENCRYPT导出数据是否加密 (N)可选
ENCRYPT_PASSWORD导出数据的加密密钥 和 ENCRYPT 同时使用可选
ENCRYPT_NAME导出数据的加密算法可选。 和 ENCRYPT 、 ENCRYPT_PASSWORD同时使用。缺省为 RC4
FILESIZE用于指定单个导出文件大小的上限。可以按字节 [B]、K[B]、M[B]、G[B]的方式指定大小可选
FILENUM多文件导出时,一个模板可以生成文件数,范围为 [1,99],默认 99可选
DROP导出后删除原表,但不级联删除 (N)可选
DESCRIBE导出数据文件的描述信息,记录在数据文件中可选
COL_DEFAULT_SEPARATE是否单独导出列默认值 (Y)可选
HELP显示帮助信息可选

02| dexp

1 指定导出文件名
-- 导出文件名为:db_str.dmp,可以指定为绝对路径或通过directory指定目录
./dexp userid=SYSDBA/SYSDBA file=db_str.dmp log=db_str.log FULL=y directory=/mnt/data/dexp
--等同于:file指定绝对路径后将忽略directory的路径
./dexp userid=SYSDBA/SYSDBA file=/mnt/data/dexp/db_str.dmp log=/mnt/data/dexp/db_str.log FULL=y 


例 2 指定导出文件的大小,并将备份自动扩展成多个;%U对于LOG也适用
./dexp USERID=SYSDBA/SYSDBA FILE=db_str%U.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp FILESIZE=128m


例 3 导出用户
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log OWNER=USER01 DIRECTORY=/mnt/data/dexp

例 4 导出schema
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dexp

例 5 导出表
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dexp

例 6 使用模糊匹配导出表,FUZZY_MATCH=Y表是支持模糊匹配
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log TABLES=OTHER.R% FUZZY_MATCH=Y


例 7 导出符合查询条件的数据
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log TABLES=OTHER.READER QUERY="WHERE AGE=19"8 使用并发线程导出数据 parallel,可设置为CPU核心数 N 或 N+1,范围1~100,缺省为1
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp PARALLEL=29 设置导出每张表使用的线程数 table_parallel,范围1~50,MPP模式下为单线程
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp TABLE_PARALLEL=310 exlude不导出某些对象,如约束,EXCLUDE=(<对象种类名>{,<对象种类名>}) 或者 EXCLUDE=TABLES:<表名>{,<表名>}  或者 EXCLUDE=SCHEMAS:<模式名>{,<模式名>}
-- <对象种类名>:包括 CONSTRAINTS、INDEXES、ROWS、TRIGGERS、GRANTS。
./dexp SYSDBA/SYSDBA FILE=/mnt/data/db_str.dmp LOG=db_str.log TABLES=table1,table2 EXCLUDE=/(CONSTRAINTS/)11 include指明包含的对象信息INCLUDE=TABLES:<表名>{,<表名>} 或INCLUDE=(<对象种类名>{,<对象种类名>})
-- <对象种类名>:包括 CONSTRAINTS、INDEXES、ROWS、TRIGGERS、GRANTS。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log TABLES=table1 DIRECTORY=/mnt/data/dexp INCLUDE=/(CONSTRAINTS,INDEXES/)12 不导出表中的数据/只导出表结构
-- CONSTRAINTS=N:设置不导出约束。可选参数。缺省该参数为 Y,导出约束。
-- TABLESPACE=Y:设置导出的对象定义中包含表空间。可选参数。缺省该参数为 N,不包含表空间。
-- GRANTS=N:设置不导出权限。可选参数。缺省该参数为 Y,导出权限。
-- INDEXES=N:设置不导出索引。可选参数。缺省该参数为 Y,导出索引。
-- TRIGGERS=N:设置不导出触发器。可选参数。缺省该参数为 Y,导出触发器。
-- ROWS=N:设置不导出数据。可选参数。缺省该参数为 Y,导出数据。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp NOLOGFILE=Y FULL=Y  DIRECTORY=/mnt/data/dexp ROWS=N


例 13 使用parafile 配置导出参数
./dexp USERID=SYSDBA/SYSDBA PARFILE=/mnt/data/dexp/para.txt’

cat >/mnt/data/dexp/para.txt<<-'EOF'
FILE=db_str.dmp
LOG=db_str.log
TABLES=table1
DIRECTORY=/mnt/data/dexp
EOF

03| dexpdp

语法同dexp,但是只能应用在服务端,并且需要创建逻辑路径和物理路径

1 创建逻辑目录和物理目录
mkdir E:\test\path 
--先连接上远程的数据库服务器 192.168.1.60:5236
disql.exe SYSDBA/SYSDBA@192.168.1.60:5236
--在远程服务器上创建目录
CREATE OR REPLACE DIRECTORY "GYFDIR" AS 'E:\test\path';2 dexpdp导出全库
--使用 dexpdp 导出文件
dexpdp.exe USERID=SYSDBA/SYSDBA@192.168.1.60:5236 FILE=dexpDP.dmp LOG=dexpDP.log FULL=Y DIRECTORY=GYFDIR


04| imp

1 导入文件
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log DIRECTORY=/mnt/data/dimp

例 2 将导出文件中的内容全部导入 full=y
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dimp


例 3 owner=user01,只导入user01的所有对象 
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log OWNER=USER01 DIRECTORY=/mnt/data/dimp


例 4 schemas=user01,只导出schema 为user01的对象
-- 一般情况下,OWNER 与 SCHEMAS 导入导出是相同的。但是用户可以包含多个模式,在这种情况下 SCHEMAS 的导入导出是OWNER 导入导出的一个子集。
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dimp


例 5 TABLES导入表
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dimp


例 6 PARALLEL 多线程导入
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log FULL=Y  DIRECTORY=/mnt/data/dimp PARALLEL=27 TABLE_PARALLEL 对每张表的导入都是用并发线程,必须和 FAST_LOAD=Y/N 参数一起使用才有效
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dimp TABLE_PARALLEL=38 ingnore=y 忽略导入时创建对象的错误
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dimp ignore=y


例 9 table_exists_action 处理导入时对象已存在时的动作,TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]10 EXCLUDE=(<对象种类名>{,<对象种类名>})
-- <对象种类名>:包括 CONSTRAINTS、INDEXES、ROWS、TRIGGERS、GRANTS
./dimp SYSDBA/SYSDBA FILE=/mnt/data/db_str.dmp LOG=db_str.log TABLES=table1,table2 EXCLUDE=/(CONSTRAINTS/)DIRECTORY=/mnt/data/dimp

例 11 
-- GRANTS=N:设置不导入权限。可选参数。缺省该参数为导入权限。
-- CONSTRAINTS=N:设置不导入约束。可选参数。缺省该参数为导入约束。
-- INDEXES=N:设置不导入索引。可选参数。缺省该参数为导入索引。
-- TRIGGERS=N:设置不导入触发器。可选参数。缺省该参数为导入触发器。
-- ROWS=N:设置不导入数据。可选参数。缺省该参数为导入数据。
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp NOLOGFILE=Y FULL=Y DIRECTORY=/mnt/data/dimp ROWS=N


例 12 INDEXFIRST=Y/N,INDEXFIRST 用于设置导入时是否先建索引;数据量比较大时,应该选择INDEXFIRST=Y,先创建索引再导入数据


例 13 remap_schema=schema_source:schema_target 将源模式中的数据导入到目标模式中。可选参数。
./dimp SYSDBA/SYSDBA FILE=/mnt/data/dexp/imp_exp.dmp DIRECTORY=/mnt/data/dimp FULL=Y REMAP_SCHEMA=SYSDBA:PERSON


例 14 打印导出的schema和表信息列表
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp SHOW=Y

/* 输出内容如下:
--------------------------------导出文件列表信息--------------------------------
共包含 1 个文件,文件如下:
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp SHOW=Y
----------------------------------------------------------------------------
- 导出文件为 FULL 方式导出,共包含以下 7 个模式
模式 PERSON 含有 4 个表,分别为:
ADDRESS ADDRESS_TYPE PERSON PERSON_TYPE
...
*/

二、物理备份还原

01| 说明

备份和恢复依赖归档日志,除了表备份还原,其他的联机备份与还原必须运行在归档模式下。

介质故障时如磁盘损坏,可以利用归档日志,恢复至上一次提交或指定时间

DM 数据库定义了多种归档方式,包括本地归档、实时归档、即时归档、异步归档和远程归档,其中本地归档和远程归档与备份还原密切相关

LSN:是由系统自动维护的bigint类型数值,具有自动递增、全局唯一的特点,每个LSN都代表着DM数据库内部产生的一个物理事务

物理事务(PTX):是数据库内一系列修改物理数据页的集合,和数据库中的事务概念相对应

1. LSN查询和说明

select * from v$rlog;
select * from v$RAPPLY_PARALLEL_INFO;

- CUR_LSN:系统已分配最大的LSN,物理事务提交时分配,每次分配CUR_LSN+1,再修改CUR_LSN=CUR_LSN+1
- FLUSH_LSN:已经发起日志刷盘请求,但还没有真正写入redo log的最大LSN值
- FILE_LSN:已经写入redo log的最大LSN值,每次将RLOG_PKG写入redo log后,修改此值
- CKPT_LSN:检查点LSN,所有LSN<=CKPT_LSN的物理事务产生的脏块,都已经落盘,并且这部分redo空间可以被覆盖
    - 数据库故障后重启,LSN<=CKPT_LSN的事务不需要重做
    
- APPLY_LSN:数据库还原恢复后已经写入redo log的RLOG_PKG的原始最大LSN值,此值取自源库原始日志包;DSC集群每个节点独立维护APPLY_LSN
- RPKG_LSN:数据库还原恢复后已经重演日志的最大LSN。DSC集群每个节点独立维护APPLY_LSN

2. redo刷盘时机

1)事务提交
2)redo日志包rlog_pkg满
3)检查点发生

检查点:是一个数据库事件,功能时安装数据页的修改顺序,一次将buffer缓冲区中的脏页写入磁盘,过程中动态调整CKPT_LSN值,释放日志空间
DM检查点分为两种:

  • 完全检查点:将内存缓冲区所有脏页写入磁盘,并调整CKPT_LSN,在数据库正常关闭时会产生完全检查点。
  • 部分检查点:根据dm.ini中的参数CKPT_FLUSH_RATE和CKPT_FLUSH_PAGES确定每次检查点刷脏页的数量
    • 执行部分检查点不影响DDL、DML操作,DM系统绝大多数情况下触发的都是部分检查点

redo 日志包(RLOG_PKG):是DM数据库保存redo日志的数据单元;一个RLOG_PKG中可以保存一个或多个PTX 产生的redo日志

  • RLOG_PKG具有自述性,日志包大小不固定,包头记录日志的控制信息,如类型,长度,LSN等
  • 相邻的LSN顺序总是递增的,如果开启并行日志,每一路的并行日志LSN递增,整体无序

3. 备份与归档的关系

DM的联机备份:数据库状态为正常运行,必须配置并开启本地归档
DM的脱机备份:数据库的状态为关闭,工具DMRMAN,必须配置本地归档

联机备份过程中,用户可以正常访问、修改数据库,为了准确记录备份过程中产生了哪 些 REDO 日志,确定日志备份范围,我们特别定义了下述几个包序号和 LSN:

  • 节点 BEGIN_LSN:为了保证备份的完整性和有效性,必须包含的归档日志起始 LSN 值。BEGIN_LSN = 备份开始时检查点偏移前一个 RLOG_PKG 的 max_lsn。
  • 节点 BEGIN_SEQ:BEGIN_SEQ 记录了 BEGIN_LSN 所在 Redo 日志包的序号。
  • 节点 END_LSN:为了保证备份的完整性和有效性,必须包含归档日志结束 LSN 值。END_LSN = 备份结束时 FILE_LSN。
  • 节点 END_SEQ:BEGIN_SEQ 记录了 END_LSN 所在 Redo 日志包的序号。
  • BAK_END_LSN:备份结束时,可以保证事务一致性的全局备份结束 LSN。
    单节点 BAK_END_LSN 等于 END_LSN;
    DSC 集群环境中,每个节点的 END_LSN 都不相同,BAK_END_LSN 大于等于最大的 END_LSN。

    如果 BEGIN_SEQ 等于 END_SEQ,则表明备份过程中,该节点没有任何数据被修改
    增量备份时要求 BEGIN_LSN 必须大于等于基准备份的 END_LSN
    如果不满足条件,则强制生成检查点,直到 BEGIN_LSN 满足条件为止。

4. 一致性备份和非一致性备份

  • 一致性备份:
    • 备份集包含完成的数据文件内容和归档信息;
    • 利用一个单独的备份集就可以将数据库恢复到备份时的状态
    • 不指定 without log 选项的联机备份生成的备份集就是一致性备份
    • 脱机备份一定是一致性备份(脱机备份会强制将检查之后的有效REDO日志拷贝到备份集,脱机备份集中不含任何redo日志)
  • 非一致性备份:
    • 只包含数据文件内容,没有归档日志信息
    • 非一致性备份还原的数据库,无法直接启动,必须借助归档日志来恢复
    • 指定了 without log 选项的联机备份集都是非一致性备份集

5. 全备和增备

按备份数据完整性划分为完全备份(也称为全备)和增量备份(简称增备)

  • 全备:备份集含(指定库或表空间)全部有效数据页;全备占用空间大, 且备份时间长
  • 增备
    • 在某个特定的备份集(这个备份集称为基备份,可以是全备或增备)基础上,收集数据库修改的数据页进行备份;占用空间小,速度快
    • 库级和表空间级备份支持增备
    • 表级备份不支持增备
    • 根据基备份的不同,DM增量备份又分为差异增量备份和累积增量备份
      • 差异增量备份:基备份可以是完全备份也可以是增量备份
        • 还原时要求基备份必须是完整的;如果基备份是增量备份,那么此增量备份的基备份也必须是完整的;任何增量备份的基础都是完全备份
      • 累计增量备份:基备份只能是完全备份集

6. 备份恢复工具

  • disql 工具(manager工具):执行联机数据备份和还原,包括数据库、归档、表空间、表
  • DMRMAN(console工具):执行脱机数控备份和还原,包括数据库、归档、表空间

7. 数据库的状态和备份

  • open:可以备份还原
  • mount:可归档备份
  • suspend:都不支持

8. 联机备份还原&脱机备份还原

联机备份
对联机备份的支持与限制:
1) MPP 环境仅允许库和归档备份,且各节点都会执行,生成相应的备份集,支持 DDL CLONE;
2)DSC 环境支持库备份、表空间备份和表备份,要求 DSC 环境的所有节点都处于 OPEN 状态;
3) MOUNT 状态仅支持归档备份;
4) SUSPEND 状态所有备份均不支持;
5) OPEN 状态支持所有备份,支持 DDL CLONE;
6) PRIMARY 模式支持所有备份,支持 DDL CLONE;
7) STANDBY 模式仅支持库级、表空间级和归档备份,支持 DDL CLONE;
8) DDL CLONE 必须备份归档,不允许指定 WITHOUT LOG。

联机还原: 使用SQL语句还原
仅支持表级还原,对联机还原的支持与限制:
1) MPP 和分布式数据库不支持;
2) PRIMARY 支持;
3) SUSPEND 状态所有还原均不支持;
4) OPEN/NORMAL 支持。

脱机备份
脱机备份支持库级和归档备份。
1) MPP 视同单机环境,仅当前节点执行备份操作;
2) 允许异常退出后备份,支持 DDL_CLONE;
3) DSC 支持库级备份,支持 DDL_CLONE;当 DSC 环境下正常节点的 CKPT_LSN 小于故障节点的 CKPT_LSN 时,不支持脱机备份。

脱机还原: 使用DMRMAN工具,目标库必须处于关闭状态
1) 脱机还原跟目标库所处的模式、状态以及集群环境(MPP 和 DSC)无关
2) 允许库级、表空间级和归档还原。


9. 归档

本地归档

  • 将redo日志写入本地归档日志文件
  • 已经配置本地归档的情况下,redo日志刷盘线程将redo log buffer 写入redo log 后,对应的RLOG_PKG由专门的归档线程负责写入本地归档日志文件中
  • 本地文档不能被覆盖
  • 可以配置归档日志空间上限,由系统自动删除早期归档日志
  • 由磁盘空间不足(或多路归档下第一路归档日志路径磁盘不足)导致的归档失败,系统自动挂起,有足够空间后,继续运行
  • 由于磁盘损坏导致归档日志写入失败,系统强制HALT

远程归档

  • 专用于DMDSC环境中
  • 必须采用双向配置方式,否则配置无效。即两个节点将自己的远程归档互相配置在对方机器上。
  • 集群中所有节点都拥有一套包括所有节点的,完整的归档日志文件
  • 配置方式有两种:
    • 共享本地归档的远程归档,本质是本地归档,更高效可靠
    • 通过MAL发送归档信息到远程节点并写入远程节点指定的归档目录中形成归档日志
  • 远程归档失败,远程归档将失效,不在发送redo到指定数据库实例;当节点间网络恢复、节点重启后,系统自动检测并恢复远程归档;但不会主动不起故障期间的redo 日志

切换归档

-- 切换归档 三选一
alter database archivelog current;
alter system archive log current;
alter system switch logfile;

10. 归档配置语法图

image.png
image.png

11. 备份语法图

image.png
image.png

02| 联机备份

1. 开归档

注意
1.使用 SQL 语句增加远程归档时,必须首先配置本地归档。
2.联机备份时,关闭已配置的本地归档之后再重新打开,会造成归档文件中 部分日志缺失,备份时检查归档文件连续性时将会报错。
存在该类操作时, 若要避免该错误,备份前需要调用 checkpoint(100)主动刷新检查点。

1)SQL语句开归档
--修改数据库为 MOUNT 状态
ALTER DATABASE MOUNT;
--配置本地归档
ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/dameng/arch_dsc0, TYPE = local, FILE_SIZE = 1024,SPACE_LIMIT = 2048,ARCH_FLUSH_BUF_SIZE=16,HANG_FLAG=1';
--配置远程归档
ALTER DATABASE ADD ARCHIVELOG 'DEST = DSC1, TYPE = REMOTE, FILE_SIZE = 1024,SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16, INCOMING_PATH = /dmdata/dameng/arch_dsc1';
--开启归档模式
ALTER DATABASE ARCHIVELOG;
--修改数据库为 OPEN 状态
ALTER DATABASE OPEN;

2)手动配置归档(配置参数文件)

适用于:数据库未启动状态下修改,或改后重启数据库

# 1. 修改dmarch.ini,如不存在,需手动创建,与dm.ini同目录
######本地归档参数配置##########
[ARCHIVE_LOCAL1] 
ARCH_TYPE = LOCAL 
ARCH_DEST = d:\dm_arch\arch
ARCH_FILE_SIZE = 1024 
ARCH_SPACE_LIMIT = 2048
ARCH_HANG_FLAG = 1

#######远程归档参数配置-DMDSC_01(仅DMDSC环境需要配置)########
ARCH_LOCAL_SHARE = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = +DMDATA/dameng/arch_dsc0   # DMDSC_02节点这里配置成DMDSC_01节点的 ARCH_INCOMING_PATH
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
ARCH_HANG_FLAG = 1
[ARCH_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = DSC1
ARCH_INCOMING_PATH =+DMDATA/dameng/arch_dsc1   # DMDSC_02节点这里配置成DMDSC_01节点的 ARCH_DEST
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0

# 2. 修改dm.ini,配置ARCH_INI=1
# 3. 重启数据库

2.备份库backupset

需要开归档

1)disql工具

备份目录:

  • 由 dm.ini 中 BAK_PATH指定
  • BAK_PATH为配置,则使用SYSTEM_PATH下的bak目录

备份参数:
FULL 全备,可以省略
INCREMENT 该参数用来指定执行的备份类型为增量备份,增备时参数不可省略
CUMULACTIVE 指定差异增量备份
WITH BACKUP 指定基备份的搜索目录,基备份在默认目录或当前目录可以省略

1 查看默认备份集的路径
SQL> select * from v$dm_ini t where t.PARA_NAME like 'BAK_PATH';
SQL> select * from v$parameter where name like '%SYSTEM_PATH%' or name like 'BAK_PATH';

LINEID     ID          NAME                      TYPE      VALUE             SYS_VALUE         FILE_VALUE        DESCRIPTION                              DEFAULT_VALUE ISDEFAULT  
---------- ----------- ------------------------- --------- ----------------- ----------------- ----------------- ---------------------------------------- ------------- -----------
1          3           SYSTEM_PATH               READ ONLY /dm8/5740/dm2     /dm8/5740/dm2     /dm8/5740/dm2     system path                              NULL          1
2          6           BAK_PATH                  READ ONLY /dm8/5740/dm2/bak /dm8/5740/dm2/bak /dm8/5740/dm2/bak backup file path                         NULL          12 创建数据库备份集(全备,FULL可以省略),存放到 "默认bak位置/db_bak_01" 目录下,也可以写绝对路径
SQL>BACKUP DATABASE BACKUPSET 'db_bak_01';SQL>BACKUP DATABASE FULL BACKUPSET '/home/dm_bak/db_full_bak_01';


# 查看生成的备份集,备份集文件无法直接查看
dmdba@dmteset 172.16.72.128 16:58:21 [pwd:/dm8/5740/dm2/bak]$ ll db_bak_01/
total 46956
-rw-r--r--. 1 dmdba dinstall    35840 Apr 27 16:54 db_bak_01_1.bak
-rw-r--r--. 1 dmdba dinstall 47919616 Apr 27 16:54 db_bak_01.bak
-rw-r--r--. 1 dmdba dinstall   119296 Apr 27 16:54 db_bak_01.meta3 创建备份集,备份集命名为“WEEKLY_FULL_BAK”
SQL>BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/home/dm_bak/db_bak_3_02';4 创建备份集,并为备份集添加描述信息为“完全备份”。
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_04' BACKUPINFO '完全备份';5 创建备份限制备份片大小为 300M。
SQL> BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_05' MAXPIECESIZE 300;6 执行备份压缩,压缩级别设置为 5SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_06' COMPRESSED LEVEL 5;7 创建并行备份,指定并行数为 8SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_bak_3_07' PARALLEL 8;8 创建增备
SQL>BACKUP DATABASE INCREMENT WITH BACKUPDIR '/home/dm_bak' BACKUPSET '/home/dm_bak/db_increment_bak_02';9 ddl_clone 仅备份数据库结构,不备份数据
backup database ddl_clone to backup20220523 backupset 'BACKUP_FILE_20220523';

3. 备份表空间

需要开归档
BASE ON BACKUPSET

  • 参数用于增量备份中,用来指定基备份集路径。如果不指定该 参数,会在备份搜索目录中搜索最近一次的完全备份或增量备份作为这次增量备份的基备份。
  • 若需要在特定的备份集基础上执行增量备份就需要使用该参数。

FULL 选项可以省略

# 备份main 表空间
SQL>BACKUP TABLESPACE MAIN BACKUPSET 'ts_full_bak_01';
SQL>BACKUP TABLESPACE MAIN INCREMENT BACKUPSET 'ts_increment_bak_01';
SQL>BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET 'ts_full_bak_01' BACKUPSET 'ts_increment_bak_02';

# 增备时指定基备份集路径
SQL>BACKUP TABLESPACE MAIN INCREMENT WITH BACKUPDIR '/home/dm_bak' BACKUPSET '/home/dm_bak/ts_increment_bak_02';

4. 备份表

不需要开归档

SQL>BACKUP TABLE TAB_01 BACKUPSET 'tab_bak_01';
SQL>BACKUP TABLE TAB_01 BACKUPSET '/home/dm_bak/tab_bak_01';

5. 备份归档

归档备份的前提:

  1. 归档文件的 db_magicpermanent_magic 值和库的 db_magicpermanent_magic 值必须相同;
  2. 服务器必须配置归档;
  3. 归档日志必须连续
  4. 数据库处于open或mount状态

如果归档出现不连续的情况,前面的连续部分会忽略,仅备份最新的连续部分。如果未收集到指定范围内的归档

  • 联机备份时显示“操作已执行”但实际并未备份,日志中记录相关警告信息;
  • 脱机备份时则直接报错。
  • 联机备份的时候经常会切换归档文件,最后一个归档总是空的,所以最后一个归档不会被备份。
SQL>BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01';

# 查看归档日志的LSN信息
SQL> select ARCH_LSN, CLSN, PATH from V$ARCH_FILE;

LINEID     ARCH_LSN             CLSN                 PATH                                                                          
---------- -------------------- -------------------- ------------------------------------------------------------------------------
1          86362                88797                /dm8/5740/dm2/arch_local/ARCHIVE_LOCAL1_0x369AD0F4_EP0_2022-04-22_15-04-41.log
2          88798                130137               /dm8/5740/dm2/arch_local/ARCHIVE_LOCAL1_0x369AD0F4_EP0_2022-04-22_15-04-58.log
3          130138               131401               /dm8/5740/dm2/arch_local/ARCHIVE_LOCAL1_0x369AD0F4_EP0_2022-04-26_15-57-17.log
4          131402               143687               /dm8/5740/dm2/arch_local/ARCHIVE_LOCAL1_0x369AD0F4_EP0_2022-04-26_16-07-40.log


# 通过LSN范围进行归档备份
SQL>BACKUP ARCHIVELOG LSN BETWEEN 50414 AND 50478 BACKUPSET '/home/dm_bak/arch_bak_time_14-78';

03| 脱机备份

使用DMRMAN工具,目标库必须处于关闭状态

不指定备份集默认使用系统参数 BAK_PATH 指定:
dmrman> backup database '/dm8/data/DAMENG/dm.ini';

-- 查看默认备份路径
select * from v$dm_ini t where t.PARA_NAME like 'BAK_PATH';

--指定备份路径: 
dmrman> backup database '/dm8/data/DAMENG/dm.ini' backupset 
'/dm8/backup/20210113_BAK';

dmrman CTLSTMT=" backup database '/home/dmdba/dm8/dm_home/bin/DAMENG/dm.ini' backupset 'bak_file'";

04| 联机还原

1. disql还原表

使用Disql执行还原

注:DIsql只能进行表的还原,表空间和库还原使用脱机工具DMRMAN。

  • 不需配置归档
  • 系统处于OPEN状态下
  • 表还原是联机完全备份还原,因此还原后不需要恢复
0)实验数据准备
================1. 数据准备 =====================
-- 执行DM测试库脚本导入测试数据
disql sysdba/SYSDBA:5236 \`1-CREATESCHEMA.sql
disql sysdba/SYSDBA:5236 \`2-CREATETABLE.sql
disql sysdba/SYSDBA:5236 \`3-INSERTSQL.sql

SQL> select NAME,CRTDATE from sysobjects where type$='SCH' and CRTDATE>trunc(sysdate);

行号     NAME       CRTDATE                   
---------- ---------- --------------------------
1          OTHER      2022-07-25 16:59:14.520264
2          PERSON     2022-07-25 16:59:14.511285
3          PURCHASING 2022-07-25 16:59:14.517675
4          RESOURCES  2022-07-25 16:59:14.507792
5          SALES      2022-07-25 16:59:14.513247

已用时间: 0.780(毫秒). 执行号:1005.


-- 查看表
SQL> select OWNER,TABLE_NAME from dba_tables where owner='PERSON';

行号     OWNER  TABLE_NAME  
---------- ------ ------------
1          PERSON ADDRESS
2          PERSON ADDRESS_TYPE
3          PERSON PERSON
4          PERSON PERSON_TYPE

create table PERSON.ADDRESS01 as select * from PERSON.ADDRESS;

-- 创建新的索引
create index PERSON.idx_ADDRESS01_ADDRESS1 on PERSON.ADDRESS01(ADDRESS1);

-- 查看当前的索引结构
SQL> select INDEX_OWNER,INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME from dba_ind_columns where TABLE_NAME='ADDRESS01' and TABLE_OWNER='PERSON';

行号     INDEX_OWNER INDEX_NAME             TABLE_OWNER TABLE_NAME COLUMN_NAME
---------- ----------- ---------------------- ----------- ---------- -----------
1          PERSON      idx_ADDRESS01_ADDRESS1 PERSON      ADDRESS01  ADDRESS1

-- 查看表结构
SQL> desc PERSON.ADDRESS;

行号     name       type$       nullable
---------- ---------- ----------- --------
1          ADDRESSID  INTEGER     N
2          ADDRESS1   VARCHAR(60) N
3          ADDRESS2   VARCHAR(60) Y
4          CITY       VARCHAR(30) N
5          POSTALCODE VARCHAR(15) N

已用时间: 5.949(毫秒). 执行号:1106.


-- 查看表数据
SQL> select count(*) from PERSON.ADDRESS01;

行号     COUNT(*)            
---------- --------------------
1          16

已用时间: 0.360(毫秒). 执行号:1507.

=================2. 备份表 ======================
-- 备份表
backup table PERSON.ADDRESS01  backupset '/dm8/dmbak/PERSON_ADDRESS01.bak';
drop table PERSON.ADDRESS01;

================3. 校验备份 ===================
-- 校验备份
select sf_bakset_check('DISK','/dm8/dmbak/PERSON_ADDRESS01.bak');

-- 输出
行号     sf_bakset_check('DISK','/dm8/dmbak/PERSON_ADDRESS01.bak')
---------- ---------------------------------------------------------
1          1

已用时间: 28.148(毫秒). 执行号:1500.
1)实验1:无表情况-备份恢复测试
restore table struct from backupset '/dm8/dmbak/PERSON_ADDRESS01.bak';
restore table PERSON.ADDRESS01 from backupset '/dm8/dmbak/PERSON_ADDRESS01.bak';

-- 恢复之后查询数据量
SQL>  select count(*) from PERSON.ADDRESS01;

行号     COUNT(*)            
---------- --------------------
1          16

已用时间: 0.550(毫秒). 执行号:1514
2)实验2:存在表-备份恢复数据

📢注意:存在和需要恢复数据的表同名的表时,此表必须和原表结构一致,否则将恢复失败

restore table struct from backupset '/dm8/dmbak/PERSON_ADDRESS01.bak';
restore table PERSON.ADDRESS01 from backupset '/dm8/dmbak/PERSON_ADDRESS01.bak';

-- 恢复之后查询数据量
SQL>  select count(*) from PERSON.ADDRESS01;

行号     COUNT(*)            
---------- --------------------
1          16

已用时间: 0.550(毫秒). 执行号:1514
3)实验3:将数据恢复到其他用户模式下
--1. 恢复表结构到原有的用户下,并根据原表结构在其他用下创建相同的表结构
SQL> restore table struct from backupset '/dm8/dmbak/PERSON_ADDRESS01.bak';
操作已执行
已用时间: 6.872(毫秒). 执行号:1524.
SQL> desc  PERSON.ADDRESS01;

行号     name       type$       nullable
---------- ---------- ----------- --------
1          ADDRESSID  INTEGER     Y
2          ADDRESS1   VARCHAR(60) Y
3          ADDRESS2   VARCHAR(60) Y
4          CITY       VARCHAR(30) Y
5          POSTALCODE VARCHAR(15) Y

已用时间: 1.028(毫秒). 执行号:1525.


--在新用户下创建表结构,和原表结构要一致
SQL> create table TESTUSER.ADDRESS01 as select * from PERSON.ADDRESS01 where 1=2;
操作已执行
已用时间: 5.312(毫秒). 执行号:1526.
SQL> 

--恢复数据到新的用户表下
SQL> restore table  TESTUSER.ADDRESS01 from backupset '/dm8/dmbak/PERSON_ADDRESS01.bak'; 
操作已执行
已用时间: 34.719(毫秒). 执行号:1527.

--验证数据
SQL> select count(*) from TESTUSER.ADDRESS01;

行号     COUNT(*)            
---------- --------------------
1          16

已用时间: 0.418(毫秒). 执行号:1528.

05| 表空间还原

  1. 表空间数据还原
    表空间还原只可以在脱机状态下执行。
    脱机时通过 DMRMAN 工具执行,对表空间状态 没有限制。
    表空间还原后如果表空间状态为 RES_OFFLINE,表明目标表空间已进行还原操作,但数据不完整
# 表空间备份文件校验
DMRMAN> check backupset '/dm8/data/DW01/bak/production_ts_full_bak_01';

# 转储表空间
RMAN> RESTORE DATABASE '/dm8/data/DW01/dm.ini' TABLESPACE PRODUCTION FROM BACKUPSET '/dm8/data/DW01/bak/production_ts_full_bak_01';

/* 输出如下:
RESTORE DATABASE '/dm8/data/DW01/dm.ini' TABLESPACE PRODUCTION FROM BACKUPSET '/dm8/data/DW01/bak/production_ts_full_bak_01';
file dm.key not found, use default license!
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[49640], file_lsn[49640]
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]                                 
restore successfully.
time used: 00:00:02.389
*/

# 恢复表空间
RMAN> RECOVER DATABASE '/dm8/data/DW01/dm.ini' TABLESPACE PRODUCTION;
/* 输出如下:
RECOVER DATABASE '/dm8/data/DW01/dm.ini' TABLESPACE PRODUCTION;
Database mode = 0, oguid = 0
Normal of FAST
Normal of DEFAULT
Normal of RECYCLE
Normal of KEEP
Normal of ROLL
EP[0]'s cur_lsn[52425], file_lsn[52425]
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]                               
recover successfully.
time used: 431.790(ms)
*/

06| 脱机数据库还原和恢复

  • 更新DB_MAGIC恢复
    • 当备份集为脱机备份即备份过程中无日志生成,可以直接更新DB_MAGIC 完成数据库恢复。
    • 如果有日志产生,还需进行下一步:从备份集恢复
  • 从备份集恢复
  • 从归档恢复

1. 更新DB_MAGIC恢复

恢复后必须更新db_magic ,否则无法开库


# 创建联机备份集
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

# 校验待还原备份集的合法性(如果确定合法该步可省略)    
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 
# 转储数据库
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' UPDATE DB_MAGIC; 

2. 从备份集恢复

如果备份集在备份过程中生成了日志,且这些日志在备份集中有完整备份(如联机数据库备份),在执行库还原后,可重做备份集中备份的日志,将数据库恢复到备份时的状态,即从备份集恢复。

# 创建联机备份集
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

# 校验待还原备份集的合法性(如果确定合法该步可省略)    
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 

# 转储数据库
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 

# 更新DB_MAGIC
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' UPDATE DB_MAGIC; 
# 从备份集恢复数据
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset'; 

3. 从归档恢复

从归档恢复是利用重做本地归档日志来恢复数据的过程。
允许恢复到指定的时间点及指定的LSN值。

# 创建联机备份集
SQL>BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

# 校验待还原备份集的合法性(如果确定合法该步可省略)    
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 

# 转储数据库
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_restore'; 

# 查看备份集的数据库信息,获取源库的DB_MAGIC。
RMAN>SHOW BACKUPSET '/home/dm_bak/db_full_bak_for_recover_arch' INFO DB;

# 恢复到指定的DB_MAGIC
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR'/home/dm_arch/arch' USE DB_MAGIC 1447060265;

# 恢复到指定的时间点
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH 
ARCHIVEDIR'/home/dm_arch/arch' USE DB_MAGIC 1447060265 UNTIL TIME'2015-11-16 10:56:40.624931'; 

# 恢复到指定的LSN,可以从v$rlog中查看LSN值
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH 
ARCHIVEDIR'/home/dm_arch/arch' USE DB_MAGIC 1447060265 UNTIL LSN 50857;

三、console工具备份

image.png
查看备份集
image.png
添加备份目录(仅对当前会话生效)
SF_BAKSET_BACKUP_DIR_ADD(‘DISK’,‘/dm8/backup’);
image.png

备份集查看

select * from * SYS."V$BACKUPSET";
select * from "V$BACKUPSET_DBINFO";
select * from SYS."V$BACKUPSET_DBF";

image.png

四、manager工具备份

image.png

表空间备份(注意:DM8 表空间是联机备份,脱机还原恢复)

SQL > backup tablespace DMHR BACKUPSET  '/dm8/backup/20200113_DMHR_onlinebak';
 


控制台工具表空间备份:
image.png

控制台工具表空间还原(删除数据库文件测试):
image.png
image.png

五、管理备份

01| 相关视图和函数

备份管理相关系统过程与函数总结如下:
SF_RMAN_ADD_BACKUP_DIR:添加备份目录。 
SF_RMAN_REMOVE_BACKUP_DIR:指定删除内存中的备份目录。
SF_RMAN_REMOVE_BACKUP_DIR_ALL:删除内存中全部的备份目录。
SF_RMAN_BAKSET_CHECK:校验指定的备份文件。
SF_RMAN_BAKSET_REMOVE:删除指定的备份集。
SP_RMAN_BATCH_DEL_DB_BAKSET:批量删除数据库备份集。
SP_RMAN_BATCH_DEL_TS_BAKSET:批量删除表空间备份集。
SP_RMAN_BATCH_DEL_TAB_BAKSET:批量删除表备份集。


备份管理相关动态视图总结如下: 
V$BACKUPSET:显示备份集基本信息。 
V$BACKUPSET_DBINFO:显示备份集的数据库相关信息。 
V$BACKUPSET_DBF:显示备份集中数据文件的相关信息。 
V$BACKUPSET_ARCH:显示备份集的归档信息。 
V$BACKUPSET_RLOG:显示备份集的日志信息。
V$BACKUPSET_BKP:显示备份集的备份片信息。 
V$BACKUPSET_SEARCH_DIRS:显示备份集搜索目录。 
V$BACKUPSET_TABLE:显示表备份集中备份表信息。 
V$BACKUPSET_INDEX:显示表备份集中备份索引信息。 
V$BACKUPSET_SUBS:显示并行备份中生成的子备份集信息。

02| 管理备份

管理备份备份集查看备份集校验备份集删除

--相关系统函数
SF_RMAN_ADD_BACKUP_DIR:添加备份目录。 
SF_RMAN_REMOVE_BACKUP_DIR:指定删除内存中的备份目录。
SF_RMAN_REMOVE_BACKUP_DIR_ALL:删除内存中全部的备份目录。
SF_RMAN_BAKSET_CHECK:校验指定的备份文件。
SF_RMAN_BAKSET_REMOVE:删除指定的备份集。
SP_RMAN_BATCH_DEL_DB_BAKSET:批量删除数据库备份集。
SP_RMAN_BATCH_DEL_TS_BAKSET:批量删除表空间备份集。
SP_RMAN_BATCH_DEL_TAB_BAKSET:批量删除表备份集。 



-- 1、查看备份集信息:
RMAN>SHOW BACKUPSET '/home/dm_bak/db_bak_for_show_01';


-- 2、校验特定备份集:
RMAN>CHECK BACKUPSET 'db_bak_for_check_02' DATABASE '/opt/dmdbms/data/DAMENG/dm.ini'; 


-- 3、删除备份集:
RMAN>REMOVE BACKUPSET '/home/dm_bak/db_bak_for_remove_01'; 


-- 4.管理备份批量删除所有备份集:
RMAN>REMOVE BACKUPSETS WITH BACKUPDIR '/home/dm_bak'; 


-- 5.批量删除指定时间之前的备份集:
RMAN>REMOVE BACKUPSETS WITH BACKUPDIR '/home/dm_bak' UNTIL TIME'2015-11-1 00:00:00'; 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值