备份恢复 & 迁移27 分钟阅读
达梦 DM8 备份与恢复 100 条命令
达梦的备份集和归档日志要放在一起看。全备文件能找到,不代表目标时间点的归档都在;归档目录有文件,也要确认备份集覆盖的 LSN 与后续归档能接上。真正开始恢复以前,备份类型、备份片、归档范围和文件路径都得先对一遍。
2026年9月16日阅读—点赞—收藏—
dba100damengscenario
100 条命令系列文章专栏
达梦的备份集和归档日志要放在一起看。全备文件能找到,不代表目标时间点的归档都在;归档目录有文件,也要确认备份集覆盖的 LSN 与后续归档能接上。真正开始恢复以前,备份类型、备份片、归档范围和文件路径都得先对一遍。
达梦的备份集和归档日志要放在一起看。全备文件能找到,不代表目标时间点的归档都在;归档目录有文件,也要确认备份集覆盖的 LSN 与后续归档能接上。真正开始恢复以前,备份类型、备份片、归档范围和文件路径都得先对一遍。
这篇整理了日常巡检、联机备份、DMRMAN 校验、隔离恢复、单表恢复和备份清理常用的 100 条命令。建议先收藏,遇到恢复任务时按顺序核对,也方便把检查结果交给下一班同事。
达梦 DM8 全备、归档与隔离恢复关系示意图
示例采用 Linux、DM8 单实例,SQL 在运行中的源库 DIsql 执行。备份目录、库名与 LSN 按现场替换。恢复和更新 DB_MAGIC 的命令只在隔离环境演练;本稿命令尚未在真实数据库执行。
1SELECT * FROM V$DM_ARCH_INI;先看本地归档路径、文件大小和空间限制。配置有目录,不等于归档正在正常写入;实际状态和文件要分别查。
1SELECT ARCH_TYPE, ARCH_DEST, ARCH_STATUS, ARCH_SRC2FROM V$ARCH_STATUS;重点看本地归档的目标与状态。数据守护或 DSC 环境还有远程归档,不能把不同类型混成一条本地归档链;状态的有效性按部署模式和执行节点解释。
1SELECT PATH, ARCH_LSN, CLSN, ARCH_SEQ, NEXT_SEQ,2 CREATE_TIME, CLOSE_TIME, STATUS3FROM V$ARCH_FILE4ORDER BY ARCH_LSN;ARCH_LSN 是归档文件起始 LSN,CLSN 是已归档最大 LSN。对连续文件核对范围和创建时间;列表里看不到文件时还要去归档目录或备份介质找,不能直接断言日志从未产生。
1SELECT DIR FROM V$BACKUPSET_SEARCH_DIRS;默认只搜默认备份目录及本会话已登记的目录。备份集放在别的路径时,V$BACKUPSET 查不到,不等于备份集不存在。
1SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/backup/dm8');这只改变当前会话的备份集搜索范围,不是搬动备份文件;下一条要在同一个 DIsql 会话里执行。目录必须换成现场实际路径。
1SELECT BACKUP_ID, BACKUP_NAME, BACKUP_PATH,2 BACKUP_TIME, DEVICE_TYPE, TYPE3FROM V$BACKUPSET4ORDER BY BACKUP_TIME DESC;先分清全备和增量备份,记录备份路径、完成时间和介质。视图是已搜索到的备份集目录,不等于所有备份一定都登记在此;沿着清单核实离线副本。
1SELECT BACKUP_PATH, PAGE_SIZE, EXTENT_SIZE,2 CASE_SENSITIVE3FROM V$BACKUPSET_DBINFO4WHERE BACKUP_PATH = '/backup/dm8/full_20260916';恢复目标库的页大小、簇大小等关键属性要和备份集相容。仅靠备份名相近不能认定备份来自目标库;继续核对备份集的库标识及元数据。
1SELECT BACKUPPATH, BKP_NTH, FILE_NAME, BKP_LEN2FROM V$BACKUPSET_BKP3WHERE BACKUPPATH = '/backup/dm8/full_20260916'4ORDER BY BKP_NTH;把查询结果和介质上的真实文件清单、文件长度逐一对上。备份片少一片,元数据仍能显示备份集,但还原可能中途失败。
1SELECT BACKUPPATH, FILE_SEQ, BEGIN_LSN, END_LSN2FROM V$BACKUPSET_ARCH3WHERE BACKUPPATH = '/backup/dm8/full_20260916'4ORDER BY BEGIN_LSN;库备份可能包含归档日志。这里核对备份集内的 LSN 范围,再和第 3 条的后续本地归档接起来;不要把“备份带日志”理解为可恢复到任意时间。
1SELECT BEGIN_ARCH_PATH, BEGIN_LSN, BEGIN_SEQ,2 END_ARCH_PATH, END_LSN, END_SEQ3FROM V$ARCH_BACKUP_HISTORY4ORDER BY END_LSN DESC;该视图只记当前节点启动后的最近记录,不能当作长期备份目录。用它对照近期归档作业,再查持久备份集和离线介质确认更早的日志。
以下命令在备份介质可访问的主机上启动 DMRMAN 后执行;示例目录先按现场替换。SHOW 和 CHECK 不会把备份还原到库里。
1SHOW BACKUPSET '/backup/dm8/full_20260916';先看备份类型、时间、来源库和备份片,确认拿的是本次恢复方案选定的全备。目录必须指到备份集目录,不是其中某个备份片;输出能读到元数据,不等于全部片都已经校验过。
1SHOW BACKUPSET '/backup/dm8/full_20260916' INFO DB;重点记录源库的 DB_MAGIC、页大小和数据库信息。多个库共用备份介质时,只看备份目录名最容易拿错;后续隔离还原要对这份来源信息。
1SHOW BACKUPSET '/backup/dm8/full_20260916' INFO META;元数据里看备份集版本、类型和创建信息。旧 DMRMAN 执行码可能解析不了新版本备份集;工具兼容性要在恢复前确认,不能等还原时报“子版本不匹配”。
1SHOW BACKUPSET '/backup/dm8/full_20260916' INFO FILE;逐项对照目标实例需要的 DBF 文件和实际介质上的备份片。目录可见但片丢失、长度不对,恢复仍会失败;第 8 条的 SQL 视图和 DMRMAN 输出可以互相校对。
1SHOW BACKUPSET '/backup/dm8/full_20260916' INFO TABLESPACE;查看库备份覆盖的表空间信息,尤其是新增或改过路径的业务表空间。表空间列表齐全只是备份内容核对的一步,目标库文件路径与介质片还要分别验证。
1SHOW BACKUPSETS WITH BACKUPDIR '/backup/dm8';目录里可能混有不同时间、不同数据库和不同备份类型的备份集。先按源库与恢复时间挑候选链,再逐个 SHOW BACKUPSET;批量列表不会自动证明增量基备都在。
1SHOW BACKUPSETS WITH BACKUPDIR '/backup/dm8/full', '/backup/dm8/incremental';全备和增量备份分开放时要同时纳入搜索,避免只看到最新增量却找不到它依赖的基备。路径是备份集的搜索目录,与第 11 条的单个备份集目录不同。
1SHOW BACKUPSET '/backup/dm8/incr_20260916' RECURSIVE WITH BACKUPDIR '/backup/dm8/full';RECURSIVE 从这份增量往前显示完整依赖链,WITH BACKUPDIR 帮它寻找放在别处的基备。链表列出来以后仍要逐份检查介质片和归档范围;“能找到基备”不代表可恢复到目标 LSN。
1SHOW BACKUPSETS WITH BACKUPDIR '/backup/dm8' USE DB_MAGIC 1447060265;数字取自第 12 条的目标源库信息,示例值不能照抄。多个数据库共用目录时,这比按备份名猜来源可靠;若结果为空,先核对 DB_MAGIC 和目录,不要临时换成另一库的备份集。
1CHECK BACKUPSET '/backup/dm8/full_20260916';校验每次针对一个备份集;增量和归档备份集也要分别校验。CHECK 通过只说明备份集校验层面的结果,不能替代目标库的隔离还原、归档应用和业务数据回读。
第 21—26、28—30 条在源库 OPEN 且已配置归档时通过 DIsql 执行;第 27 条是停库后的 DMRMAN 命令。备份目录应与数据文件分开存放,执行后用第 11—20 条检查新备份集。
1BACKUP DATABASE FULL2 BACKUPSET '/backup/dm8/full_20260917';联机库备份要求实例处于 OPEN 且归档已配置。给这次任务单独的备份集目录,别沿用旧目录;完成后对照备份片、来源库、日志范围并做校验。命令返回成功只是链条的第一步。
1BACKUP DATABASE TO WEEKLY_FULL_202609172 BACKUPSET '/backup/dm8/weekly_full_20260917';备份名用于在多次作业中识别用途,但在默认备份目录和基备搜索目录内不能与已有备份名冲突。名称替换成现场命名规则;检索时仍以来源库和备份集元数据确认,别只信名字。
1BACKUP DATABASE FULL2 BACKUPSET '/backup/dm8/full_compressed_20260917'3 COMPRESSED LEVEL 5;压缩等级 0—9,等级高通常更省空间,也会消耗更多备份时间和 CPU。5 是测试起点,不是统一最优值;在低峰试备份耗时、目标介质容量及校验结果,再决定作业参数。
1BACKUP DATABASE FULL2 BACKUPSET '/backup/dm8/full_pieces_20260917'3 MAXPIECESIZE 300;单位 MB。介质或文件系统限制单文件大小时才需这样切片;片数增加后归档、搬运和恢复都必须带齐。别把片大小误写成整套备份的总大小。
1BACKUP DATABASE FULL2 FORMAT '/backup/dm8/%R_%d_%T';格式串由达梦替换成实际备份集路径,适合定时任务避免反复覆盖固定目录。作业完成后必须保存展开后的真实路径;恢复时不能把 %R_%d_%T 当备份集目录传给 DMRMAN。
1BACKUP DATABASE INCREMENT2 WITH BACKUPDIR '/backup/dm8'3 BACKUPSET '/backup/dm8/incr_20260917';INCREMENT 不能省略;未指定 CUMULATIVE 时是差异增量。WITH BACKUPDIR 搜索基备,不会凭空补出缺失的全备。作业后用第 18 条递归显示依赖链,并校验每一份基备和新增量。
1BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' BACKUPSET '/backup/dm8/offline_full_20260917';这条在 DMRMAN 执行,dm.ini 必须指向已停止的目标库。它不能拿来替代联机作业而忽略停库影响;启动前确认文件路径、实例状态和备份介质,完成后仍要检查备份集与隔离恢复。
1BACKUP ARCHIVE LOG ALL2 BACKUPSET '/backup/dm8/arch_all_20260917';归档备份有连续性和库标识检查;如果旧归档有缺口,不能因为这次作业完成就认为从旧全备到现在的日志已齐。完成后读第 9、10 条的 LSN 范围,并对照介质上的真实归档文件。
1BACKUP ARCHIVE LOG LSN BETWEEN 50000 AND 1200002 BACKUPSET '/backup/dm8/arch_lsn_20260917';LSN 范围要从备份集和归档清单确定,数字只是示例。指定范围内未收齐归档会报错;即使成功,也要确认上下两段与全备/增量链相接,别把这一段孤立归档当成完整恢复链。
1BACKUP ARCHIVE LOG FROM TIME '2026-09-17 00:00:00'2 BACKUPSET '/backup/dm8/arch_from_time_20260917';时间仅用来选择本次归档备份范围,恢复链最终仍要按 LSN、归档序号和备份集范围核对。时区及服务器时间先与值班记录对齐;别以为给出时间就保证误操作前后的每条日志都在。
以下 DMRMAN 命令都写成单行,避免交互模式按行解析时报错。示例恢复主机与生产实例隔离;在同机演练时,更要先核对备份集中的数据文件原路径、目标目录、监听端口和配置文件,避免覆盖源库文件或连回生产库。
1test ! -e /restore/dm8/DAMENG_TEST目标必须是本次演练专用路径。命令成功只说明该路径当前不存在,不说明备份集里的其他数据文件路径也安全;用第 14 条的文件清单核对外置表空间文件,必要时准备 mapped file。别对已有库目录直接加 OVERWRITE。
1pgrep -af dmserver逐个对进程参数中的 dm.ini 路径和监听端口,确认演练目标没有在运行。pgrep 无结果时退出码可能为 1;这不是数据库故障。DMRMAN 的库还原需要目标库处于脱机状态,不能靠改一个目录名就假定已满足。
1RESTORE DATABASE TO '/restore/dm8/DAMENG_TEST' FROM BACKUPSET '/backup/dm8/full_20260916';在 DMRMAN 执行。TO 指定新的数据库系统目录,还原会创建库文件和 dm.ini;它会写入目标路径,不是只读检查。先用第 12、14、20 条确认来源、文件和校验,并检查备份记录的外置数据文件路径是否需要映射。
1RECOVER DATABASE '/restore/dm8/DAMENG_TEST/dm.ini' FROM BACKUPSET '/backup/dm8/full_20260916';还原数据页后,联机备份期间产生的 REDO 仍要重做。即使备份任务返回成功,也不能跳过这一步直接启动库;恢复失败时先查备份集和归档覆盖范围,不要反复对同一目标盲目重试。
1RECOVER DATABASE '/restore/dm8/DAMENG_TEST/dm.ini' UPDATE DB_MAGIC;在第 34 条完成一致性恢复后执行。DB_MAGIC 变化用来区分备份源库与已恢复的目标库;它不是“再重放一次日志”。如果本次计划继续应用备份结束后的归档,须先做完归档恢复,再更新 DB_MAGIC。
1grep -E '^[[:space:]]*(INSTANCE_NAME|PORT_NUM)[[:space:]]*=' /restore/dm8/DAMENG_TEST/dm.ini恢复到新目录时 dm.ini 可能沿用备份库的参数。独立主机仍要核对实例名、端口和其他配置;同机演练更不能让恢复库占用生产端口。这里仅读取文件,实际修改须按演练环境配置方案完成,并复查文件路径与服务脚本。
1/opt/dmdbms/bin/dmserver /restore/dm8/DAMENG_TEST/dm.ini只在第 34、35 条成功、且第 36 条及监听/路径隔离已经核实后启动。启动后第一件事是确认实际连接端指向演练库,再查魔数和业务数据;启动成功只证明库能打开,不代表目标时间点恢复正确。
1SELECT DB_MAGIC FROM V$RLOG;在演练库的 DIsql 会话执行,结果与第 12 条备份集记录的来源魔数对照。更新后值应能区分源库和恢复库;若连接端没核实,查到一个正确数字也可能只是误连了源库。
下面是另一个独立演练目标,不接在第 35—38 条已经更新魔数并启动的库后面。恢复边界要取自归档事件和业务事故记录,先核对全备 END_LSN;目标 LSN 若早于备份结束 LSN,不能这样恢复。
1RESTORE DATABASE TO '/restore/dm8/DAMENG_PITR' FROM BACKUPSET '/backup/dm8/full_20260916';目录须是独立、空的演练路径,操作前同样核对备份片、源库魔数和外置数据文件路径。时间点恢复先从同一份基准备份重新还原,不能拿已启动、已产生新日志的演练库直接倒回去。
1RECOVER DATABASE '/restore/dm8/DAMENG_PITR/dm.ini' WITH ARCHIVEDIR '/archive/dm8/source' UNTIL LSN 900000000;900000000 是示例,必须从现场归档和误操作位置确定,并且不早于全备的 END_LSN。归档目录要覆盖全备所需的 REDO 到目标位置,DB_MAGIC 必须与源备份链相符;跨库凑日志有损坏数据的风险。恢复时不要拿仍在写入的源库归档做不完整快照。
1RECOVER DATABASE '/restore/dm8/DAMENG_PITR/dm.ini' UPDATE DB_MAGIC;只有第 40 条成功且确认停止位置正确,才更新魔数并允许演练库正常启动。更新以后再用源库旧归档继续恢复,魔数关系已变化;别把这一步当作可随时重复的普通检查命令。
1/opt/dmdbms/bin/dmserver /restore/dm8/DAMENG_PITR/dm.ini先按第 36 条的方法核对这份 dm.ini 的监听端口和实例身份,确保不会与另一演练库或生产库冲突。启动后还要从客户端核实实际连接端;不能因 DMRMAN 已完成就假定业务侧访问的是正确库。
1SELECT COUNT(*) AS order_count,2 MIN(CREATE_TIME) AS first_order,3 MAX(CREATE_TIME) AS last_order4FROM APP.ORDERS;在启动后的时间点演练库执行,表名和时间列按现场替换。计数与时间范围只是第一层检查;误删、误改要对受影响主键、金额、状态和相关表逐项比对,确认错误操作没有被归档恢复带进来。
以下备份命令在源库 OPEN、归档正常时用 DIsql 执行。表空间恢复写在后面,必须先停演练库;不要把演练用的 dm.ini 换成生产路径。
1SELECT * FROM V$BACKUP_MONITOR;备份跑得久,先看任务还有没有进展,再看介质吞吐和日志。这个视图看当前任务;作业结束后要到备份历史和备份集里查。
1SELECT * FROM V$BACKUP_HISTORY;这里最多保留最近 100 条监控记录,别拿它当永久审计。失败任务要保留日志和备份集路径,单看最终状态很难复盘是哪一片出错。
1SELECT * FROM V$BACKUP_FILES;用来确认当前任务扫到了哪些文件,尤其是最近新增的业务表空间。任务结束后视图内容可能消失;需要长期留档的文件清单到备份集元数据里找。
1BACKUP TABLESPACE MAIN FULL2 BACKUPSET '/backup/dm8/ts_main_full_20260917';MAIN 只是示例表空间,执行前查现场名称与状态。库和表空间都要处于 OPEN,且本地归档可用;完成后检查备份集,不要把表空间备份当成整库备份。
1BACKUP TABLESPACE MAIN INCREMENT2 WITH BACKUPDIR '/backup/dm8'3 BACKUPSET '/backup/dm8/ts_main_incr_20260917';基备不在默认目录时,WITH BACKUPDIR 要覆盖它的搜索位置。默认是差异增量;恢复时必须连同依赖的基备及归档一起准备。
1SELECT SF_BAKSET_CHECK('DISK', '/backup/dm8/ts_main_full_20260917');在源库 DIsql 用具有 DBA 权限的账号执行。校验备份集可读性,但不能证明表空间在演练库里已经恢复成功;备份片跨介质搬运后还要在恢复端复查。
1SHOW BACKUPSET '/backup/dm8/ts_main_full_20260917' INFO TABLESPACE;在介质可访问的恢复主机运行。对上表空间、来源库、备份时间与文件路径,再谈还原;混合备份目录里只凭备份集名称判断最容易用错。
第 51 条在已停库的源库主机用 DMRMAN 执行;第 52—54 条在备份介质可访问的恢复主机执行。第 53—54 条会向演练目录写入归档文件。先准备独立目录,不要指向生产归档路径。
1BACKUP ARCHIVE LOG ALL DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' BACKUPSET '/backup/dm8/arch_offline_20260917';这不是联机归档备份。DMRMAN 需要源库处于脱机状态,且已配置归档;没有停库窗口就用第 28—30 条的 DIsql 方式。备完记录此次停库时间,避免把窗口之后的新归档算进这套备份。
1CHECK BACKUPSET '/backup/dm8/arch_offline_20260917';在恢复主机检查介质上的那一份,别只拿源库刚生成时的校验结果。校验通过后再对照 LSN 区间和源库标识;完整性与连续性是两件事。
1RESTORE ARCHIVE LOG FROM BACKUPSET '/backup/dm8/arch_offline_20260917' TO ARCHIVEDIR '/restore/dm8/archtest' OVERWRITE 2;OVERWRITE 2 遇到已有同名归档直接报错,适合先发现目录混用。目标目录只放这次演练的归档;这一步写文件,还没有对任何数据库应用 REDO。
1RESTORE ARCHIVE LOG FROM BACKUPSET '/backup/dm8/arch_offline_20260917' LSN BETWEEN 50000 AND 120000 TO ARCHIVEDIR '/restore/dm8/arch_segment' OVERWRITE 2;LSN 数字按事故记录换成现场值。DMRMAN 还原的是覆盖该范围的完整归档文件,边界不一定正好落在 50000 或 120000;要恢复数据库,还得检查这段前后是否接得上基备所需的日志。
1find /restore/dm8/archtest -maxdepth 1 -type f -printf '%f %s bytes\n' | sort在恢复主机执行。把文件名和大小与备份集输出逐项对照;目录里文件齐了,还要用第 3、9 条记录的 LSN 范围查连续性。不要直接把这个目录接到仍在运行的生产库上。
这一组在隔离恢复主机用 DMRMAN 演练。目标库必须与表空间备份的源库一致,不能拿另一套同名库代替;演练副本保留源库标识,但网络、监听和文件目录必须与生产隔离。还原前停止目标实例,并留好当前文件副本。
1SELECT ID, PATH FROM V$DATAFILE;在源库仍可查询时用 DIsql 执行,并把结果随备份记录保存。DMRMAN 按表空间内的文件编号还原指定文件,编号不是查询结果左侧的行号;路径也要完整保留。
1CHECK BACKUPSET '/backup/dm8/ts_main_full_20260917';先确认恢复主机读到的是准备使用的那份介质。校验失败就停在这里,不要继续还原;重新复制备份片后再校验,也不要用另一份同名目录顶替。
1RESTORE DATABASE '/restore/dm8/DAMENG_TS/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/backup/dm8/ts_main_full_20260917';这条会覆盖目标库中 MAIN 表空间的数据文件。目标实例必须已经停止,并且是该备份的源库副本;路径若指到生产 dm.ini,后果就是直接改生产文件,执行前要逐字符核对。
1RECOVER DATABASE '/restore/dm8/DAMENG_TS/dm.ini' TABLESPACE MAIN;还原只把数据文件放回去,恢复还要重做 REDO。恢复过程中不要中断 DMRMAN;完成后表空间才会回到一致状态。失败时保留日志和目标文件,不要立刻启动实例反复试。
1RECOVER DATABASE '/restore/dm8/DAMENG_TS/dm.ini' TABLESPACE MAIN WITH ARCHIVEDIR '/restore/dm8/arch01', '/restore/dm8/arch02';归档分散存放时显式列出搜索目录。两个目录都应来自同一条备份链,并覆盖表空间备份结束后的日志;只要中间缺一段,后面的归档再多也接不上。
1DUMP BACKUPSET '/backup/dm8/ts_main_full_20260917' MAPPED FILE '/restore/dm8/map/main_map.txt';这条只生成映射文件,还没有还原数据。用于演练机目录与源库不同的情况;生成后先编辑 data_path,再检查每个目标路径是否落在隔离存储。
1grep -E '^[[:space:]]*(ts_name|data_path|mirror_path)[[:space:]]*=' /restore/dm8/map/main_map.txt在恢复主机读取映射文件。确认 MAIN 的 data_path 没有指回生产挂载点,也没有和另一套演练库重名;发现路径不对,修改后重新检查再执行还原。
1RESTORE DATABASE '/restore/dm8/DAMENG_TS/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/backup/dm8/ts_main_full_20260917' MAPPED FILE '/restore/dm8/map/main_map.txt';映射文件决定数据文件最终写到哪里,命令本身不会替你判断路径是否安全。还原完成后继续执行第 59 或 60 条恢复日志,再启动隔离实例核对对象和业务数据。
1REPAIR ARCHIVELOG DATABASE '/restore/dm8/DAMENG_TS/dm.ini';仅在目标实例已经停止时用 DMRMAN 执行。它会处理 dmarch.ini 配置的本地归档目录,目的是把异常退出时尚未刷入归档的 REDO 补齐;路径仍要指向隔离演练库,不能对运行中的库尝试。
1SELECT NAME, STATUS$ FROM V$TABLESPACE WHERE NAME = 'MAIN';先从客户端确认连接的是隔离实例,再执行查询。STATUS$ = 0 表示 ONLINE;这只是存储层检查,还要回读受影响表、索引和关键业务记录。表空间能打开,不等于恢复点已经符合业务要求。
DM8 只有普通用户表支持联机表还原。以下 SQL 在 OPEN 状态的隔离副本中用 DIsql 执行;数据守护环境只能在主库执行,MPP、系统表、临时表等不适用。表还原会改目标表,先保留现状和审批记录。
1BACKUP TABLE APP.ORDERS TO ORDERS_BAK_20260917 BACKUPSET '/backup/dm8/tab_orders_20260917';在源库由表所有者或具备相应权限的账号执行。表备份不依赖归档,但只解决这张表的数据和结构恢复,不能替代库级备份;完成后马上校验并记录业务时间点。
1SELECT BACKUPNAME, TABLENAME FROM V$BACKUPSET_TABLE WHERE BACKUPPATH = '/backup/dm8/tab_orders_20260917';与第 5 条相同,这个路径若不在默认备份目录,要先在当前 DIsql 会话加入搜索目录。返回的表名和备份名都应与任务单一致,避免恢复了另一张同名测试表。
1SELECT SF_BAKSET_CHECK('DISK', '/backup/dm8/tab_orders_20260917');需要 DBA 权限。校验结果连同备份路径一起留档;校验只证明备份集可以读取,目标表定义、索引和约束能否匹配,还要在副本里实际恢复。
1SELECT COUNT(*) AS ROWS_NOW, MIN(CREATE_TIME) AS FIRST_TIME, MAX(CREATE_TIME) AS LAST_TIME FROM APP.ORDERS;在隔离副本执行,列名按现场表结构替换。除了总数,还应保存事故涉及的主键、状态和金额;后面恢复会改表,不能等改完才回想原来是什么。
1RESTORE TABLE APP.ORDERS FROM BACKUPSET '/backup/dm8/tab_orders_20260917';这是写操作。目标表必须存在,定义要与备份表一致,并且不能带来冲突的二级索引或冗余约束;先在隔离副本演练,确认覆盖范围后再制定生产恢复步骤。
1RESTORE TABLE APP.ORDERS STRUCT FROM BACKUPSET '/backup/dm8/tab_orders_20260917';直接恢复数据若报索引或约束冲突,可先恢复结构。STRUCT 会校验目标定义,并删除目标表已有的二级索引和约束,再按备份内容处理;不能把它当成只读的结构比较命令。
1RESTORE TABLE APP.ORDERS FROM BACKUPSET '/backup/dm8/tab_orders_20260917';紧接第 71 条执行,并保留两步的日志。表还原完成后不再做 REDO 恢复,但必须检查行数、关键主键、索引和约束,不能只看命令返回成功。
1RESTORE TABLE APP.ORDERS_RESTORE WITHOUT INDEX FROM BACKUPSET '/backup/dm8/tab_orders_20260917';APP.ORDERS_RESTORE 要提前创建为与备份表匹配的结构。数据量大时可先不重建索引,便于核对和抽取误删记录;确认数据后再按正式 DDL 建索引,别让临时表长期承接业务流量。
1RESTORE TABLE APP.ORDERS_RESTORE WITHOUT CONSTRAINT FROM BACKUPSET '/backup/dm8/tab_orders_20260917';目标表上不能已有约束,否则会报错。这个方式适合先把数据取出来核对,不代表约束可以永久省略;合并回业务表之前,要验证主键重复、外键关系和检查条件。
1SELECT COUNT(*) AS ROWS_RESTORED, MIN(CREATE_TIME) AS FIRST_TIME, MAX(CREATE_TIME) AS LAST_TIME FROM APP.ORDERS_RESTORE;把结果与第 69 条、事故时间和业务清单放在一起看。数量相同也可能有误更新,最终还要按受影响主键逐行比对;确认无误后再决定回写,临时恢复表本身不应直接替代正式表。
DM8 不会自动替你清理过期备份。下面先选一份已经完成留存和恢复验证、并确认不在保留周期内的独立备份集;删除命令只在介质管理员和 DBA 双方确认后执行。
1SHOW BACKUPSETS WITH BACKUPDIR '/backup/dm8/expired';在 DMRMAN 执行。先记录备份类型、来源库、时间和真实路径;目录名叫 expired 不代表里面每一份都能删,仍要逐套核对保留策略与恢复任务。
1SHOW BACKUPSET '/backup/dm8/expired/incr_20260801' RECURSIVE WITH BACKUPDIR '/backup/dm8/expired';这里既要看它依赖哪份基备,也要反过来确认候选基备是否仍被保留期内的增量引用。输出不完整时扩大搜索目录,不能因为当前目录没显示依赖就直接删除。
1du -sh /backup/dm8/expired/*在备份存储主机执行,只读。空间统计用于安排清理窗口,不是删除依据;同一备份集可能有多个片,不能挑最大的文件手工删一部分。
1REMOVE BACKUPSET '/backup/dm8/expired/full_20260801';这是不可逆的介质删除操作。未加 CASCADE 时,如果它仍是增量基备,DMRMAN 会报错并阻止删除;不要为了绕过报错直接补 CASCADE,先回到第 77 条确认整条链是否都已过期。
1SHOW BACKUPSETS WITH BACKUPDIR '/backup/dm8/expired';把删除前后的清单放在一起,确认目标备份消失、其他链仍在。随后对下一次计划恢复要用的全备、增量和归档各做一次 CHECK BACKUPSET;释放了空间,不等于剩余恢复链仍然完整。
下面仍在 OPEN、归档正常的源库用 DIsql 执行。并行数、限速值和压缩级别都只是示例,先在非高峰测出备份耗时、CPU 和存储吞吐,再放进正式作业。
1BACKUP DATABASE FULL BACKUPSET '/backup/dm8/full_20260921' BACKUPINFO 'weekly full backup';描述信息能区分周全备、迁移备份和临时备份,比只看目录名稳妥。它最多 256 字节,适合写任务用途和变更单号,不要在里面放账号、口令或客户敏感信息。
1BACKUP DATABASE FULL BACKUPSET '/backup/dm8/full_limited_20260921' LIMIT READ SPEED 100 WRITE SPEED 80;单位是 MB/s,0 表示不限速。示例把读速限制为 100、写速限制为 80;是否合适要看生产存储余量,限得过低会把备份窗口拖长。
1BACKUP DATABASE FULL BACKUPSET '/backup/dm8/full_parallel_20260921' PARALLEL 4;实际并行度还受数据文件数量和主机资源限制,并不是写了 4 就一定跑满四路。并行备份会生成子备份集,搬运和删除时要按整套处理,不能单独丢掉其中一份。
1BACKUP DATABASE FULL BACKUPSET '/backup/dm8/full_trace_20260921' TRACE FILE '/var/log/dm8/full_trace_20260921.log' TRACE LEVEL 2;TRACE LEVEL 2 才会启用跟踪。日志目录要提前创建并保证数据库软件属主可写;跟踪文件写失败不会替代备份任务日志,排错时两边都要看。
1SELECT BACKUP_NAME, START_TIME, END_TIME, AVG_READ, AVG_WRITE, STATUS, ERROR FROM V$BACKUP_HISTORY ORDER BY END_TIME DESC;用第 81—84 条的备份名定位任务,比较平均读写速度与窗口耗时。STATUS 和 ERROR 用来判断作业结果;即使状态成功,后面仍要检查备份集和恢复链。
1BACKUP DATABASE INCREMENT CUMULATIVE WITH BACKUPDIR '/backup/dm8' BACKUPSET '/backup/dm8/cumulative_20260922';累积增量只依赖完全备份,不依赖中间的差异增量,恢复链更短,备份量通常也会更大。DMRMAN 的滚动增量合并不使用这种备份,别和第 91—100 条混用。
1BACKUP DATABASE INCREMENT BASE ON BACKUPSET '/backup/dm8/full_20260921' BACKUPSET '/backup/dm8/incr_base_20260922';目录中存在多套全备时,显式写出基备可以避免系统选到最近的另一条链。执行前先校验这份全备;备完后再递归查看依赖关系,不能只凭参数判断链已经完整。
1SHOW BACKUPSET '/backup/dm8/incr_base_20260922' RECURSIVE WITH BACKUPDIR '/backup/dm8';在 DMRMAN 执行。输出中应能找到第 87 条指定的全备;如果出现另一份基备或缺少备份片,先查路径和作业日志,不要继续做恢复演练。
1CHECK BACKUPSET '/backup/dm8/cumulative_20260922';在恢复主机校验介质上的副本。累积增量通过校验后,还要单独校验它依赖的全备;任何一份失败,这条恢复链都不能交付。
1CHECK BACKUPSET '/backup/dm8/incr_base_20260922';与第 89 条分开记录结果,便于知道是哪一条策略出了问题。校验通过只完成介质检查,最终仍要用隔离库还原并回读业务数据。
以下操作在隔离恢复主机用 DMRMAN 执行。目标目录不能启动业务、不能提前执行 RECOVER,否则后续增量无法继续合并;这里使用普通差异增量,不使用第 86 条的累积增量。
1RESTORE DATABASE TO '/restore/dm8/DAMENG_MERGE' FROM BACKUPSET '/backup/dm8/full_20260921';这一步只还原,不做恢复,也不更新 DB_MAGIC。目标路径必须为空并与生产存储隔离;创建完成后保留 DMRMAN 日志,确认数据文件都落在预定目录。
1BACKUP DATABASE INCREMENT BASE ON BACKUPSET '/backup/dm8/full_20260921' BACKUPSET '/backup/dm8/incr_merge_20260922';这条回到源库 DIsql 执行。基备与第 91 条还原使用的全备必须一致;增量完成后先校验,再把整套备份片送到恢复主机。
1MERGE DATABASE '/restore/dm8/DAMENG_MERGE/dm.ini' FROM BACKUPSET '/backup/dm8/incr_merge_20260922' WITH BACKUPDIR '/backup/dm8';在恢复主机执行。合并会写目标库数据文件,期间不能启动这套库;失败时保留当前文件和日志,先查基备及增量链,不要对同一目录连续盲目重试。
1BACKUP DATABASE INCREMENT BASE ON BACKUPSET '/backup/dm8/incr_merge_20260922' BACKUPSET '/backup/dm8/incr_merge_20260923';在源库 DIsql 执行,基备改成上一份差异增量。这样依赖链按天向前推进;上一份增量在新链仍引用它时不能清理。
1MERGE DATABASE '/restore/dm8/DAMENG_MERGE/dm.ini' FROM BACKUPSET '/backup/dm8/incr_merge_20260923' WITH BACKUPDIR '/backup/dm8';执行前确认第 93 条已经成功,并再次校验新备份集。合并完成只表示数据页推进到了本次增量,不包含增量结束后的归档日志。
1RECOVER DATABASE '/restore/dm8/DAMENG_MERGE/dm.ini' WITH ARCHIVEDIR '/restore/dm8/latest_arch';只有确定不再继续增量合并、正式进入恢复阶段时才执行。归档目录要覆盖最后一份增量之后的 REDO;中间有缺口就停下来补日志,不能跳过缺口强行启动。
1RECOVER DATABASE '/restore/dm8/DAMENG_MERGE/dm.ini' UPDATE DB_MAGIC;这一步把目标库从持续合并状态转成可启动的恢复库。执行后不能再接着合并旧增量;如果还要维持滚动副本,需要从全备重新建立另一套目标。
1/opt/dmdbms/bin/dmserver /restore/dm8/DAMENG_MERGE/dm.ini启动前核对实例名、端口、服务脚本和数据路径,确保不会与生产库冲突。进程起来以后先从客户端确认连接端,再做数据库与业务回读。
1SELECT NAME, STATUS$, ROLE$, LAST_CKPT_TIME FROM V$DATABASE;在恢复库 DIsql 查询。NAME、角色和状态要与演练方案一致,同时与源备份记录的 DB_MAGIC 区分;发现连错实例立即停止后续业务验证。
1SELECT COUNT(*) AS ORDER_COUNT, MIN(CREATE_TIME) AS FIRST_TIME, MAX(CREATE_TIME) AS LAST_TIME FROM APP.ORDERS;这是最后的基础回读,不是完整验收。再按故障清单检查关键主键、金额、状态和关联表,并记录实际恢复点;只有数据库状态、业务数据和恢复目标都对得上,这次演练才算完成。
备份作业显示成功,只能说明任务跑完了。备份片是否齐全、增量基备能不能找到、归档是否连续,最后还得靠隔离恢复来证明。平时把这些检查结果和恢复日志留好,真正出故障时会省掉很多猜测。
如果这 100 条命令对你有用,欢迎点赞、收藏,也可以转给负责达梦数据库的同事。
ORA100 DBA100 数据库命令手册
更多数据库运维命令:
微信小程序搜索:「三笠的百令册」