一、DMRMAN环境变量配置
使用 CONFIGURE 命令进行 DMRMAN 的默认参数配置
1. 语法
CONFIGURE |
CONFIGURE CLEAR |
CONFIGURE DEFAULT <sub_conf_stmt>
<sub_conf_stmt>::=
DEVICE [[TYPE <介质类型> [PARMS '<介质参数>']]|CLEAR] |
TRACE [[FILE '<跟踪日志文件路径>'][TRACE LEVEL <跟踪日志等级>]|CLEAR] |
BACKUPDIR [[ADD|DELETE] '<基备份搜索目录>'{,'<基备份搜索目录>' }|CLEAR] |
ARCHIVEDIR [[ADD|DELETE] '<归档日志目录>'{,'<归档日志目录>'}|CLEAR] |
OPEN FILES [<文件句柄个数> | [CLEAR]]
2. 示例
2.1显示所有配置项当前值
RMAN> configure;
THE DMRMAN DEFAULT SETTING:DEFAULT DEVICE:
MEDIA : DISK
DEFAULT TRACE :
FILE :
LEVEL : 1
DEFAULT BACKUP DIRECTORY:
TOTAL COUNT :0DEFAULT ARCHIVE DIRECTORY:
TOTAL COUNT :0DEFAULT OPEN FILES:
OPEN FILES : 65535
2.2 恢复所有配置项到默认值
RMAN> configure clear;
configure default device clear successfully!
configure default trace clear successfully!
configure default backupdir clear successfully!
configure default archivedir clear successfully!
configure default open files clear successfully!
2.3 恢复任意一个配置项到默认值
RMAN> configure default open files clear;
configure default open files clear successfully!
2.4 显示任意一个配置项的值
RMAN> configure default device;
THE DMRMAN DEFAULT DEVICE SETTING:DEFAULT DEVICE:
MEDIA : DISK
2.5 配置存储介质
RMAN> configure default device type disk;
configure default device successfully!
2.6 配置跟踪文件
- 显示TRACE文件的默认配置
RMAN> configure default trace;
THE DMRMAN DEFAULT TRACE SETTING:DEFAULT TRACE :
FILE :
LEVEL : 1
- 配置默认 TRACE 文件
RMAN> configure default trace file '/dmdata/trace.log';
configure default trace successfully!
- 配置默认TRACE级别
RMAN>CONFIGURE DEFAULT TRACE LEVEL 2;
二、数据备份
1.数据库备份
在 DMRMAN 工具中使用 BACKUP 命令可以备份整个数据库。使用 DMRMAN 脱机备份数据库需要关闭数据库实例。若是正常退出的数据库,则脱机备份前不需要配置归档;若是故障退出的数据库,则备份前,需先进行归档修复。在 DMRMAN 中输入以下命令即可备份数据库:
RMAN> BACKUP DATABASE '/dmdata/data/DAMENG/dm.ini';
命令执行完后会在默认的备份路径下生成备份集目录。默认的备份路径为 dm.ini 中 BAK_PATH 配置的路径,若未配置 BAK_PATH,则默认使用 SYSTEM_PATH 下的 bak 目录。这是最简单的脱机数据库备份语句,如果要设置其他备份选项请参考下文的语法及使用说明。
1.1 语法
BACKUP DATABASE '<INI文件路径>' [<备份类型>][<指定备份集子句>][TO <备份名>] [BACKUPSET '<备份集路径>']
[DEVICE TYPE <介质类型>[PARMS '<介质参数>']
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[LIMIT <read_limit>|<write_limit>]
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION <TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]][WITHOUT LOG][WITHOUT MIRROR]
[TASK THREAD <线程数>][PARALLEL [<并行数>][READ SIZE <拆分块大小>]]
[USE BAK_MAGIC <备份集魔数>];
<备份类型>、<read_limit>、<write_limit>::
1.2 完全备份
完全备份数据库步骤如下:
- 保证数据库处于脱机状态;
- 启动 DMRMAN 命令行工具;
- DMRMAN 中输入以下命令:
RMAN>BACKUP DATABASE '/dmdata/data/DAMENG/dm.ini' FULL BACKUPSET '/dmdata/dmbak/db_full_bak_01';
备份语句中的参数 FULL 可以省略,不指定备份类型会默认指定备份类型为完全备份。
1.3 增量备份
增量备份指基于指定的库的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改了的数据页。脱机增量备份要求两次备份之间数据库必须有操作,否则备份会报错。
RMAN>BACKUP DATABASE '/dmdata/data/DAMENG/dm.ini' INCREMENT WITH BACKUPDIR
'/dmdata/dmbak'BACKUPSET '/dmdata/dmbak/db_increment_bak_02';
命令中的 INCREMENT 参数表示执行的备份为增量备份,增量备份时该参数不可省略。如果增量备份的基备份不在默认备份目录中,则必须指定 WITH BACKUPDIR 参数用于搜索基备份集,或者使用 CONFIGURE DEFAULT BACKUPDIR 命令配置默认的基备份集搜索目录。DSC 环境下的脱机库备份与联机库备份存在相同的使用限制。由于脱机备份无法推进检查点,当不满足该约束时,备份将失败。
2、归档备份
在 DMRMAN 工具中使用 BACKUP 命令可以备份库的归档。使用 DMRMAN 备份归档需要设置归档,否则会报错。关闭数据库实例,在 DMRMAN 中输入以下命令即可备份归档:
RMAN>BACKUP ARCHIVE LOG DATABASE '/dmdata/data/DAMENG/dm.ini';
命令执行完后会在默认的备份路径下生成备份集目录,默认的备份路径为 dm.ini 中 BAK_PATH 的配置值,若未配置,则使用 SYSTEM_PATH 下的 bak 目录。这是最简单的脱机归档备份语句,如果要设置其他备份选项请参考下文的语法及使用说明。
2.1 语法
BACKUP <ARCHIVE LOG | ARCHIVELOG> [ALL | [FROM LSN <lsn>]|[UNTIL LSN <lsn>] | [LSN BETWEEN < lsn> AND < lsn>] | [FROM TIME '<time>'] | [UNTIL TIME '<time>'] | [TIME BETWEEN '<time>' AND '<time>']] [<notBackedUpSpec>][<指定备份集子句>][DELETE INPUT]
DATABASE '<INI文件路径>' [TO <备份名>][<备份集子句>];
<备份集子句>::= [BACKUPSET '<备份集路径>'] [DEVICE TYPE <介质类型>[PARMS '<介质参数>']
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>]
[LIMIT <read_limit>|<write_limit>]
[IDENTIFIED BY <密码>|"<密码>" [WITH ENCRYPTION <TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]][TASK THREAD <线程数>][PARALLEL [<并行数>][READ SIZE <拆分块大小>]]
<read_limit>::= READ SPEED <读速度上限> [WRITE SPEED <写速度上限>]
<write_limit>::= WRITE SPEED <写速度上限>
2.2备份步骤
- 配置归档;
- 保证数据库处于脱机状态;
- 启动 DMRMAN 命令行工具;
2.3 创建归档备份
RMAN>BACKUP ARCHIVE LOG ALL DATABASE '/dmdata/data/DAMENG/dm.ini' BACKUPSET '/dmdata/dmbak/arch_all_bak_01';
命令中的 ALL 参数表示执行的备份为备份所有的归档,也可以不指定该参数,DMRMAN 默认执行的备份类型为 ALL 类型归档备份。
三、数据还原
1、数据库还原
数据库还原分为两个步骤:
- 数据库还原
- 数据库恢复一致性
1.1 数据库还原
使用 RESTORE 命令完成脱机还原操作,在还原语句中指定库级备份集,可以是脱机库级备份集,也可以是联机库级备份集。数据库的还原包括数据库配置文件还原和数据文件还原,目前可能需要还原的数据库配置文件包括 dm.ini、dm.ctl、服务器秘钥文件(dm_service.prikey 或者 dm_external.config,若备份库指定 usbkey 加密,则无秘钥文件)、联机日志文件。
1.1.1 语法
RESTORE DATABASE <restore_type> FROM BACKUPSET '<备份集路径>'
[<device_type_stmt>]
[IDENTIFIED BY <密码>|"<密码>" [ENCRYPT WITH <加密算法>]]
[WITH BACKUPDIR '<基备份搜索目录>'{,'<基备份搜索目录>'}]
[MAPPED FILE '<映射文件路径>'][TASK THREAD <任务线程数>]
[RENAME TO '<数据库名>'] [USE BAK_MAGIC <备份集魔数>];
<restore_type>::=<type1>|<type2>
<type1>::='<ini_path>'[TO SHADOW] [WITH CHECK] [REUSE DMINI] [WITHOUT MIRROR][WITHOUT SPACE] [AUTO EXTEND] [OVERWRITE]
<type2>::= TO '<system_dbf_dir>' [TO SHADOW] [WITH CHECK] [OVERWRITE] [WITHOUT MIRROR]
<device_type_stmt>::= DEVICE TYPE <介质类型> [PARMS '<介质参数>']
1.1.2 使用举例
通过 RESTORE 命令还原后的数据库不可用,需进一步执行 RECOVER 命令,将数据库恢复到备份结束时的状态。
数据库备份集分为联机和脱机两种类型。通常情况下,用户会在联机状态下备份数据库,因此下面以联机数据库备份为例说明使用 DMRMAN 如何执行数据库还原操作。
1.联机备份数据库,保证数据库运行在归档模式及 OPEN 状态;
SQL> BACKUP DATABASE BACKUPSET '/dmdata/dmbak/db_full_bak_for_restore';
2.准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始化一个新库。如下所示:
dminit path=/dmdata/data db_name=DAMENG_FOR_RESTORE
3.校验备份集
4.还原数据库
直接指定还原目标库的 dm.ini 进行数据库还原
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_for_restore';
指定 REUSE DMINI 子句进行数据库还原
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' REUSE DMINI
1.2 数据库恢复一致性
使用 RECOVER 命令完成数据库恢复工作,数据库恢复是指重做 REDO 日志。可以是基于备份集的恢复工作,也可以是使用本地归档日志的恢复工作。
如果还原后,不需要重做日志,数据就已经处于一致性状态了(例如正常关闭库的脱机备份还原),则可以跳过这一步,直接进入数据库更新阶段。
数据库恢复是指重做 REDO 日志,有两种方式:从备份集恢复,即重做备份集中的 REDO 日志;从归档恢复,即重做归档中的 REDO 日志。由于日志重做过程中,修改好的数据页首先存入缓冲区,缓冲区分批次将修改好的数据页写入磁盘,如果在此过程中发生异常中断,可能导致缓冲区中的数据页无法写入磁盘,造成数据的不一致,数据库启动时校验失败,所以数据库恢复过程中不允许异常中断。数据库恢复后,还需要执行数据库更新操作,将数据库调整为可正常工作的库才算完成。下面逐一进行说明。
1.2.1 从备份集恢复
如果备份集在备份过程中生成了日志,且这些日志在备份集中有完整备份(如联机数据库备份),在执行数据库还原后,可以重做备份集中备份的日志,将数据库恢复到备份时的状态,即从备份集恢复。完整的示例如下:
1.启动 DIsql 联机备份数据库;
BACKUP DATABASE BACKUPSET '/dmdata/dmbak/db_full_bak_for_recover_backupset';
2.准备目标库,可以使用备份库,也可以重新生成库;
重新生成库操作如下:./dminit path=/dmdata/data db_name=DAMENG_FOR_RESTORE auto_overwrite=1
3.启动 RMAN,校验备份;
RMAN> CHECK BACKUPSET '/dmdata/dmbak/db_full_bak_for_recover_backupset';
4.还原数据库;
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_for_recover_backupset';
5.恢复数据库。
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_for_recover_backupset';
1.2.2 从归档恢复
从归档恢复是利用重做本地归档日志来恢复数据的过程。从归档恢复允许恢复到指定的时间点及指定的 LSN 值。若同时指定了时间点和 LSN,则以较早的为结束点。
PS:
- 使用DDL CLONE方式备份的数据库,不支持指定归档恢复。
- 指定归档恢复时,不建议使用联机状态下源库的归档,此时无法保证归档的完整性。
- 由于从本地归档恢复允许使用 USE DB_MAGIC 指定待收集归档的 DB_MAGIC,那么就会存在跨库恢复情况,所以,归档日志的正确使用完全由用户保证。因此,为了保证用户能正确使用从归档恢复,除了下文这两种情况,其他情况(可能导致数据被破坏)不建议用户使用从本地归档恢复。
使用异常退出源库的归档文件进行恢复
数据库运行过程中,持续写入 REDO 日志到本地联机日志文件,并同步到归档文件。一般认为,源库故障后,使用备份集和归档文件可以将目标库数据恢复到最新状态,这样的假设并不总是成立,考虑如下场景:
- 创建数据库 D1;
- 操作数据库并执行备份,产生备份集 B1;
- 继续操作数据库,操作过程中数据库故障,产生归档 A1。
如果故障发生在 REDO 日志已写入联机日志,但未写入归档文件时,由于归档文件缺少部分 REDO 日志,此时使用备份集 B1 及归档 A1 无法将目标数据库恢复到最新状态。
对于这样的情况,需要使用联机日志修复归档后,才可使用归档文件将目标数据库恢复到最新状态。
1.联机备份D1全库
SQL> backup database backupset 'B1';
2.循环插入100W条记录
CREATE TABLE TABLE_1
(
i int
);begin
for i in 1..1000000
loop
insert into TABLE_1 values(i);
if i%50 = 0 THEN
commit;
end if;
end loop;
end;
3.强杀达梦进程,异常退出
4.准备目标库D2,即待还原的库
dminit path=/dmdata/data db_name=D2
5.修复D1归档日志
RMAN> REPAIR ARCHIVELOG DATABASE '/dmdata/data/D1/dm.ini';
6.使用备份集 B1 及归档 A1 将目标库 D2 恢复到最新状态
# 还原数据库到D2
RMAN> RESTORE DATABASE '/dmdata/data/D2/dm.ini' FROM BACKUPSET '/dmdata/dmbak/B1';
# 使用归档文件恢复到最新状态
RMAN> RECOVER DATABASE '/dmdata/data/D2/dm.ini' WITH ARCHIVEDIR '/dmdata/dmbak/arch';
1.3 更新DB_MAGIC
RMAN>RECOVER DATABASE '/dmdata/data/D2/dm.ini' UPDATE DB_MAGIC;
2 、归档还原
使用 RESTORE 命令完成脱机还原归档操作,在还原语句中指定归档备份集。备份集可以是脱机归档备份集,也可以是联机归档备份集。
1.联机备份归档,保证数据库运行在归档模式及 OPEN 状态;
BACKUP ARCHIVE LOG ALL BACKUPSET '/dmdata/dmbak/arch_all_for_restore';
2.校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN> CHECK BACKUPSET '/dmdata/dmbak/arch_all_for_restore';
3.还原归档。启动 DMRMAN,设置 OVERWRITE 为 2,如果归档文件已存在,会报错。
指定还原的目标归档日志目录:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/dmdata/dmbak/arch_all_for_restore' TO ARCHIVEDIR'/dmdata/data/DAMENG_FOR_RESTORE/arch_dest' OVERWRITE 2;
指定还原目标库的 dm.ini 文件路径:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/dmdata/dmbak/arch_all_for_restore' TO DATABASE '/dmdata/data/DAMENG_FOR_RESTORE/dm.ini' OVERWRITE 2;
根据达梦官网文档整理,达梦社区:https://eco.dameng.com