目录
一、环境信息
名称 | 值 |
CPU | 12th Gen Intel(R) Core(TM) i7-12700H |
操作系统 | CentOS Linux release 7.9.2009 (Core) |
内存 | 4G |
逻辑核数 | 4 |
DM版本 | 1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Version: 12 5 Gsu level(5) cnt: 0 |
二、说点什么
数据库是装载数据的容器,其中保存的数据才是重中之重,所以数据库的备份和恢复方法就显得格外重要,今天我们来介绍一下达梦数据库的库级物理备份恢复。
三、概念
1、备份恢复
DM 数据库中的数据存储在数据库的物理数据文件中,数据文件按照页、簇和段的方式进行管理,数据页是最小的数据存储单元。任何一个对 DM 数据库的操作,归根结底都是对某个数据文件页的读写操作。
因此,DM 备份的本质就是从数据库文件中拷贝有效的数据页保存到备份集中,这里的有效数据页包括数据文件的描述页和被分配使用的数据页。而在备份的过程中,如果数据库系统还在继续运行,这期间的数据库操作并不是都会立即体现到数据文件中,而是首先以日志的形式写到归档日志中,因此,为了保证用户可以通过备份集将数据恢复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中。
还原与恢复是备份的逆过程。还原是将备份集中的有效数据页重新写入目标数据文件的过程。恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务,这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM 数据库自动进行回滚。
2、重做日志
重做日志,又叫 REDO 日志,忠实记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。数据库中 INSERT、DELETE、UPDATE等 DML 操作以及 CREATE TABLE 等 DDL 操作最终都会转化为对某些数据文件、某些数据页的修改。因此,在系统故障重启时,通过重做 REDO 日志,可以将数据库恢复到故障时的状态。
DM 数据库默认包含两个扩展名为 log 的日志文件,用来保存 REDO 日志,称为联机重做日志文件。这两个文件循环使用。任何数据页从内存缓冲区写入磁盘之前,必须保证其对应的 REDO 日志已经写入到联机日志文件。
REDO 日志包(RLOG_PKG)是 DM 数据库保存 REDO 日志的数据单元,一个日志包内可保存一个或多个 PTX 产生的 REDO 日志。日志包具有自描述的特性,日志包大小不固定,采用固定包头和可变包头结合的方式,包头记录日志的控制信息,包括类型、长度、包序号、LSN 信息、产生日志的节点号、加密压缩信息、日志并行数等内容。
日志包生成时按照序号连续递增,相邻日志包的 LSN 顺序是总体递增的,但是在DMDSC 集群环境下不一定连续。如果未开启并行日志,RLOG_PKG 包内日志的 LSN 是递增的。如果开启并行日志,一个 RLOG_PKG 包内包含多路并行产生的日志,每一路并行日志的 LSN 是递增的,但是各路之间的 LSN 并不能保证 LSN 有序,因此并行日志包内 LSN 具有局部有序,整体无序的特点。
3、归档日志
DM 数据库可以在归档和非归档两种模式下运行。DM 支持多种归档方式。
系统在归档模式下运行会更安全,当出现介质故障,如磁盘损坏导致数据文件丢失、异常时,利用归档日志,系统可以恢复至故障发生的前一刻。因此,为了保证归档日志文件和数据文件不同时出现问题,建议将归档目录与数据文件配置、保存到不同的物理磁盘上。除了表备份还原,其他的联机备份与还原必须运行在归档模式下。
DM 数据库支持的归档方式包括:包括本地归档、实时归档、即时归档、异步归档和远程归档。其中本地归档和远程归档与备份还原密切相关。系统将 REDO 日志写入联机日志文件后,根据归档的配置情况,异步地将 REDO 日志写入本地归档日志文件。
4、LSN
LSN(Log Sequence Number)是由系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 PTX)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性。DM 数据库中与LSN相关的信息,可以通过查询V$RLOG和V$RAPPLY_PARALLEL_INFO表来获取。
DM 主要包括以下几种类型的 LSN:
名称 | 描述 |
CUR_LSN | 系统已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值,大小等于 CUR_LSN + 1,然后再修改CUR_LSN=CUR_LSN+1。 |
FLUSH_LSN | 已经发起日志刷盘请求,但还没有真正写入联机 REDO 日志文件的最大 LSN 值。 |
CKPT_LSN | 检查点 LSN,所有 LSN <= CKPT_LSN 的物理事务修改的数据页,都已经从 Buffer 缓冲区写入磁盘,CKPT_LSN 由检查点线程负责调整。 数据库故障重启时,CKPT_LSN 之前的 REDO 日志不需要重做,只需要从 CKPT_LSN+1开始重做 REDO 日志,就可以将系统恢复到故障前状态。并且,在联机重做日志文件中,LSN值<=CKPT_LSN 的 REDO 日志都可以被覆盖。 |
APPLY_LSN | 数据库还原恢复后已经写入联机 REDO 日志文件的日志包的原始最大 LSN 值,APPLY_LSN 取自源库的原始日志包中的最大 LSN 值。DSC 集群的每一个节点独立维护 APPLY_LSN。 |
FILE_LSN | 已经写入联机 REDO 日志文件的最大 LSN 值。每次将 REDO 日志包 RLOG_PKG 写入联机 REDO 日志文件后,都要修改 FILE_LSN 值。 |
RPKG_LSN | 数据库还原恢复后已经重演日志的最大 LSN。DSC 集群的每一个节点独立维护 RPKG_LSN。 |
5、检查点
DM 数据库运行过程中,用户的所有操作都在内存中进行。每修改一条记录都必须先把记录所在的数据页加载到 BUFFER 缓冲区中,然后进行修改。事务运行时,会把生成的 REDO日志保留在 REDO 日志包 RLOG_PKG 中,每条日志记录对应一个 LSN,当事务提交或 REDO日志包满或执行检查点时会进行日志刷盘。
检查点(checkpoint)是一个数据库事件,它的功能是按照数据页的修改顺序,依次将 BUFFER 缓冲区中的脏页写入磁盘,并在这个过程中动态调整 CKPT_LSN 值,释放日志空间。
DM 的检查点分为两种:
名称 | 描述 |
完全检查点 | 会将内存缓冲区中的所有脏页写入磁盘,并调整 CKPT_LSN,在数据库正常关闭时会产生一个完全检查点。 |
部分检查点 | 根据 dm.ini 配置文件中的参数CKPT_FLUSH_RATE和CKPT_FLUSH_PAGES,确定每次检查点刷脏页的数量。执行部分检查点的过程中,DDL/DML 操作都可以正常执行,DM 系统中绝大多数情况下触发的都是部分检查点。 数据库运行过程中产生的待写入日志首先写入 REDO 日志包 RLOG_PKG,当日志刷盘时一起写入联机日志文件中。在联机日志文件中,可以覆盖写入 REDO 日志的文件长度为可用日志空间;不能被覆盖的 REDO 日志,系统故障重启需要重做的 REDO 日志为有效日志,有效日志的 LSN 取值范围是(CKPT_LSN,FILE_LSN]。 |
下图说明了联机日志文件、REDO 日志包 RLOG_PKG 以及相关各 LSN 之间的关系。
四、语法
1、BACKUP DATABASE
BACKUP DATABASE [<备份类型>] [TO | BACKUPNAME <备份名>] [<备份集路径子句>]
[DEVICE TYPE <介质类型> [PARMS '<介质参数>']] [<指定备份集子句>]
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[LIMIT <read_limit>|<write_limit>]
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION <TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]] [WITHOUT LOG][WITHOUT MIRROR]
[TRACE FILE '<TRACE 文件名>'] [TRACE LEVEL <TRACE 日志级别>]
[TASK THREAD <线程数>][PARALLEL [<并行数>] [READ SIZE <拆分块大小>]];
<备份类型>::= FULL|
[FULL] DDL_CLONE|
[FULL] SHADOW|
INCREMENT <increment_statement>
<increment_statement>::= [FROM LSN <lsn>] | <inc_sub_statement>
<inc_sub_statement>::= [CUMULATIVE][<指定基备份子句>]
<指定基备份子句>::=BASE ON BACKUPSET '<基备份目录>'
<备份集路径子句>::= BACKUPSET '<备份集路径>' |
FORMAT '<备份集路径格式串>'
<指定备份集子句>::= WITH BACKUPDIR ‘<备份集搜索路径>’{,‘<备份集搜索路径>’}
<read_limit>::= READ SPEED <读速度上限> [WRITE SPEED <写速度上限>]
<write_limit>::= WRITE SPEED <写速度上限>
参数 | 描述 |
备份类型 | 分为完全备份 FULL 和增量备份 INCREMENT 两种。缺省为 FULL。 (1)FULL:表示完全备份。完全备份生成的备份集包含了指定库(或者表空间)的全部有效数据页。在完全备份中又可以具体指定为 DDL_CLONE 或 SHADOW,此时 FULL 可缺省。DDL_CLONE 或 SHADOW 备份的内容是完全备份的子集。 (2)DDL_CLONE:数据库克隆。该参数只能用于完全备份中,表示仅拷贝所有的元数据不拷贝数据。如对于数据库中的表来说,只备份表的定义不备份表中数据。表空间和表备份不支持该参数。数据库克隆必须备份日志。 (3)SHADOW:影子备份。该参数只能用于完全备份中,表示生成影子备份集,只备份源库的 SYSTEM.DBF 及日志相关信息。表空间和表备份不支持该参数。影子备份必须备份日志。影子备份集用于还原成影子库,影子库部署在多副本集群中。 (4)INCREMENT:表示增量备份,若要执行增量备份必须指定该参数。 |
TO/BACKUPNAME | 指定生成备份名称。若未指定,系统随机生成,默认备份名格式为:DB_备份类型_备份时间。其中,备份时间为开始备份时的系统时间。例如:DB_FULL_20240206_143057_123456 表明该备份集为 2024 年 2 月 6 日 14 时 30 分 57秒 123456 毫秒时生成的数据库完全备份集。备份名区分大小写,且不允许包含转义字符“%” |
BACKUPSET | 指定当前备份集生成目录。若指定为相对路径,例如 BACKUPSET 'db_bak_01',则在默认备份目录(即 BAK_PATH 配置的路径)中生成备份集。 若不指定,则在默认备份目录中按约定规则,生成默认备份集目录。库级备份默认备份集目录名与备份名相同。 若指定的 BACKUPSET 超长使得备份集中元数据文件或备份片文件的绝对路径长度超过 256 个字节将报错文件路径名过长。 如果是并行备份,则需要保证子备份集中元数据文件和备份片文件的绝对路径长度均不超过 256 个字节。 |
FORMAT | 指定备份集路径格式串。执行备份时,按一定规则替换格式串中的占位符生成备份集路径。如果解析该参数得到的路径为相对路径,则在默认备份目录中生成备份集。 %I 数据库魔数 %P 数据库持久魔数 %s 备份集魔数 %d 数据库名称 %N 表空间名称 %L 表名称 %c 生成备份集的通道 ID,仅通道的 FORMAT 配置有效 %Y 备份时间的年,格式为 YYYY %M 备份时间的月,格式为 MM %D 备份时间的日,格式为 DD %T 备份时间的年月日,格式为 YYYYMMDD %H 备份时间的小时+分钟+秒 %S 备份时间的毫秒 %t 备份集时间戳,格式为%T_%H_%S %R 备份范围。DB:库备份;TS:表空间备份;TAB:表备份;ARCH:归档备份;SPFILE:镜像备份 %E 备份类型。FULL:完全备份;INCREMENT:增量备份 %U 根据备份范围,默认是%R_%d_%E_%t 等形式,通道配置的Format 最后添加_%c |
DEVICE TYPE | 指存储备份集的介质类型,支持 DISK 和 TAPE,默认 DISK。 |
PARMS | 只对介质类型为 TAPE 时有效。 |
BACKUPINFO | 备份的描述信息。最大不超过 256 个字节。 |
MAXPIECESIZE | 最大备份片文件大小上限,以 MB 为单位,最小 128MB,32 位系统最大 2GB,64 位系统最大 128GB。缺省为最大取值。 |
LIMIT | 指定备份时最大的读写文件速度,单位为 MB/S,默认为 0,表示无速度限制。 |
IDENTIFIED BY | 指定备份时的加密密码。 密码可以用双引号括起来,这样可以避免一些特殊字符 通不过语法检测 。密码的设置规则遵从INI参数PWD_POLICY 和PWD_MIN_LEN 指定的口令策略。 |
WITH ENCRYPTION | 指定加密类型,取值范围 0、1、2。 0:表示不加密,不对备份文件进行加密处理; 1:表示简单加密,对备份文件设置口令,但文件内容仍以明文方式存储; 2:表示完全数据加密,对备份文件进行完全的加密,备份文件以密文方式存储。 缺省值为 1,当不指定 WITH ENCRYPTION 子句时,采用简单加密。 |
ENCRYPT WITH | 指定加密算法。当不指定 ENCRYPT WITH 子句时,使用 AES256_CFB加密算法。 支持的内置加密算法包括: DES_ECB、DES_CBC、DES_CFB、DES_OFB、DESEDE_ECB、 DESEDE_CBC、DESEDE_CFB、DESEDE_OFB、AES128_ECB、 AES128_CBC、AES128_CFB 、AES128_OFB、AES192_ECB、 AES192_CBC、AES192_CFB 、AES192_OFB、AES256_ECB、 AES256_CBC、AES256_CFB 、AES256_OFB 、RC4 支持的现有第三方加密算法包括: OPENSSL_SM4_ECB、OPENSSL_SM4_CBC、OPENSSL_SM4_CFB、OPENSSL_SM4_OFB、OPENSSL_SM4_CFB_V1、OPENSSL_SM4_OFB_V1 |
COMPRESSED | 是否对备份数据进行压缩处理。 LEVEL 表示压缩等级,取值范围 0~9: 0 表示不压缩; 1 表示 1 级压缩; 9 表示 9 级压缩。 压缩级别越高,压缩速度越慢,但压缩比越高。若指定COMPRESSED,但未指定LEVEL,则压缩等级默认1;若未指定COMPRESSED,则默认不进行压缩处理。 |
WITHOUT LOG | 联机数据库备份是否备份联机日志。 如果使用,则表示不备份,否则表示备份。 如果使用了 WITHOUT LOG 参数,则使用 DMRMAN 工具还原时,必须指定 WITH ARCHIVEDIR 参数。 |
WITHOUT MIRROR | 联机数据库备份是否备份镜像文件。如果使用,则表示不备份,否则表示备份。 |
TRACE FILE | 指定生成的 TRACE 文件。 启用 TRACE,但不指定 TRACE FILE 时,默认在 DM 数据库系统的 log 目录下生成 DM_SBTTRACE_年月日_时_分_秒.log 文件; 若使用相对路径,则生成在执行码同级目录下; 若用户指定 TRACE FILE,则指定的文件不能为已经存在的文件,否则报错。 TRACE FILE 不可以为 ASM 文件。 |
TRACE LEVEL | 是否启用 TRACE。 有效值 1、2,默认为 1 表示不启用 TRACE; 为 2 启用 TRACE 并在 TRACE 文件中写入 TRACE 相关内容。 |
TASK THREAD | 备份过程中数据处理过程线程的个数,取值范围 0~64,默认为 4。 若指定为 0,则调整为 1; 若指定超过当前系统主机核数,则调整为主机核数。 线程数(TASK THREAD)*并行数(PARALLEL)不得超过 512。 |
PARALLEL | 指定并行备份的并行数和拆分块大小。 并行数取值范围 0~128。 若不指定并行数,则默认为 4,若指定为 0 或者 1 均认为非并行备份。 若未指定关键字 PARALLEL,则认为非并行备份。 并行备份不支持存在介质为 TAPE 的备份。 线程数(TASK THREAD)*并行数(PARALLEL)不得超过 512。 READ SIZE 指定并行备份大数据量的数据文件时的拆分块大小,默认为 1GB,最小为 512MB,当指定的拆分块大小小于 512MB 时,系统会自动调整为 512MB。 若指定并行备份,但未指定拆分块大小,则直接使用默认拆分块大小进行拆分。 当数据文件的大小小于拆分块大小时,不执行拆分; 当数据文件的大小大于拆分块大小时,执行拆分。 并行数不能大于拆分之后的总块数。 |
FROM LSN | 用于增量备份中,指定备份的起始 LSN。起始 LSN 必须小于等于检查点 LSN,用户可以手动刷新检查点 LSN。仅支持库级增量备份。 |
CUMULATIVE | 用于增量备份中,指明为累积增量备份类型,若不指定则缺省为差异增量备份类型。 |
WITH BACKUPDIR | 用于增量备份中,指定基备份的搜索目录,最大长度为 256 个字节。 若缺省,自动在以下路径中搜索:默认备份目录(即 BAK_PATH 配置的路径)、当前备份集目录(即 BACKUPSET 指定的路径,例如 BACKUPSET 'D:\ bakrman\db_bak'的路径)、当前备份集目录的上一级目录(例如'D:\bakrman')搜索基备份。 如果基备份不在上述路径下,增量备份必须指定该参数。 |
BASE ON BACKUPSET | 用于增量备份中,指定基备份集路径。 |
READ SPEED | 备份时读速度上限,取值范围 0~2147483647,单位为 MB/S,0 表示无限制。 |
WRITE SPEED | 备份时写速度上限,取值范围 0~2147483647,单位为 MB/S,0 表示无限制。 |
2、DMRMAN RESTORE DATABASE
RESTORE DATABASE <restore_type> <from_clause>
[<device_type_stmt>]
[IDENTIFIED BY <密码>|"<密码>" [ENCRYPT WITH <加密算法>]]
[WITH BACKUPDIR '<基备份搜索目录>'{,'<基备份搜索目录>'}]
[MAPPED FILE '<映射文件路径>'][TASK THREAD <任务线程数>]
[RENAME TO '<数据库名>'] [USE BAK_MAGIC <DPC 备份集魔数>];
<restore_type>::=<type1>|<type2>
<type1>::='<ini_path>' [TO SHADOW] [WITH CHECK] [REUSE DMINI] [WITHOUT SPACE] [WITHOUT
MIRROR] [AUTO EXTEND] [OVERWRITE]
<type2>::= TO '<system_dbf_dir>' [TO SHADOW] [WITH CHECK] [OVERWRITE] [WITHOUT
MIRROR]
<from_clause>::= FROM BACKUPSET '<备份集路径>' |
FROM BACKUPNAME <备份名>
<device_type_stmt>::= DEVICE TYPE <介质类型> [PARMS '<介质参数>']
名称 | 描述 |
DATABASE | 指定还原目标库的 dm.ini 文件路径或 system.dbf 文件路径。 |
BACKUPSET | 指定用于还原目标数据库的备份集路径。若指定为相对路径,会在默认备份目录下搜索备份集。 |
BACKUPNAME | 指定用于还原目标数据库的备份名称,在备份集搜索目录下搜索备份集。 |
DEVICE TYPE | 指存储备份集的介质类型,包括 DISK 和 TAPE,默认为 DISK。 |
PARMS | 介质参数,只对介质类型为 TAPE 时有效。 |
IDENTIFIED BY | 指定备份时使用的加密密码,供还原过程解密使用。 密码可以用双引号括起来,这样可以避免一些特殊字符通不过语法检测。 密码的设置规则遵从 INI 参数PWD_POLICY 和 PWD_MIN_LEN 指定的口令策略。 |
ENCRYPT WITH | 指定备份时使用的加密算法,供还原过程解密使用,若未指定,则使用默认算法 AES256_CFB。具体参考BACKUP DATABASE。 |
WITH BACKUPDIR | 用于增量备份的还原中,指定基备份的搜索目录。 用于增量备份还原中,指定基备份的搜索目录,最大长度为 256 个字节。 若缺省,自动在以下路径中搜索:CONFIGURE ADD 语句添加的搜索目录、当前备份集目录的上一级目录(例如:当前增量备份集目录为 BACKUPSET 'D:\ bakrman\db_bak'的路径,则上一级目录为'D:\bakrman')搜索基备份。 如果基备份不在上述路径下,增量备份必须指定该参数。 |
MAPPED FILE | 指定存放还原目标路径的映射文件路径。 当参数 BACKUPSET 指定的路径和 MAPPED FILE 中指定的路径不一致时,以 MAPPED FILE 中指定的路径为主。 |
TASK THREAD | 指定还原过程中用于处理解压缩和解密任务的线程个数。 若未指定,则默认为 4; 若指定为 0,则调整为 1; 若指定超过当前系统主机核数,则调整为主机核数。 |
RENAME TO | 指定还原数据库后是否更改库的名字,若指定该参数则将还原后的库改为指定的数据库名,默认使用备份集中的 db_name 作为还原后库的名称。 |
USE BAK_MAGIC | 指定 DPC 备份集魔数,若不指定,则默认为 0。 使用备份集进行还原恢复时指定的 BAK_MAGIC 需要与备份集的 BAK_MAGIC一致,用户可通过 DMRMAN工具的 SHOW BACKUPSET 命令查看备份集的 BAK_MAGIC。 该参数仅在 DMDPC 环境下有效。 |
TO SHADOW | 指定该关键字,将目标库还原成影子库。 |
WITH CHECK | 指定还原前校验备份集数据完整性。缺省不校验。 |
WITHOUT SPACE | 指定还原数据库时不再为数据文件尾部未使用的数据页分配磁盘,不指定则默认分配。 |
WITHOUT MIRROR | 指定还原数据库时不还原镜像文件,不指定则默认进行还原。 |
AUTO EXTEND | 还原数据库时设置文件自动拓展,避免指定 WITHOUT SPACE 关键字后,由于源库未设置文件自动拓展,从而导致恢复过程或从 DDL_CLONE 库还原后更新DB_MAGIC 时存储空间不足。 |
OVERWRITE | 还原数据库时,存在重名的数据文件时,是否覆盖重建,不指定则默认错。 |
3、DMRMAN RECOVER DATABASE
RECOVER DATABASE '<ini_path>'
WITH ARCHIVEDIR '<归档日志目录>'{,'<归档日志目录>'}
[USE DB_MAGIC <db_magic>] [UNTIL TIME '<时间串>'] [UNTIL LSN <LSN>]; |
RECOVER DATABASE '<ini_path>' [FOR STANDBY] <from_clause> [<device_type_stmt>]
[IDENTIFIED BY <密码>|"<密码>" [ENCRYPT WITH <加密算法>]][USE BAK_MAGIC <DPC 备份集魔数>];
<from_clause>::= FROM BACKUPSET '<备份集路径>' |
FROM BACKUPNAME <备份名>
<device_type_stmt>::= DEVICE TYPE <介质类型> [PARMS '<介质参数>']
参数 | 描述 |
DATABASE | 指定还原库目标的 dm.ini 文件路径。 |
WITH ARCHIVEDIR | 本地归档日志搜索目录。 |
USE DB_MAGIC | 指定本地归档日志对应数据库的 DB_MAGIC,若不指定,则默认使用目标数据库的 DB_MAGIC。 |
UNTIL TIME | 恢复数据库到指定的时间点。 如果指定的结束时间早于备份结束时间,忽略 UNTIL TIME 参数,重做所有小于备份结束 LSN(END_LSN)的 REDO 日志,将系统恢复到备份结束时间点的状态,此时并不能精确恢复到 END_LSN,只能保证重演到 END_LSN之后的第一个时间戳日志,该日志对应的 LSN 值略大于 END_LSN。 |
UNTIL LSN | 恢复数据库到指定的 LSN。 如果指定的 UNTIL LSN 小于备份结束 LSN(END_LSN),则报错。 |
FOR STANDBY | 将目标库作为备库恢复,重演 redo 日志时确保重演完整日志包,确保启动后能正确加入数据守护集群。 |
BACKUPSET | 指定用于恢复目标数据库的备份集目录。 |
BACKUPNAME | 指定用于恢复目标数据库的备份名称,在备份集搜索目录下搜索备份集。 |
DEVICE TYPE | 指存储备份集的介质类型,包括 DISK 和 TAPE,默认为 DISK。 |
PARMS | 介质参数,只对介质类型为 TAPE 时有效。 |
IDENTIFIED BY | 指定备份时使用的加密密码,供恢复过程解密使用。 密码可以用双引号括起来,这样可以避免一些特殊字符通不过语法检测。 密码的设置规则遵从 INI 参数PWD_POLICY 和 PWD_MIN_LEN 指定的口令策略。 |
ENCRYPT WITH | 指定备份时使用的加密算法,供恢复过程解密使用,若未指定,则使用默认算法 AES256_CFB。具体参考BASCKUP DATABASE。 |
USE BAK_MAGIC | 指定 DPC 备份集魔数,若不指定,则默认为 0。 |
4、DMRMAN UPDATE DB_MAGIC
RECOVER DATABASE '<ini_path>' UPDATE DB_MAGIC;
参数 | 描述 |
DATABASE | 指定还原库目标的 dm.ini 文件路径。 |
五、实验
1、开归档
(1)ARCH_INI参数修改
[root@bogon DAMENG]# cat dm.ini |grep ARCH_INI
ARCH_INI = 1 #dmarch.ini
(2)dmarch.ini文件配置
[root@bogon DAMENG]# cat dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /opt/Dm8/SingleData/DAMENG/Arch #本地归档文件存放路径
ARCH_FILE_SIZE = 1024 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 2048 #单位 Mb,0 表示无限制,范围 1024~2147483647M
(3)重启数据库
[root@bogon DAMENG]# systemctl restart DmServiceSingleDb
2、AP服务启动
[root@bogon DAMENG]# systemctl start DmAPService
3、测试数据
SQL> CREATE TABLESPACE SUN_TBS DATAFILE 'SUN.DBF' SIZE 200 AUTOEXTEND ON;
操作已执行
已用时间: 33.275(毫秒). 执行号:601.
SQL> CREATE USER SUN IDENTIFIED BY qwer1234S DEFAULT TABLESPACE SUN_TBS;
操作已执行
已用时间: 15.530(毫秒). 执行号:601.
SQL> GRANT DBA TO SUN;
操作已执行
已用时间: 11.079(毫秒). 执行号:602.
SQL> CREATE TABLE SUN.MOON(A INT);
操作已执行
已用时间: 26.959(毫秒). 执行号:603.
SQL> INSERT INTO SUN.MOON SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 6;
影响行数 6
已用时间: 5.294(毫秒). 执行号:604.
SQL> COMMIT;
操作已执行
已用时间: 1.719(毫秒). 执行号:605.
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
6 rows got
已用时间: 2.195(毫秒). 执行号:606.
4、全库备份恢复
(1)全库备份
SQL> BACKUP DATABASE FULL BACKUPSET 'FULL_BAK_20250418' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:12.781. 执行号:609.
(2)查看备份文件
SQL> SELECT DEVICE_TYPE,BACKUP_PATH,TYPE,LEVEL,OBJECT_NAME,BACKUP_TIME,ENCRYPT_TYPE,COMPRESS_LEVEL,BEGIN_LSN,END_LSN,CUMULATIVE,VERSION FROM V$BACKUPSET;
行号 DEVICE_TYPE BACKUP_PATH TYPE LEVEL OBJECT_NAME
---------- ----------- -------------------------------------------------------------------- ----------- ----------- -----------
BACKUP_TIME ENCRYPT_TYPE COMPRESS_LEVEL BEGIN_LSN END_LSN CUMULATIVE VERSION
-------------------------- ------------ -------------- -------------------- -------------------- ----------- -----------
1 DISK /opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418 0 0 DAMENG
2025-04-18 16:50:57.981974 0 6 37015136 37015286 0 16394
2 DISK /opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418/FULL_BAK_20250418_0 0 0 DAMENG
2025-04-18 16:50:50.786203 0 6 37015136 0 0 16394
3 DISK /opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418/FULL_BAK_20250418_1 0 0 DAMENG
2025-04-18 16:50:55.870396 0 6 37015136 0 0 16394
已用时间: 16.615(毫秒). 执行号:613.
(3)检查备份有效性
[dmdba@bogon ~]$ dmrman
dmrman V8
RMAN> CHECK BACKUPSET '/opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418';
CHECK BACKUPSET '/opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]
check backupset successfully.
time used: 149.848(ms)
(4)删除数据
SQL> DROP TABLE SUN.MOON;
操作已执行
已用时间: 33.282(毫秒). 执行号:614.
(5)停止数据库
[root@bogon bak]# systemctl stop DmServiceSingleDb
(6)还原数据
RMAN> RESTORE DATABASE '/opt/Dm8/SingleData/DAMENG/dm.ini' FROM BACKUPSET '/opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418';
RESTORE DATABASE '/opt/Dm8/SingleData/DAMENG/dm.ini' FROM BACKUPSET '/opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:03][Remaining:00:00:00]
restore successfully.
time used: 00:00:03.417
(7)恢复数据
RMAN> RECOVER DATABASE '/opt/Dm8/SingleData/DAMENG/dm.ini' FROM BACKUPSET '/opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418';
RECOVER DATABASE '/opt/Dm8/SingleData/DAMENG/dm.ini' FROM BACKUPSET '/opt/Dm8/SingleData/DAMENG/bak/FULL_BAK_20250418';
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 00:00:02.473
(8)更新魔数号
RMAN> RECOVER DATABASE '/opt/Dm8/SingleData/DAMENG/dm.ini' UPDATE DB_MAGIC;
RECOVER DATABASE '/opt/Dm8/SingleData/DAMENG/dm.ini' UPDATE DB_MAGIC;
recover successfully!
time used: 00:00:01.050
(9)启动数据库
[root@bogon bak]# systemctl start DmServiceSingleDb
(10)验证数据
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
6 rows got
已用时间: 1.150(毫秒). 执行号:601.
5、全库差异增量备份恢复
全库备份用的是上面的命令。
(1)测试数据
全库备份中没有新数据。
SQL> INSERT INTO SUN.MOON VALUES(7);
影响行数 1
已用时间: 13.775(毫秒). 执行号:611.
SQL> COMMIT;
操作已执行
已用时间: 10.199(毫秒). 执行号:612.
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
7 rows got
(2)增量备份
SQL> BACKUP DATABASE INCREMENT WITH BACKUPDIR '/opt/Dm8/Data/DAMENG/bak' BACKUPSET 'INCREMENT_BAK_20250422' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:07.034. 执行号:615.
(3)检查备份有效性
RMAN> check backupset '/opt/Dm8/Data/DAMENG/bak/INCREMENT_BAK_20250422';
check backupset '/opt/Dm8/Data/DAMENG/bak/INCREMENT_BAK_20250422';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]
check backupset successfully.
time used: 272.550(ms)
(4)清理数据
SQL> DROP TABLE SUN.MOON;
操作已执行
已用时间: 269.970(毫秒). 执行号:602.
(5)还原数据
RMAN> restore database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/INCREMENT_BAK_20250422' with backupdir '/opt/Dm8/Data/DAMENG/bak';
restore database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/INCREMENT_BAK_20250422' with backupdir '/opt/Dm8/Data/DAMENG/bak';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:03.028
(6)恢复数据
RMAN> recover database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/INCREMENT_BAK_20250422';
recover database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/INCREMENT_BAK_20250422';
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 00:00:02.759
(7)更新魔数号
RMAN> recover database '/opt/Dm8/Data/DAMENG/dm.ini' update db_magic;
recover database '/opt/Dm8/Data/DAMENG/dm.ini' update db_magic;
recover successfully!
time used: 00:00:01.219
(8)启动数据库
[root@bogon bak]# systemctl start DmServiceSingleDb
(9)验证数据
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
7 rows got
已用时间: 2.755(毫秒). 执行号:601.
6、全库累计增量备份恢复
(0)全量备份
SQL> BACKUP DATABASE FULL BACKUPSET 'FULL_BAK_20250422' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:07.344. 执行号:1003.
(1)测试数据
SQL> INSERT INTO SUN.MOON VALUES(8);
影响行数 1
已用时间: 15.481(毫秒). 执行号:1005.
SQL> COMMIT;
操作已执行
已用时间: 6.630(毫秒). 执行号:1006.
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
8 rows got
已用时间: 0.529(毫秒). 执行号:1007.
(2)全库累计增量备份
SQL> BACKUP DATABASE INCREMENT CUMULATIVE WITH BACKUPDIR '/opt/Dm8/Data/DAMENG/bak' BACKUPSET '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:06.875. 执行号:1008.
(3)检查备份有效性
RMAN> CHECK BACKUPSET '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422';
CHECK BACKUPSET '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]
check backupset successfully.
time used: 274.948(ms)
(4)删除数据
SQL> DROP TABLE SUN.MOON;
操作已执行
已用时间: 33.282(毫秒). 执行号:614.
(5)停止数据库
[root@bogon bak]# systemctl stop DmServiceSingleDb
(6)还原数据
RMAN> restore database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422' with backupdir '/opt/Dm8/Data/DAMENG/bak';
restore database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422' with backupdir '/opt/Dm8/Data/DAMENG/bak';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:03.031
(7)恢复数据
RMAN> recover database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422';
recover database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250422';
[Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 00:00:02.825
(8)更新魔数号
RMAN> recover database '/opt/Dm8/Data/DAMENG/dm.ini' update db_magic;
recover database '/opt/Dm8/Data/DAMENG/dm.ini' update db_magic;
recover successfully!
time used: 00:00:01.180
(9)启动数据库
[root@bogon bak]# systemctl start DmServiceSingleDb
(10)验证数据
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
8 rows got
已用时间: 2.495(毫秒). 执行号:501.
7、全库基于归档时间点恢复
(0)全量备份
SQL> BACKUP DATABASE FULL BACKUPSET 'FULL_BAK_20250423' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:07.189. 执行号:503.
(1)测试数据
SQL> BACKUP DATABASE FULL BACKUPSET 'FULL_BAK_20250423' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:07.189. 执行号:503.
SQL> INSERT INTO SUN.MOON VALUES(9);
影响行数 1
已用时间: 16.894(毫秒). 执行号:504.
SQL> COMMIT;
操作已执行
已用时间: 13.380(毫秒). 执行号:505.
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
9 rows got
已用时间: 0.499(毫秒). 执行号:506.
(2)全库累计增量备份
SQL> BACKUP DATABASE INCREMENT CUMULATIVE WITH BACKUPDIR '/opt/Dm8/Data/DAMENG/bak' BACKUPSET '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250423' MAXPIECESIZE 2048 COMPRESSED LEVEL 6 PARALLEL 2;
操作已执行
已用时间: 00:00:11.311. 执行号:507.
(3)检查备份有效性
RMAN> CHECK BACKUPSET '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250423';
CHECK BACKUPSET '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250423';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]
check backupset successfully.
time used: 265.973(ms)
(4)增加修改数据
插入时间点我们记录一下,一会儿我们恢复到这个点。
SQL> INSERT INTO SUN.MOON VALUES(10);
影响行数 1
已用时间: 14.672(毫秒). 执行号:508.
SQL> COMMIT;
操作已执行
已用时间: 3.831(毫秒). 执行号:509.
SQL> SELECT CURRENT_TIMESTAMP();
行号 CURRENT_TIMESTAMP()
---------- ---------------------------------
1 2025-04-23 08:56:28.019684 +08:00
已用时间: 0.486(毫秒). 执行号:510.
SQL> UPDATE SUN.MOON SET A = 66 WHERE A = 10;
影响行数 1
已用时间: 12.096(毫秒). 执行号:511.
SQL> COMMIT;
操作已执行
已用时间: 9.067(毫秒). 执行号:512.
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 66
10 rows got
已用时间: 0.523(毫秒). 执行号:513.
(5)停止数据库
[root@bogon bak]# systemctl stop DmServiceSingleDb
(6)还原数据
RMAN> restore database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250423' with backupdir '/opt/Dm8/Data/DAMENG/bak';
restore database '/opt/Dm8/Data/DAMENG/dm.ini' from backupset '/opt/Dm8/Data/DAMENG/bak/CUMULATIVE_INCREMENT_BAK_20250423' with backupdir '/opt/Dm8/Data/DAMENG/bak';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:03.076
(7)恢复数据
如果大家想恢复到最新点,可以不加UNTIL TIME。
也可以基于LSN号,就是把UNTIL LSN,但这个不怎么常用,我就展示了,查询当前LSN号方法如下:
SQL> SELECT FILE_LSN FROM V$RLOG;
行号 FILE_LSN
---------- --------------------
1 50093
RMAN> recover database '/opt/Dm8/Data/DAMENG/dm.ini' WITH ARCHIVEDIR'/opt/Dm8/SingleData/DAMENG/Arch' UNTIL TIME'2025-04-23 08:56:28.019684';
recover database '/opt/Dm8/Data/DAMENG/dm.ini' WITH ARCHIVEDIR '/opt/Dm8/SingleData/DAMENG/Arch' UNTIL TIME '2025-04-23 08:56:28.019684';
[Percent:77.78%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00]
recover successfully!
time used: 619.351(ms)
(8)更新魔数号
RMAN> recover database '/opt/Dm8/Data/DAMENG/dm.ini' update db_magic;
recover database '/opt/Dm8/Data/DAMENG/dm.ini' update db_magic;
recover successfully!
time used: 00:00:01.182
(9)启动数据库
[root@bogon bak]# systemctl start DmServiceSingleDb
(10)验证数据
SQL> SELECT * FROM SUN.MOON;
行号 A
---------- -----------
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
10 rows got
已用时间: 18.594(毫秒). 执行号:601.