失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > DM7 达梦数据库 物理备份 相关概念说明

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

时间:2019-04-14 04:09:00

相关推荐

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

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

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

/dave/article/3594

以及联机备份操作:

DM7 达梦数据库 物理备份还原之 联机备份(SQL备份) 使用手册

/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 工具 使用说明

/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: 149601BACKUP 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: 149601BACKUP 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 upRMAN>

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:指定备份的开始时间点。例如,'-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: 163787BACKUP 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;LINEIDFIRST_CHANGE# ---------- --------------------115446721637883168653used 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: 173008BACKUP 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 "";RMAN> backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_02' identified by "" 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 "" with encryption 0;下面以数据库完全备份为例,创建加密密码为“”,加密算法为“rc4”的复杂加密类型的数据库加密备份:RMAN> backup database '/dm/dmdbms/data/cndba/dm.ini' backupset '/dm/dm_bak/db_bak_for_encrypt_04' identified by "" 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: 173008BACKUP 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@ dm_bak]$ cat trace.log |more2029-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 successfullyused time: 00:00:01.290. Execute id is 3.SQL>

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

[dave@ dm_bak]$ dminit path=/dm/dmdbms/data db_name=dave_for_restoreinitdb V7.6.0.95-Build(.09.13-97108)ENT db version: 0x7000afile dm.key not found, use default license!License will expire in 14 day(s) on 2029-03-20log file path: /dm/dmdbms/data/dave_for_restore/dave_for_restore01.loglog file path: /dm/dmdbms/data/dave_for_restore/dave_for_restore02.logwrite to dir [/dm/dmdbms/data/dave_for_restore].create dm database success. 2029-03-06 15:06:10[dave@ 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@ dm_bak]$ dmserver /dm/dmdbms/data/dave_for_restore/dm.inifile dm.key not found, use default license!Global parameter value of RT_HEAP_TARGET is illegal, use min value!version info: developUse normal os_malloc instead of HugeTLBUse normal os_malloc instead of HugeTLBDM Database Server x64 V7.6.0.95-Build(.09.13-97108)ENT startup...License will expire in 14 day(s) on 2029-03-20instance DMSERVER is restored,should be recovered.[dave@ 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@ 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 = 0ts_id= 0ts_name = SYSTEMdata_path= /dm/dmdbms/data/dave_for_restore/SYSTEM.DBFmirror_path = /**=============================================================**//*[cndba_ROLL_FIL_0]*/fil_id = 0ts_id= 1ts_name = ROLLdata_path= /dm/dmdbms/data/dave_for_restore/ROLL.DBFmirror_path = /**=============================================================**//*[cndba_MAIN_FIL_0]*/fil_id = 0ts_id= 4ts_name = MAINdata_path= /dm/dmdbms/data/dave_for_restore/MAIN.DBFmirror_path = /***************************** END ****************************/[dave@ dm_bak]$

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

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

[dave@ 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.DBFdata_path= /dm/dave_for_restore/ROLL.DBFdata_path= /dm/dave_for_restore/MAIN.DBF[dave@ 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@ dm_bak]$ ll /dm/dave_for_restore/ -lhtotal 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@ 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@ dm_bak]$ dmserver /dm/dmdbms/data/dave_for_restore/dm.inifile dm.key not found, use default license!Global parameter value of RT_HEAP_TARGET is illegal, use min value!version info: developUse normal os_malloc instead of HugeTLBUse normal os_malloc instead of HugeTLBDM Database Server x64 V7.6.0.95-Build(.09.13-97108)ENT startup...License will expire in 14 day(s) on 2029-03-20ckpt lsn: 182227ndct db load finishedndct fill fast pool finishedset EP[0]'s pseg state to inactiveiid page's trxid = 1762NEXT TRX ID = 1763pseg recv finishednsvr_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 successfullyused 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@ dm_bak]$ dmserver /dm/dmdbms/data/dave_for_restore/dm.inifile dm.key not found, use default license!Global parameter value of RT_HEAP_TARGET is illegal, use min value!version info: developUse normal os_malloc instead of HugeTLBUse normal os_malloc instead of HugeTLBDM Database Server x64 V7.6.0.95-Build(.09.13-97108)ENT startup...License will expire in 14 day(s) on 2029-03-20ckpt lsn: 187093ndct db load finishedndct fill fast pool finishedEP[0] pseg_collect_items end, collect 0 trx, 0 committed pages, 0 active pagesEP[0] undo over, total 0 page rollbackedpurge over, total 0 page purgedset EP[0]'s pseg state to inactiveiid page's trxid = 1763NEXT TRX ID = 1764pseg recv finishednsvr_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;LINEIDCKPT_LSN ---------- --------------------1187093used time: 1.398(ms). Execute id is 19.SQL> SQL> backup archivelog from lsn 187093 backupset '/dm/dm_bak/arch_bak_lsn_187093';executed successfullyused time: 00:00:01.100. Execute id is 20.SQL> backup database backupset '/dm/dm_bak/db_full_bak_for_recover_arch';executed successfullyused time: 00:00:01.201. Execute id is 21.SQL>

2) 准备目标库,可以使用备份库,也可以重新生成库。

如果使用原备份库,且备份库故障,需要先执行目标库归档修复:

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

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

[dave@ 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/cndbadb magic: 1232911348permanent magic: 1196983552rac node: 1...

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

SQL> select arch_name,arch_type,arch_dest from v$dm_arch_ini;LINEIDARCH_NAMEARCH_TYPE ARCH_DEST ---------- -------------- --------- ----------1ARCHIVE_LOCAL1 LOCAL/dm/dmarchused 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 工具 使用说明

/dave/article/3601

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

breakpoint 0:the left file /dm/dm_arch/arch/ARCHIVE_LOCAL1_0112161534890.log, clsn: 421311the right file /dm/dm_arch/arch/ARCHIVE_LOCAL1_0113140135670.log, arch_lsn: 423208breakpoint 1:the left file /dm/dm_arch/arch/ARCHIVE_LOCAL1_0114085528401.log, clsn: 424273the right file /dm/dm_arch/arch/ARCHIVE_LOCAL1_0114092356075.log, arch_lsn: 425285the rachk tool running cost 949.011 msDMRMAN 查看归档备份的范围:RMAN>show backupset '/dm/dm_bak/arch_bak_lsn_187093' INFO META;……arch start lsn: 421300arch 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 successfullyused time: 9.446(ms). Execute id is 30.SQL> INSERT INTO TAB_FOR_RECOVER_01 VALUES(1);affect rows 1used time: 1.324(ms). Execute id is 31.SQL> commit;executed successfullyused time: 1.566(ms). Execute id is 32.SQL>

2) 备份数据库。

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

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

SQL> CREATE TABLE TAB_FOR_RECOVER_02(C1 INT);executed successfullyused time: 5.627(ms). Execute id is 42.SQL> INSERT INTO TAB_FOR_RECOVER_02 VALUES(1);affect rows 1used time: 1.723(ms). Execute id is 43.SQL> commit;executed successfullyused time: 2.183(ms). Execute id is 44.SQL> #查看时间:SQL> select sysdate();LINEIDSYSDATE() ---------- ---------------------------12029-03-06 18:08:34used time: 1.285(ms). Execute id is 45.SQL> #查看LSN:SQL> SELECT FILE_LSN FROM V$RLOG;LINEIDFILE_LSN ---------- --------------------1192122used 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();LINEIDSYSDATE() ---------- ---------------------------12029-03-06 18:09:39used time: 0.585(ms). Execute id is 49.SQL> SELECT FILE_LSN FROM V$RLOG;LINEIDFILE_LSN ---------- --------------------1192125used time: 0.385(ms). Execute id is 50.SQL>

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

[dave@ dmarch]$ service DmServicedave stopStopping DmServicedave:[ OK ][dave@ 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/cndbadb 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: 187125EP[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: 192123recover successfully!time used: 7068.930(ms)RMAN> 启动DB验证,恢复成功:SQL> select * from TAB_FOR_RECOVER_01;Server[LOCALHOST:5236]:mode is normal, state is openconnectedLINEIDC1 ---------- -----------11used 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 successfullyused 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 failedRMAN> 或者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 failedRMAN>

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: 49repair 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 达梦数据库的 告警日志

/dave/article/3598

DM7 达梦数据库 物理备份还原之 备份管理 操作手册

/dave/article/3600

如果觉得《DM7 达梦数据库 物理备份 相关概念说明》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。