DM7 达梦数据库 物理备份 相关概念说明

在之前的博客我们了解了DM 物理备份的相关概念,如下:

DM7 达梦数据库 物理备份 相关概念说明
https://www.cndba.cn/dave/article/3594

以及联机备份操作:

DM7 达梦数据库 物理备份还原之 联机备份(SQL备份) 使用手册
https://www.cndba.cn/dave/article/3595

联机备份要求数据库启用归档并且处于打开状态,并且在恢复时也只支持表空间和表级的还原,如果要进行数据库级别的还原,只能使用脱机备份的操作。 下面看具体的操作过程。

1 数据备份

1.1 备份数据库

在 DMRMAN 工具中使用 BACKUP 命令你可以备份整个数据库。使用 DMRMAN 备份数据库不需要设置归档,关闭数据库后在 DMRMAN 中输入以下命令即可备份数据库:

RMAN>BACKUP DATABASE ‘/dm/dmdbms/data/dave/dm.ini’;

命令执行完后会在默认的备份路径下生成备份集目录,默认的备份路径为 dm.ini 中BAK_PATH 的配置值,若未配置,则为 SYSTEM_PATH 下的 bak 目录。

关于DMRMAN 工具的使用,可以参考我的博客:

DM7 达梦数据库 DMRMAN 工具 使用说明
https://www.cndba.cn/dave/article/3597

1.1.1语法

语法如下:

BACKUP DATABASE '<INI 文件路径 >' [[[FULL][DDL_CLONE]] |INCREMENT 
[CUMULATIVE][WITH BACKUPDIR '<基备份搜索目录>'{,'<基备份搜索目录>'}]|[BASE ON 
BACKUPSET '<基备份集目录>']]
[TO <备份名>] [BACKUPSET '<备份集目录>'][DEVICE TYPE <介质类型>[PARMS '<介质参数>'] 
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>] 
[IDENTIFIED BY <加密密码>[WITH ENCRYPTION<TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]][WITHOUT LOG] 
[TASK THREAD <线程数>][PARALLEL [<并行数>]];

参数说明:

DATABASE:必选参数。指定还原目标库的 INI 文件路径。
FULL:备份类型。FULL 表示完全备份,可不指定,DMRMAN 会默认为完全备份。
DDL_CLONE:数据库克隆。该参数只能用于完全备份中,表示仅拷贝所有的元数据不拷贝数据。如对于数据库中的表来说,只备份表的定义不备份表中数据。
INCREMENT:备份类型。INCREMENT 表示增量备份,若要执行增量备份必须指定该参数。
WITH BACKUPDIR:用于增量备份中,指定基备份的搜索目录,最大长度为 256 个字节。若不指定,服务器自动在默认备份目录下搜索基备份。如果基备份不在默认的备份目录下,增量备份必须指定该参数。
CUMULATIVE:用于增量备份中,指明为累积增量备份类型,若不指定则缺省为差异增量备份类型。
BASE ON BACKUPSET:用于增量备份中,为增量备份指定基备份集目录,如果没有指定基备份集,则会自动搜索一个最近可用的备份集作为基备份集。
TO:指定生成备份名称。若未指定,系统随机生成,默认备份名格式为:DB_备份类型_数据库名_备份时间。
BACKUPSET:指定当前备份集生成目录。若指定为相对路径,则在默认备份路径中生成备份集。
DEVICE TYPE:指存储备份集的介质类型,支持 DISK 和 TAPE,默认 DISK。DISK表示存储备份集到磁盘,TAPE 表示存储到磁带。
PARMS:只对介质类型为 TAPE 时有效。
BACKUPINFO:备份的描述信息。最大不超过 256 个字节。
MAXPIECESIZE:最大备份片文件大小上限,以 M 为单位,最小 128M,32 位系统最大 2G,64 位系统最大 128G。
IDENTIFIED BY:指定备份时的加密密码。密码应用双引号括起来,这样避免一些特殊字符通不过语法检测。密码的设置规则遵行 ini 参数 pwd_policy 指定的口令策略。
WITH ENCRYPTION:指定加密类型,0 表示不加密,不对备份文件进行加密处理;1表示简单加密,对备份文件设置口令,但文件内容仍以明文存;2 表示完全数据加密,对备份文件进行完全的加密,备份文件以密文方式存储。
ENCRYPT WITH:加密算法。缺省情况下,算法为 AES256_CFB。
COMPRESSED:取值范围 0~9。0 表示不压缩,1 表示 1 级压缩,9 表示 9 级压缩。压缩级别越高,压缩越慢,但压缩比越高。若未指定,但指定 COMPRESSED,则默认 1;否则,默认 0。
WITHOUT LOG:脱机数据库备份是否备份日志。如果使用,则表示不备份,否则表示备份。如果使用了 WITHOUT LOG 参数,则使用 DMRMAN 工具还原时,必须指定 WITH ARCHIVEDIR 参数。
TASK THREAD:备份过程中数据处理过程线程的个数,取值范围 0~64,默认为 4。若指定为 0,则调整为 1;若指定大于当前系统主机核数,则调整为当前主机核数。线程数(TASK THREAD)*并行数(PARALLEL)不得超过 512。
PARALLEL:指定并行备份的并行数,取值范围 0~128。若不指定,则默认为 4,指定0 或者 1 均认为为非并行备份。若未指定关键 PARALLEL,则认为非并行备份。并行备份不支持介质为 TAPE 的备份。线程数(TASK THREAD)*并行数(PARALLEL)不得超过 512。

注意事项:

1.备份成功后会在<备份集目录>或者备份默认目录下生成备份集。备份集中包括一个备份元数据文件,后缀.meta,一个或多个备份片文件,后缀.bak。
2.对于并行备份的备份集,备份集中还包括其他子备份集目录,但每个子备份集目录中也都包含一个 meta 文件,0 个或者多个备份片文件。
3.DDL_CLONE 库备份集不能作为增量备份的基备份,仅能用于库级还原。
4.脱机备份的数据库可以正常退出库,也可以是故障退出的数据库。若是故障退出的数据库,则备份前,需先进行归档修复。
5.在执行脱机数据库备份过程中,如果报错归档不完整,则需要检查库是不是异常退出。如果库是异常退出,则需要先进行归档修复。

1.1.2设置备份选项

备份命令如果仅指定了必选参数如 BACKUP DATABASE ‘/dm/dmdbms/data/dave/dm.ini’,那么 DMRMAN 会根据配置的环境及内置的参数默认值自动指定备份介质类型、备份路径、备份片大小等参数。用户备份时也可以指定这些参数来覆盖默认值,常见的备份选项有设置备份集路径、指定备份名、限制备份片大小、添加描述信息、并行备份等。

1.1.3创建完全备份

执行数据库备份要求数据库处于脱机状态。与联机备份数据库不同的是,脱机备份不需要配置归档。

RMAN> backup database '/dm/dmdbms/data/cndba/dm.ini' full backupset '/dm/dm_bak/db_full_bak_01';
backup database '/dm/dmdbms/data/cndba/dm.ini' full backupset '/dm/dm_bak/db_full_bak_01';
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 149601
BACKUP DATABASE [cndba], execute......
CMD CHECK LSN......
BACKUP DATABASE [cndba], collect dbf......
CMD CHECK ......
DBF BACKUP SUBS......
total 1 packages processed...
total 3 packages processed...
total 4 packages processed...
DBF BACKUP MAIN......
BACKUPSET [/dm/dm_bak/db_full_bak_01] END, CODE [0]......
META GENERATING......
total 5 packages processed...
total 5 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 7030.442(ms)
RMAN>

1.1.4创建增量备份

增量备份指基于指定的库的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改了的数据页。脱机增量备份要求两次备份之间数据库必须有操作,否则备份会报错。
命令中的 INCREMENT 参数表示执行的备份为增量备份,增量备份该参数不可省略。如果增量备份的基备份不在默认备份目录,必须指定 WITH BACKUPDIR 参数用于搜索基备份集,或者使用 CONFIGURE…BACKUPDIR 命令配置默认的基备份集搜索目录。

RMAN> backup database '/dm/dmdbms/data/cndba/dm.ini' increment with backupdir '/dm/dm_bak'backupset '/dm/dm_bak/db_increment_bak_02';
backup database '/dm/dmdbms/data/cndba/dm.ini' increment with backupdir '/dm/dm_bak' backupset '/dm/dm_bak/db_increment_bak_02';
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 149601
BACKUP DATABASE [cndba], execute......
CMD CHECK LSN......
BACKUP DATABASE [cndba], collect dbf......
CMD CHECK ......
DBF BACKUP SUBS......
total 1 packages processed...
total 3 packages processed...
total 4 packages processed...
DBF BACKUP MAIN......
BACKUPSET [/dm/dm_bak/db_increment_bak_02] END, CODE [0]......
META GENERATING......
total 0 packages processed...
total 5 packages processed!
CMD END.CODE:[-8088],DESC:[No data updates or logs are generated, no need to back up]
[-8088]:No data updates or logs are generated, no need to back up
RMAN>

1.2 备份归档

1.2.1 语法

BACKUP<ARCHIVE LOG | ARCHIVELOG>
[ALL | [FROM LSN <lsn 值>]|[UNTIL LSN <lsn 值>] | [LSN BETWEEN < lsn 值> AND < lsn值>] | [FROM TIME '时间串'] | [UNTIL TIME '时间串'] | [TIME BETWEEN '时间串' AND '时间串']] [<notBackedUpSpec>][DELETE INPUT]
DATABASE '<INI 文件路径>'
[TO <备份名>] [BACKUPSET '<备份集目录>'] [DEVICE TYPE <介质类型>[PARMS '<介质参数>'] 
[BACKUPINFO '<备份描述>'] [MAXPIECESIZE <备份片限制大小>] 
[IDENTIFIED BY <加密密码>[WITH ENCRYPTION<TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <压缩级别>]][TASK THREAD <线程数>][PARALLEL [<并行数>]];
<notBackedUpSpec>::=NOT BACKED UP
| NOT BACKED UP numTIMES
| NOT BACKED UP SINCE TIME 'datetime_string'

参数说明,参数大部分同backup database,这里列几个不同的地方:

ALL:备份所有的归档;
FROM LSN ,UNTIL LSN:备份的起始和截止 lsn。
FROM TIME:指定备份的开始时间点。例如,'2015-12-10'。
UNTIL TIME:指定备份的截止时间点。
BETWEEN ...AND ...:指定备份的区间,仅仅指备份区间内的归档文件。
<notBackedUpSpec>:搜索过滤。搜索过滤仅限于根据备份指定条件能找到的所有归档备份集。1) num TIMES,指若归档文件已经备份了 num 次,则不再备份;否则备份。如num=3,则认为已经备份了 3 次的归档文件就不再备份。若 num=0,则认为所有都不需要备份。2)SINCE TIME 'datetime_String',指定时间开始没有备份的归档文件进行备份。3)若以上两种均未指定,则备份所有未备份过的归档日志文件。
DELETE INPUT:用于指定备份完,是否删除归档操作。
DATABASE:必选参数。指定备份目标库的 INI 文件路径。
TO: 指定生成备份名称。若未指定,系统随机生成,默认备份名格式为:ARCH_备份时间。

1.2.2 设置备份选项

备份命令如果仅指定了必选参数如 BACKUP ARCHIVE LOG DATABASE ‘/dm/dmdbms/data/dave/dm.ini’,那么 DMRMAN 会根据配置的环境及内置的参数默认值自动指定备份介质类型、备份路径、备份片大小等参数。用户备份时也可以指定这些参数来覆盖默认值,常见的备份选项有设置备份集路径、指定备份名、限制备份片大小、添加描述信息、并行备份等。

1.2.3 创建归档备份

执行归档备份要求数据库处于脱机状态。与联机备份数据库一样,脱机归档备份需要配置归档。

RMAN> backup archive log all database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/arch_all_bak_01';
backup archive log all database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/arch_all_bak_01';
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 163787
BACKUP ARCHIVE LOG ALL, execute......
CMD CHECK LSN......
BACKUP ARCHIVE LOG ALL, collect dbf......
CMD CHECK ......
ARCH BACKUP SUBS......
total 1 packages processed...
ARCH BACKUP MAIN......
BACKUPSET [/dm/dm_bak/arch_all_bak_01] END, CODE [0]......
META GENERATING......
total 2 packages processed...
total 2 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 7089.558(ms)
RMAN>

1.2.4 创建设置条件的归档备份

设置条件的归档备份指通过设置 LSN 或者时间点,控制归档需要备份归档的范围。脱机设置条件归档备份。归档的LSN 可以通过V$ARCHIVED_LOG 视图查询。

SQL>  select first_change# from V$ARCHIVED_LOG;

LINEID     FIRST_CHANGE#       
---------- --------------------
1          154467
2          163788
3          168653

used time: 4.865(ms). Execute id is 36.
SQL> 

RMAN> backup archive log lsn between 154467 and 168653 database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_increment_bak_02';
backup archive log lsn between 154467 and 168653 database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_increment_bak_02';
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 173008
BACKUP ARCHIVE LOG FROM LSN 154467 TO LSN 168653, execute......
CMD CHECK LSN......
BACKUP ARCHIVE LOG FROM LSN 154467 TO LSN 168653, collect dbf......
CMD CHECK ......
ARCH BACKUP SUBS......
total 1 packages processed...
total 2 packages processed...
total 3 packages processed...
ARCH BACKUP MAIN......
BACKUPSET [/dm/dm_bak/db_increment_bak_02] END, CODE [0]......
META GENERATING......
total 4 packages processed...
total 4 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 7046.193(ms)
RMAN>

1.3 加密备份

DMRMAN 备份命令中通过指定 IDENTIFIED BY…WITH ENCRYPTION…ENCRYPT WITH…命令执行加密备份。

加密备份过程中参数 IDENTIFIED BY 必须指定,参数 WITH ENCRYPTION 和参数ENCRYPT WITH 可不指定。加密备份时不指定 WITH ENCRYPTION 参数,该参数默认为 1,不指定 ENCRYPT WITH 参数,该参数默认值为 AES256_CFB。

例如,以下两种加密备份命令都是合法的:

RMAN>backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_01' identified by "www.cndba.cn";
RMAN> backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_02' identified by "www.cndba.cn" encrypt with rc4;

若指定了加密密码,但加密类型 WITH ENCRYPTION 参数指定为 0,则为非加密备份,如下所示:
RMAN>backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_03' identified by "www.cndba.cn" with encryption 0;

下面以数据库完全备份为例,创建加密密码为“www.cndba.cn”,加密算法为“rc4”的复杂加密类型的数据库加密备份:
RMAN> backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_04' identified by "www.cndba.cn" with encryption 2 encrypt with rc4;
backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_04' identified by ****** with encryption * encrypt with ******;
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 173008
BACKUP DATABASE [cndba], execute......
CMD CHECK LSN......
BACKUP DATABASE [cndba], collect dbf......
CMD CHECK ......
DBF BACKUP SUBS......
total 1 packages processed...
total 3 packages processed...
total 4 packages processed...
DBF BACKUP MAIN......
BACKUPSET [/dm/dm_bak/db_bak_for_encrypt_04] END, CODE [0]......
META GENERATING......
total 5 packages processed...
total 5 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 7018.526(ms)
RMAN>

对于增量备份加密,如果基备份存在加密,则使用的加密算法和加密密码必须与基备份中一致;如果基备份未进行加密处理,则对增量备份使用的加密密码和算法没有特殊要求。

1.4 设置跟踪日志文件

DMRMAN 备份时可选择生成跟踪日志文件,跟踪日志记录了 SBT 接口的调用过程,用户通过查看日志可跟踪备份还原过程。

与生成跟踪日志文件相关的参数有两个,TRACE FILE 和 TRACE LEVEL。TRACE FILE用于指定生成的跟踪日志文件路径。与 DIsql 工具不同的是,DMRMAN 不可在备份时指定参数生成跟踪文件,只能使用 CONFIGURE 命令进行事先配置。

使用 CONFIGURE DEFAULT…TRACE FILE…TRACE LEVEL 命令启用 TRACE 功 能并设 TRACE 文件路径,以下命令生成 TRACE 文件到/dm/dm_bak目录, 注意这里的目录必须存在,否则会报目录无效。如果指定的 TRACE 文件已存在,服务器不会覆盖已存在的文件而是在已有文件基础上继续记录日志。

RMAN> configure default trace file '/dm/dm_bak/trace.log ' trace level 2;
configure default trace file '/dm/dm_bak/trace.log ' trace level 2;
configure default trace successfully!
time used: 0.327(ms)

RMAN>backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_trace_01' ;

[dave@www.cndba.cn dm_bak]$ cat trace.log |more
2029-03-06 14:59:00 sbtrestore(filepath=/dm/dm_bak/db_bak_for_encrypt_03/db_bak_for_encrypt_03.meta)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 4096)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 49152)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 16896)
2029-03-06 14:59:00 sbtclose()
2029-03-06 14:59:00 sbtrestore(filepath=/dm/dm_bak/arch_all_bak_01/arch_all_bak_01.meta)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 4096)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 49152)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 8704)
2029-03-06 14:59:00 sbtclose()
2029-03-06 14:59:00 sbtrestore(filepath=/dm/dm_bak/db_increment_bak_02/db_increment_bak_02.meta)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 4096)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 49152)
2029-03-06 14:59:00 sbtread(buf != NULL, buf_len = 16896)
2029-03-06 14:59:00 sbtclose()
……

指定参数 TRACE FILE 但 TRACE LEVEL 值设置为 1 即不启用 TRACE 功能,会生成TRACE 文件,但不会写入 TRACE 信息。如下所示:

RMAN> configure default trace file’/dm/dm_bak/db_trace.log’ trace level 1;

TRACE LEVEL 值设置为 2 即启用 TRACE 功能,但若 TRACE FILE 没有指定,系统默认在执行码路径的 log 目录下生成 DMSBTTRACE年月.log 文件。如下所示:

RMAN> configure default trace level 2;

2 数据库还原和恢复

2.1 数据库还原

使用 RESTORE 命令完成脱机还原操作,在还原语句中指定库级备份集,可以是脱机库级备份集,或是联机库级备份集。数据库的还原包括数据库配置文件还原和数据文件还原,目前可能需要还原的数据库配置文件包括 dm.ini、 dm.ctl、服务器秘钥文件(dm_service.private 或者 dm_external.config,若备份库指定 usbkey 加密,则
无秘钥文件)、联机日志文件。

2.1.1 语法如下

RESTORE DATABASE <restore_type> FROM BACKUPSET '<备份集目录>' 
[DEVICE TYPE DISK|TAPE[PARMS '<介质参数>']]
[IDENTIFIED BY <密码> [ENCRYPT WITH <加密算法>]] 
[WITH BACKUPDIR '<基备份集搜索目录>'{,'<基备份集搜索目录>'}]
[MAPPED FILE '<映射文件>'][TASK THREAD <任务线程数>] [NOT PARALLEL]
[RENAME TO '<数据库名>']; <restore_type>::=<type1>|<type2>
<type1>::='<INI文件路径>'[REUSE DMINI][OVERWRITE]
<type2>::= TO '<system_dbf 所在路径>' [OVERWRITE]

参数说明,大部分参数值都差不多,这里讲不同的部分:

ENCRYPT WITH:指定备份时使用的加密算法,供还原过程解密使用,若未指定,则使用默认算法。
WITH BACKUPDIR:指定备份集搜索目录。
MAPPED FILE:指定存放还原目标路径的文件,参见 3.3.5.2.1 数据库还原 。当<备份集目录>和<映射文件>指定的路径不一致时,以<映射文件>指定的路径为主。
TASK THREAD:指定还原过程中用于处理解压缩和解密任务的线程个数。若未指定,则默认为 4;若指定为 0,则调整为 1;若指定超过当前系统主机核数,则调整为主机核数。
NOT PARALLEL:指定并行备份集使用非并行方式还原。对于非并行备份集,不论是否指定该关键字,均采用非并行还原。
RENAME TO:指定还原数据库后是否更改库的名字,指定时将还原后的库改为指定的数据库名,默认使用备份集中的 db_name 作为还原后库的名称。

 <restore_type>:  
<type1>
1>指定 dm.ini 还原,要求 dm.ini 中 CTL_PATH 必须配置正确,且内容有效;若配置 CTL_PATH 文件故障,且想利用 dm.ini 优化配置,则可选择 type2 还原后,用指定dm.ini 覆盖还原后 dm.ini,并修改 CTL_PATH 为当前控制文件路径即可; 
2>除 dm.ini 文件外,其他文件均可不存在;但 dm.ini 参数配置必须正确,且配置的 dm.ctl 文件必须是有效的控制文件;
3>数据库配置文件中除已经存在的 dm.ini 外,先删除控制文件中的数据文件,然后根据 overwrite 选项,若指定 overwrite,其他文件(这些文件不在控制文件中,所以未删除)均采用删除重建的处理,避免存在非法的文件,否则如果这些文件已经存在,则报错;
4>若指定 REUSE DMINI,则会将备份集中备份的 dm.ini 中除路径相关的 INI 参数外,均拷贝到当前 dm.ini 上。

<type2>说明:
1>所有文件均可不在,system_dbf 所在路径需为有效路径,若不存在,restore 过程中会自动创建;
2>所有前面提到到数据库配置文件均会在指定的 system_dbf 所在路径还原,但非单机环境中相关其他文件均不修改或者重建,如 MPP 中 dmmpp.ini、dmmal.ini 等;
3>若未指定 OVERWRITE,若 system_dbf 所在路径中存在待还原的库配置文件,则报错;若指定,则将已经存在的文件删除重建;
4>由于 RAC 环境中 dm.ini 可能存在多个,且可能不在一个主库上,或者即使在一个主库上也可能不在 system_dbf 所在路径中,故暂时不支持 RAC 环境的指定目录还原。

联机日志
上述<type1>和<type2>中的还原后的联机日志文件至少会有两个,因为源库中的日志文件可能大于等于两个,如果小于两个(被误删的情况)的则补齐为两个。已经存在的联机日志配置,使用原路径,若文件大小非法,则使用缺省大小 256M 重建;缺少的使用缺省命名和缺省大小 256M 重建。

联机日志文件的命名规则:
1>单机:db_name+(file_id+1).log,其中 fil_id + 1,占 2 个位置,如:db_name=dave,则相应的名称为 dave01.log,dave02.log;
2>RAC: rac+(ep_no + 1)_+(file_id+1).log,其中 ep_no + 1 和 file_id+1 均占 2 个位置,如 0 号节点日志名称为 rac01_01.log,rac01_02.log。

2.1.2 操作示例

通过 RESTORE 命令还原后的数据库不可用,需进一步执行 RECOVER 命令,将数据库恢复到备份结束时的状态。数据库备份集分为联机和脱机两种类型。

通常情况下,用户会在联机的情况下备份数据库,因此下面以联机数据库备份为例说明使用 DMRMAN 如何执行数据库还原操作。

1) 联机备份数据库,保证数据库运行在归档模式及 OPEN 状态。

SQL> backup database backupset '/dm/dm_bak/db_full_bak_for_restore';
executed successfully
used time: 00:00:01.290. Execute id is 3.
SQL>

2) 准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始化一个新库。如果还原目标库与故障库是同一个,建议先执行故障库的归档修复操作。

[dave@www.cndba.cn dm_bak]$ dminit path=/dm/dmdbms/data db_name=dave_for_restore
initdb V7.6.0.95-Build(2018.09.13-97108)ENT 
db version: 0x7000a
file dm.key not found, use default license!
License will expire in 14 day(s) on 2029-03-20

 log file path: /dm/dmdbms/data/dave_for_restore/dave_for_restore01.log


 log file path: /dm/dmdbms/data/dave_for_restore/dave_for_restore02.log

write to dir [/dm/dmdbms/data/dave_for_restore].
create dm database success. 2029-03-06 15:06:10
[dave@www.cndba.cn dm_bak]$

3) 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验。

RMAN> check backupset '/dm/dm_bak/db_full_bak_for_restore';
check backupset '/dm/dm_bak/db_full_bak_for_restore';
CMD END.CODE:[0]
check backupset successfully.
time used: 11.149(ms)

4) 还原数据库。启动 DMRMAN,输入以下命令:

RMAN> restore database '/dm/dmdbms/data/dave_for_restore/dm.ini' from backupset '/dm/dm_bak/db_full_bak_for_restore';
restore database '/dm/dmdbms/data/dave_for_restore/dm.ini' from backupset '/dm/dm_bak/db_full_bak_for_restore';
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running, write dmrman info.
RESTORE DATABASE  CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm/dm_bak/db_full_bak_for_restore] START......
total 4 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 5 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 3150.622(ms)
RMAN> 

这里只是还原如果想成功,还得进行recover恢复 操作:
[dave@www.cndba.cn dm_bak]$ dmserver /dm/dmdbms/data/dave_for_restore/dm.ini
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V7.6.0.95-Build(2018.09.13-97108)ENT  startup...
License will expire in 14 day(s) on 2029-03-20
instance DMSERVER is restored,should be recovered.
[dave@www.cndba.cn dm_bak]$

2.1.3 指定映射文件还原

还原后的数据文件默认地生成到还原目标库的路径下,如果用户想生成数据文件到特定的路径,就需要指定映射文件参数来实现。
映射文件(mapped file)用于指定存放还原目标路径,即备份集里面的数据文件的路径。可以手动修改自动生成的映射文件。当参数 BACKUPSET 和 MAPPED FILE 指定的路径不一致时,以 MAPPED FILE 中指定的路径为主。
映射文件可用于库级脱机还原和表空间还原。

使用 DUMP 命令可以将指定备份集还原目标信息生成到目标映射文件中,该文件可被重新编辑后,用于数据库的还原过程。

语法如下:

DUMP BACKUPSET '<备份集目录>' [DEVICE TYPE DISK|TAPE [PARMS '介质参数']]
[DATABASE '<INI 文件路径>'] MAPPED FILE '<映射文件>';
BACKUPSET:待生成映射文件的备份集目录。
DEVICE TYPE:指存储备份集的介质类型,支持 DISK 和 TAPE,默认为 DISK。
PARMS:介质参数,供第三方存储介质(TAPE 类型)管理使用。
DATABASE:指定目标还原库的 dm.ini 文件路径。
MAPPED FILE:生成映射文件路径。若指定 DATABASE 参数,则生成内容调整为与指定数据库相适应的数据文件目标还原路径;否则,仅将备份集中备份时记录的路径输出。

下面以脱机备份还原为例说明使用映射文件还原的具体步骤。
1) 启动 RMAN,脱机备份数据库。

RMAN> backup database ‘/dm/dmdbms/data/cndba/dm.ini’ backupset’/dm/dm_bak/db_bak_for_map_01’;

2)生成映射文件 map_file_01.txt 至/dm/dm_bak目录。此处指定生成映射文件中的数据文件路径与数据库/dm/dmdbms/data/dave_for_restore 中的数据文件一致。若不指定,与备份集中的源数据库的数据文件路径一致。

RMAN> dump backupset '/dm/dm_bak/db_bak_for_map_01' database '/dm/dmdbms/data/dave_for_restore/dm.ini' mapped file'/dm/dm_bak/map_file_01.txt';

[dave@www.cndba.cn dm_bak]$ cat /dm/dm_bak/map_file_01.txt 
/**************************************************************/
/***  Delete the unnecessary modified groups                 **/
/***  Modify the data_path or mirror_path only in one group  **/
/**************************************************************/

/**=============================================================**/
/*[cndba_SYSTEM_FIL_0]*/
fil_id         = 0
ts_id          = 0
ts_name        = SYSTEM
data_path      = /dm/dmdbms/data/dave_for_restore/SYSTEM.DBF
mirror_path    = 

/**=============================================================**/
/*[cndba_ROLL_FIL_0]*/
fil_id         = 0
ts_id          = 1
ts_name        = ROLL
data_path      = /dm/dmdbms/data/dave_for_restore/ROLL.DBF
mirror_path    = 

/**=============================================================**/
/*[cndba_MAIN_FIL_0]*/
fil_id         = 0
ts_id          = 4
ts_name        = MAIN
data_path      = /dm/dmdbms/data/dave_for_restore/MAIN.DBF
mirror_path    = 

/***************************** END ****************************/

[dave@www.cndba.cn dm_bak]$

如果需要恢复数据文件或镜像文件到指定路径,可手动编辑映射文件中表空间对应的data_path 属性。

我们这里将所有的数据文件都改到/dm目录下:

[dave@www.cndba.cn dm_bak]$ cat /dm/dm_bak/map_file_01.txt |grep data_path
/***  Modify the data_path or mirror_path only in one group  **/
data_path      = /dm/dave_for_restore/SYSTEM.DBF
data_path      = /dm/dave_for_restore/ROLL.DBF
data_path      = /dm/dave_for_restore/MAIN.DBF
[dave@www.cndba.cn dm_bak]$

3) 指定映射文件还原。还原前可选择对备份文件进行校验。

RMAN> restore database '/dm/dmdbms/data/dave_for_restore/dm.ini' from backupset '/dm/dm_bak/db_bak_for_map_01' mapped file'/dm/dm_bak/map_file_01.txt';
restore database '/dm/dmdbms/data/dave_for_restore/dm.ini' from backupset '/dm/dm_bak/db_bak_for_map_01' mapped file '/dm/dm_bak/map_file_01.txt';
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running...[4].
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running...[3].
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running...[2].
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running...[1].
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running...[0].
checking if the database under system path [/dm/dmdbms/data/dave_for_restore] is running, write dmrman info.
RESTORE DATABASE  CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm/dm_bak/db_bak_for_map_01] START......
total 4 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 5 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 8122.534(ms)
RMAN> 

查看新路径:
[dave@www.cndba.cn dm_bak]$ ll /dm/dave_for_restore/ -lh
total 281M
-rw-r--r-- 1 dmdba dinstall 128M Mar  6 15:18 MAIN.DBF
-rw-r--r-- 1 dmdba dinstall 128M Mar  6 15:18 ROLL.DBF
-rw-r--r-- 1 dmdba dinstall  24M Mar  6 15:18 SYSTEM.DBF
[dave@www.cndba.cn dm_bak]$

2.2 数据库恢复

使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使用本地归档日志的恢复工作。如果还原后,数据已经处于一致性状态了,则可以使用更新DB_MAGIC 方式恢复,前提是不需要重做日志。
数据库恢复有三种方式:更新 DB_MAGIC 恢复、从备份集恢复和从归档恢复。

语法如下:

RECOVER DATABASE '<INI 文件路径>' [<with_archdir_lst_stmt>]
[USE DB_MAGIC <db_magic>] [UNTIL TIME '<时间串>'] [UNTIL LSN <LSN>]; |

RECOVER DATABASE '<INI 文件路径 >' FROM BACKUPSET '< 备份集目录 >'[DEVICE TYPE 
DISK|TAPE[PARMS '<介质参数>']] [IDENTIFIED BY <密码> [ENCRYPT WITH <加密算法>]]; |

RECOVER DATABASE '<INI 文件路径>' UPDATE DB_MAGIC;
<with_archdir_lst_stmt> ::=
WITH ARCHIVEDIR '<归档日志目录>'{,'<归档日志目录>'}

参数说明:

DATABASE:指定还原库目标的 dm.ini 文件路径。
USE DB_MAGIC:指定本地归档日志对应数据库的 DB_MAGIC,若不指定,则默认使
用目标恢复数据库的 DB_MAGIC。
UNTIL TIME:恢复数据库到指定的时间点。
UNTIL LSN:恢复数据库到指定的 LSN。
BACKUPSET:指定用于还原目标数据库的备份集目录。
WITH ARCHIVEDIR:本地归档日志搜索目录,若未指定,则仅使用目标库配置本地归
档目录,RAC 环境还会取 REMOTE 归档目录。

2.2.1 更新 DB_MAGIC 恢复

当备份集为脱机备份即备份过程中无日志生成,那么此时还原后的数据库中数据与备份时数据状态一致。在不需要重做归档日志恢复数据的情况下,可以直接更新 DB_MAGIC完成数据库恢复。

完整的示例如下:
1) 启动 RMAN 备份数据库,保证服务器处于脱机状态。

RMAN>backup database ‘/dm/dmdbms/data/cndba/dm.ini’ backupset ‘/dm/dm_bak/db_full_bak_for_recover_dbmagic’;

2) 准备目标库,可以使用备份库,也可以重新生成库。重新生成库操作如下:

dminit path=/dm/dmdbms/data db_name=dave_for_restore auto_overwrite=1

3) 校验备份。

RMAN>check backupset ‘/dm/dm_bak/db_full_bak_for_recover_dbmagic’;

4) 还原数据库。

RMAN>restore database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ from backupset ‘/dm/dm_bak/db_full_bak_for_recover_dbmagic’;

5) 恢复数据库。

RMAN>recover database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ update db_magic;

6)启动数据库成功:

[dave@www.cndba.cn dm_bak]$ dmserver /dm/dmdbms/data/dave_for_restore/dm.ini
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V7.6.0.95-Build(2018.09.13-97108)ENT  startup...
License will expire in 14 day(s) on 2029-03-20
ckpt lsn: 182227
ndct db load finished
ndct fill fast pool finished
set EP[0]'s pseg state to inactive
iid page's trxid = 1762
NEXT TRX ID = 1763
pseg recv finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
SYSTEM IS READY.

2.2.2 从备份集恢复

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

1) 启动 DIsql 联机备份数据库。

SQL> backup database backupset '/dm/dm_bak/db_full_bak_for_recover_backupset';
executed successfully
used time: 00:00:01.211. Execute id is 3.
SQL>

2) 准备目标库,可以使用备份库,也可以重新生成库。重新生成库操作如下:

dminit path=/dm/dmdbms/data db_name=dave_for_restore auto_overwrite=1

3) 还原数据库。

RMAN>restore database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ from backupset ‘/dm/dm_bak/db_full_bak_for_recover_backupset’;

 

4) 恢复数据库。

RMAN>recover database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ from backupset ‘/dm/dm_bak/db_full_bak_for_recover_backupset’;

5)修改dm.ini 端口后启动成功:

[dave@www.cndba.cn dm_bak]$ dmserver /dm/dmdbms/data/dave_for_restore/dm.ini
file dm.key not found, use default license!
Global parameter value of RT_HEAP_TARGET is illegal, use min value!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V7.6.0.95-Build(2018.09.13-97108)ENT  startup...
License will expire in 14 day(s) on 2029-03-20
ckpt lsn: 187093
ndct db load finished
ndct fill fast pool finished
EP[0] pseg_collect_items end, collect 0 trx, 0 committed pages, 0 active pages
EP[0] undo over, total 0 page rollbacked
purge over, total 0 page purged
set EP[0]'s pseg state to inactive
iid page's trxid = 1763
NEXT TRX ID = 1764
pseg recv finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
nsvr_process_before_open begin.
nsvr_process_before_open success.
SYSTEM IS READY.

2.2.3 从归档恢复

从归档恢复是利用重做本地归档日志来恢复数据的过程。从归档恢复允许恢复到指定的时间点及指定的 LSN 值。若同时指定了时间点和 LSN,则以较早的为结束点。
由于从本地归档恢复允许使用 USE DB_MAGIC 指定待收集归档的 DB_MAGIC,那么就会存在跨库恢复情况,所以,归档日志的正确使用完全由用户保证。

因此,为了保证用户能正确使用从归档恢复,除了下文这两种情况,其他情况(可能导致数据被破坏)不建议用户使用从本地归档恢复。

1、执行过从备份集还原,以及执行过从备份集还原恢复的库,本地归档日志属于备份集备份时的库,本地归档日志的 DB_MAGIC 与备份集中记录 DB_MAGIC 值;
2、未执行过还原的库,但恢复目标库与本地归档日志来源于同一个库,且目标库与原来的库分离后没有再单独执行过操作或者故障重启过。
比如一个数据库 A 因故障关闭后,拷贝一份作为数据库 B,此时数据库 A 和 B 完全相同。此后,数据库 A 故障重启,并正常执行其他操作,生成了新的本地归档日志。如果想利用 A 的本地归档日志去将 B 恢复到 A的状态,那么可以利用 DMRMAN 工具执行从本地归档恢复。若中间 B 启动过或者执行过其他操作,则均不能再使用 A 的归档日志进行恢复操作。

利用归档恢复数据库至最新状态的完整示例如下:
1)启动 DIsql 联机备份数据库,以及备份从检查点开始的本地归档日志。

查看动态视图 V$RLOG 中的 CKPT_LSN 列,可以得出当前检查点 LSN。

SQL>  select ckpt_lsn from V$RLOG;

LINEID     CKPT_LSN            
---------- --------------------
1          187093

used time: 1.398(ms). Execute id is 19.
SQL> 
SQL> backup archivelog from lsn 187093 backupset '/dm/dm_bak/arch_bak_lsn_187093';
executed successfully
used time: 00:00:01.100. Execute id is 20.
SQL> backup database backupset '/dm/dm_bak/db_full_bak_for_recover_arch';
executed successfully
used time: 00:00:01.201. Execute id is 21.
SQL>

2) 准备目标库,可以使用备份库,也可以重新生成库。
如果使用原备份库,且备份库故障,需要先执行目标库归档修复:

RMAN>repair archivelog database ‘/dm/dmdbms/data/cndba/dm.ini’;

如果使用新生成的库,生成之后需要先重启一下数据库,才可以被还原。重新生成的库不需要执行归档修复(repair)操作。重新生成库操作如下:

[dave@www.cndba.cn dm_bak]$ dminit path=/dm/dmdbms/data db_name=dave_for_restore auto_overwrite=1

3) 启动 RMAN,校验备份。

RMAN>check backupset ‘/dm/dm_bak/db_full_bak_for_recover_arch’;

4) 还原数据库。

RMAN>restore database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ from backupset ‘/dm/dm_bak/db_full_bak_for_recover_arch’;

5) 查看备份集的数据库信息,获取源库的 DB_MAGIC。
若还原后,立即执行执行恢复,可以不用获取源库 DB_MAGIC。因为 DMRMAN 执行库级备份集还原后,会将备份集中的 DB_MAGIC 刷入还原后的库中。

RMAN> show backupset '/dm/dm_bak/db_full_bak_for_recover_arch' info db;
show backupset '/dm/dm_bak/db_full_bak_for_recover_arch' info db;

<backupset [DEVICE TYPE:DISK, BACKUP_PATH: /dm/dm_bak/db_full_bak_for_recover_arch] info start ..........>

<DB INFO>
system path:           /dm/dmdbms/data/cndba
db magic:              1232911348
permanent magic:       1196983552
rac node:              1
...

7)利用归档恢复数据库。由步骤 5 显示的备份集信息可知,源库的 DB_MAGIC 值为1232911348。

SQL>  select arch_name,arch_type,arch_dest from v$dm_arch_ini;

LINEID     ARCH_NAME      ARCH_TYPE ARCH_DEST 
---------- -------------- --------- ----------
1          ARCHIVE_LOCAL1 LOCAL     /dm/dmarch

used time: 1.200(ms). Execute id is 24.
RMAN>recover database '/dm/dmdbms/data/dave_for_restore/dm.ini' with archivedir '/dm/dmarch' use db_magic 1232911348;
若还原后,立即执行执行恢复,可以不用指定 DB_MAGIC 。

7)若执行后归档恢复过程中,出现归档不足的错误,则利用归档校验工具 dmrachk,查看归档目录中归档连续性情况,然后再利用备份的本地归档日志,还原到归档目录后,再次执行恢复操作。

DM7 达梦数据库 dmrachk 工具 使用说明
https://www.cndba.cn/dave/article/3601

如果dmrachk 命令提示ARCH_PATH 的归档文件链表是不连续的,如下:

breakpoint 0:
the left file /dm/dm_arch/arch/ARCHIVE_LOCAL1_20160112161534890.log, clsn: 421311
the right file /dm/dm_arch/arch/ARCHIVE_LOCAL1_20160113140135670.log, arch_lsn: 423208
breakpoint 1:
the left file /dm/dm_arch/arch/ARCHIVE_LOCAL1_20160114085528401.log, clsn: 424273
the right file /dm/dm_arch/arch/ARCHIVE_LOCAL1_20160114092356075.log, arch_lsn: 425285
the rachk tool running cost 949.011 ms

DMRMAN 查看归档备份的范围:
RMAN>show backupset '/dm/dm_bak/arch_bak_lsn_187093' INFO META;
……
arch start lsn: 421300
arch end lsn: 425550
……
可见本地归档缺失部分(421311,423208]、(424273,425285]在归档备份范围内[421300,425550]中,执行归档还原后,再次执行利用本地归档恢复操作。
RMAN>restore archivelog from backupset '/dm/dm_bak/arch_bak_lsn_187093' all to archivedir '/dm/dmarch';

2.2.4 恢复数据库到指定时间点/LSN(不完全恢复)

恢复数据库到指定时间点/LSN 是从归档恢复的一种方式,也称为不完全恢复。从归档恢复允许恢复到指定的时间点及指定的 LSN 值。若同时指定了时间点和 LSN,则以较早的为结束点。用户可以通过指定一个时间点/LSN,使数据库恢复到这个指定的时间点/LSN。 例如,用户在下午 5 点做了一个误操作,删除了某些重要数据;我们可以指定恢复时间点到下午 4:59 分,恢复被误删除的数据。

下面以联机数据库备份为例说明如何恢复数据库到指定的时间点/LSN。
1) 准备数据。

SQL> CREATE TABLE TAB_FOR_RECOVER_01(C1 INT);
executed successfully
used time: 9.446(ms). Execute id is 30.
SQL> INSERT INTO TAB_FOR_RECOVER_01 VALUES(1);
affect rows 1

used time: 1.324(ms). Execute id is 31.
SQL> commit;
executed successfully
used time: 1.566(ms). Execute id is 32.
SQL>

2) 备份数据库。

SQL> BACKUP DATABASE BACKUPSET '/dm/dm_bak/db_full_bak_for_time_lsn';
executed successfully
used time: 00:00:01.226. Execute id is 41.

3) 正确操作数据库,产生一些归档。

SQL> CREATE TABLE TAB_FOR_RECOVER_02(C1 INT);
executed successfully
used time: 5.627(ms). Execute id is 42.
SQL> INSERT INTO TAB_FOR_RECOVER_02 VALUES(1);
affect rows 1

used time: 1.723(ms). Execute id is 43.
SQL> commit;
executed successfully
used time: 2.183(ms). Execute id is 44.
SQL> 

#查看时间:
SQL> select sysdate();

LINEID     SYSDATE()                  
---------- ---------------------------
1          2029-03-06 18:08:34

used time: 1.285(ms). Execute id is 45.
SQL> 

#查看LSN:
SQL> SELECT FILE_LSN FROM V$RLOG;

LINEID     FILE_LSN            
---------- --------------------
1          192122

used time: 1.182(ms). Execute id is 46.
SQL>

4) 误操作数据库。此步骤误删除了表 TAB_FOR_RECOVER_01 中数据。

SQL>DELETE FROM TAB_FOR_RECOVER_01;
SQL>COMMIT;

SQL> select sysdate();

LINEID     SYSDATE()                  
---------- ---------------------------
1          2029-03-06 18:09:39

used time: 0.585(ms). Execute id is 49.
SQL> SELECT FILE_LSN FROM V$RLOG;

LINEID     FILE_LSN            
---------- --------------------
1          192125

used time: 0.385(ms). Execute id is 50.
SQL>

5) 还原数据库。步骤 4 为误操作,因此我们需要将数据库恢复到步骤 3 的状态。首先需要还原数据库:

[dave@www.cndba.cn dmarch]$ service DmServicedave stop
Stopping DmServicedave:                                    [ OK ]
[dave@www.cndba.cn dmarch]$ 

RMAN> restore database '/dm/dmdbms/data/cndba/dm.ini' from backupset '/dm/dm_bak/db_full_bak_for_time_lsn';
restore database '/dm/dmdbms/data/cndba/dm.ini' from backupset '/dm/dm_bak/db_full_bak_for_time_lsn';
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
RESTORE DATABASE  CHECK......
RESTORE DATABASE , dbf collect......
RESTORE DATABASE , dbf refresh ......
RESTORE BACKUPSET [/dm/dm_bak/db_full_bak_for_time_lsn] START......
total 4 packages processed...
RESTORE DATABASE , UPDATE ctl file......
RESTORE DATABASE , REBUILD key file......
RESTORE DATABASE , CHECK db info......
RESTORE DATABASE , UPDATE db info......
total 5 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 8042.507(ms)
RMAN>

6)恢复数据库到指定时间点/LSN。还原后数据库的数据与备份时一致,如果要恢复数据库至步骤 3 的状态可以指定 UNTIL TIME 或 UNTIL LSN 参数重做部分归档。

RMAN>  show backupset '/dm/dm_bak/db_full_bak_for_time_lsn' info db;
……
<DB INFO>
system path:           /dm/dmdbms/data/cndba
db magic:              1232911348
……

使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的时间:
RMAN> RECOVER DATABASE '/dm/dmdbms/data/cndba/dm.ini' WITH ARCHIVEDIR'/dm/dmarch' USE DB_MAGIC 1232911348 UNTIL TIME'2029-03-06 18:08:34';
RECOVER DATABASE '/dm/dmdbms/data/cndba/dm.ini' WITH ARCHIVEDIR '/dm/dmarch' USE DB_MAGIC 1232911348 UNTIL TIME '2029-03-06 18:08:34';
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 187125

EP[0] Recover LSN from 187126 to 192123.
Recover from archive log finished, time used:0.196s.
recover successfully!
time used: 7030.864(ms)
RMAN> 


或者使用 RECOVER DATABASE...UNTIL TIME 命令恢复到指定的 LSN:
RMAN> RECOVER DATABASE '/dm/dmdbms/data/cndba/dm.ini' WITH ARCHIVEDIR'/dm/dmarch' USE DB_MAGIC 1232911348 UNTIL LSN 192122;
RECOVER DATABASE '/dm/dmdbms/data/cndba/dm.ini' WITH ARCHIVEDIR '/dm/dmarch' USE DB_MAGIC 1232911348 UNTIL LSN 192122;
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 192123
recover successfully!
time used: 7068.930(ms)
RMAN> 

启动DB验证,恢复成功:
SQL> select * from  TAB_FOR_RECOVER_01;

Server[LOCALHOST:5236]:mode is normal, state is open
connected

LINEID     C1         
---------- -----------
1          1

used time: 3.053(ms). Execute id is 3.
SQL>

2.2.5 RAC 环境下的数据库恢复
DM7 支持 RAC 环境下的备份还原。RAC 环境的备份还原与普通的单机不同的是,它包含多个节点(目前仅支持两个节点)。下面以从归档恢复为例说明 RAC 环境下的备份恢复:

1) 搭建 RAC 环境。
2) 启动 DIsql,联机备份数据库。备份其中任意一个节点即可备份整个 RAC 环境。

SQL>BACKUP DATABASE BACKUPSET ‘/dm/dm_bak/db_full_bak_for_rac’;

3) 还原数据库。还原数据库之前可选择对备份文件进行校验。需要注意的是,待还原的目标库可以单机库,也可以 RAC 库,且节点个数允许不同。

RMAN> restore database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ from backupset ‘/dm/dm_bak/db_full_bak_for_rac’;

4)恢复数据库。假设 节 点 1 和 节 点 2 的归档分别在 /dm/dm_arch1 、/dm/dm_arc2 目录下。RAC 库恢复要求各节点归档完整性由用户保证,即各节点的本地归档都能够访问到,若本地存在 REMOTE 归档,则可以使用 REMOTE 归档代替远程节点的本地归档。

RMAN>recover database ‘/dm/dmdbms/data/dave_for_restore/dm.ini’ with archivedir’/dm/dm_arch1’,’/dm/dm_arch2’ use db_magic 1447060265;

3 归档还原

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

语法如下:

RESTORE<ARCHIVE LOG | ARCHIVELOG> FROM BACKUPSET '<备份集目录>' 
[DEVICE TYPE DISK|TAPE[PARMS '<介质参数>']]
[IDENTIFIED BY <密码> [ENCRYPT WITH <加密算法>]] 
[TASK THREAD <任务线程数>] [NOT PARALLEL]
[ALL | [FROM LSN <lsn 值>] | [UNTIL LSN <lsn 值>] | [LSN BETWEEN < lsn 值> AND < lsn 值>] | [FROM TIME '时间串'] | [UNTIL TIME '时间串'] | [TIME BETWEEN '时间串' AND '时间串'] ]
TO <还原目录>
[OVERWRITE level];
<还原目录>::=
ARCHIVEDIR '<归档目录>' | 
DATABASE '<INI 文件路径>'

参数里只讲一个:

 

OVERWRITE:还原归档时,如果遇到归档已经存在的处理,1:跳过已存在的归档日志,继续其他日志的还原。跳过的信息会生成一条日志记录在安装目录/log/dmBAKRES年月.log 里;2:直接报错返回;3:强制覆盖存在的归档日志。缺省为 1。

使用说明:
1) 联机备份归档,保证数据库运行在归档模式及 OPEN 状态。

SQL> backup archive log all backupset '/dm/dm_bak/arch_all_for_restore';
executed successfully
used time: 00:00:01.173. Execute id is 4.
SQL>

2) 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验。

RMAN> check backupset '/dm/dm_bak/arch_all_for_restore';
check backupset '/dm/dm_bak/arch_all_for_restore';
CMD END.CODE:[0]
check backupset successfully.
time used: 9.601(ms)
RMAN>

3) 还原归档。启动 DMRMAN,设置 OVERWRITE 为 2,如果归档文件已存在,会报错。

RMAN> restore archive log from backupset '/dm/dm_bak/arch_all_for_restore' to database '/dm/dmdbms/data/cndba/dm.ini' overwrite 2;
restore archive log from backupset '/dm/dm_bak/arch_all_for_restore' to database '/dm/dmdbms/data/cndba/dm.ini' overwrite 2;
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
RESTORE ARCHIVE CHECK......
RESTORE ARCHIVE, dbf collect......
RESTORE ARCHIVE, dbf refresh ......
CMD END.CODE:[-8354],DESC:[for the archive file conflicted, restore failed]
[-8354]:for the archive file conflicted, restore failed
RMAN> 

或者
RMAN> restore archive log from backupset '/dm/dm_bak/arch_all_for_restore' to archivedir '/dm/dmarch' overwrite 2;
restore archive log from backupset '/dm/dm_bak/arch_all_for_restore' to archivedir '/dm/dmarch' overwrite 2;
RESTORE ARCHIVE CHECK......
RESTORE ARCHIVE, dbf collect......
RESTORE ARCHIVE, dbf refresh ......
CMD END.CODE:[-8354],DESC:[for the archive file conflicted, restore failed]
[-8354]:for the archive file conflicted, restore failed
RMAN>

4 归档修复

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

语法如下:

REPAIR<ARCHIVE LOG | ARCHIVELOG> DATABASE <'INI 文件路径'>;
INI 文件路径:指定待修复归档的数据库对应的 dm.ini 路径。

使用说明:
1) 单机环境时,确保目标库已经停止工作后,执行归档修复。

RMAN> repair archivelog database '/dm/dmdbms/data/cndba/dm.ini';
repair archivelog database '/dm/dmdbms/data/cndba/dm.ini';
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[4].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[3].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[2].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[1].
checking if the database under system path [/dm/dmdbms/data/cndba] is running...[0].
checking if the database under system path [/dm/dmdbms/data/cndba] is running, write dmrman info.
EP[0] max_lsn: 201449
repair archive log successfully.
repair time used: 6034.287(ms)
time used: 6034.450(ms)
RMAN>

2) RAC 环境时,需要每个节点停止工作后,且每个节点独立执行修复操作。对于两节点 RAC01、RAC02 执行修复如下。

RMAN> REPAIR ARCHIVELOG DATABASE ‘/dm/dmdbms/rac/dm01.ini’;
RMAN> REPAIR ARCHIVELOG DATABASE ‘/dm/dmdbms/rac/dm02.ini’;

5 表空间还原

表空间的脱机还原除了支持联机还原的所有功能外,也放开了 SYSTEM 和 ROLL 表空间还原操作。与联机表空间还原不同的是,脱机表空间还原不需要事先置目标表空间为 OFFLINE 状态。

语法如下:

RESTORE DATABASE '<INI 文件路径>' TABLESPACE <表空间名>
[DATAFILE<<文件编号> {,<文件编号>} | '<文件路径>' {,'<文件路径>'}>]
FROM BACKUPSET '<备份集目录>' 
[DEVICE TYPE DISK|TAPE[PARMS '<介质参数>']]
[IDENTIFIED BY <密码> [ENCRYPT WITH <加密算法>]] 
[WITH BACKUPDIR '<基备份集搜索目录>'{,'<基备份集搜索目录>'}]
[<with_archdir_lst_stmt>]
[MAPPED FILE '<映射文件>'][TASK THREAD <任务线程数>] [NOT PARALLEL]
[UNTIL TIME '<时间串>'] [UNTIL LSN <LSN>]; <with_archdir_lst_stmt> ::=
WITH ARCHIVEDIR '<归档日志目录>'{,'<归档日志目录>'}

使用说明:

1. 表空间还原不能是 TEMP 表空间,指定文件还原也不能为 TEMP 表空间中文件。
2. 表空间还原要求还原目标库与备份库为同一个库,且若还原目标库中SYSTEM 表空间没有故障且还原目标表空间不是 SYSTEM 表空间的话,则要求目标库校验通过,比如加密校验和日志校验等;否则将使用备份集中信息与当前的进行校验。
3. 还原目标库不能为已经执行过 restore,但是未指定过 recover 的库。
4. SYSTEM 表空间和 ROLL 表空间不允许指定 UNTIL LSN 或者 UNTIL TIME 还原;其他用户表空间可以。若未指定 UNTIL TIME 或者 UNTIL LSN,则均还原到最新状态。使用 UNTIL TIME(或者 UNTIL LSN)的同时不能指定 DATAFILE 还原,否则报语法错误。
5. 处于 RES_OFFLINE 或 CORRUPT 状态的表空间不允许指定表空间中数据文件还原。
6. 整个还原过程中不会修改数据库本身状态或者调整 CKPT_LSN。
7. 不管是 RAC 环境,还是单机环境,若异常退出,需手动指定各节点归档修复后,使用各节点完整的归档日志执行还原恢复;否则,将可能无法恢复到最新。
8. 异常退出库指定 UNTIL TIME 或者 UNTIL LSN 还原失效,因为库故障重启时会执行故障修复,UNTIL 失效,表空间仍会恢复到最新状态。
9. 若目标库中 SYSTEM 表空间故障,则必须优先还原 SYSTEM 表空间。

在 DMRAC 环境中进行表空间还原,需要先确保所有节点实例都已退出,此时在任一节点上使用该节点的备份集均可进行表空间还原操作,且只要在一个节点上执行目标表空间还原即可。

对于两节点 RAC01、RAC02,表空间的还原操作如下:
RMAN>backup database '/dm/dmdbms/rac/dm01.ini' backupset '/dm/dmd_bak/rman_dm01_01';
RMAN>restore database'/dm/dmdbms/rac/dm01.ini' tablespace main from backupset '/dm/dm_bak/rman_dm01_01' with archivedir '/dm/dmarch';

10.如果 SYSTEM 表空间处于 ONLINE/OFFLINE 状态且文件丢失,则必须要通过库还原修复,不支持对其执行表空间还原。

限于篇幅的原因,关于备份日常查看和备份集的管理,可以如下博客:

DM7 达梦数据库的 告警日志
https://www.cndba.cn/dave/article/3598
DM7 达梦数据库 物理备份还原之 备份管理 操作手册
https://www.cndba.cn/dave/article/3600

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值