达梦数据库 DM9 备份恢复实战操作全流程
一、备份恢复体系概览
DM 数据库的备份还原包括两种类型:物理备份还原和逻辑备份还原。物理备份还原是对数据库的操作系统物理文件(如数据文件、控制文件和日志文件等)的备份还原,例如使用 RMAN 工具进行的备份还原;逻辑备份还原是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份还原,例如使用 dexp 和 dimp 进行的备份还原。
物理备份成功后会在指定目录(缺省为 SYSTEM_PATH 下的 bak 目录)中生成备份文件(即备份集)。备份集包括备份元数据文件(后缀 .meta)和备份片文件(后缀 .bak);逻辑备份成功后会在指定目录(缺省为 dexp 工具所在路径)中生成备份文件(后缀 .dmp),备份文件可拷贝至任何地方存放,不会影响系统运行。
达梦数据库中,备份还原的对象包括:表、表空间和数据库。
二、实战前置准备:配置本地归档
无论联机还是脱机备份方式,服务器都需要配置本地归档,配置方法分两步:
步骤 1:配置 dm.ini,打开 ARCH_INI 参数
ARCH_INI = 1 #打开归档配置
步骤 2:配置 dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm/data/DAMENG/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~2147483647M
注意事项
如果 dm.ini 中的 USE_AP(备份还原实现策略)设置为 1,即采用 DMAP 辅助进程方式执行备份,则联机备份前必须先启动 dmap 服务(./dmap),该方式可支持第三方备份并大幅提升备份还原效率;设置为 2 时为无辅助进程方式,不依赖 DMAP,由 DMSERVER 主进程自身执行备份还原,但不支持第三方备份。dm.ini 中的 ARCH_INI 参数缺省值为 0,需要改为 1 启用归档。
三、物理备份实战
3.1 联机备份(数据库运行中,使用 DIsql)
登录 DIsql 后执行:
-- 数据库完全备份
SQL> BACKUP DATABASE BACKUPSET '/data/dmdata/dmbak/BACKUP_FILE_01';
-- 或显式指定 FULL 关键字
SQL> BACKUP DATABASE FULL BACKUPSET '/data/dmdata/dmbak/FULL_BACKUP_FILE_01';
-- 大库可使用不带日志方式,减少备份量
SQL> BACKUP DATABASE FULL BACKUPSET '/data/dmdata/dmbak/FULL_BACKUP_FILE_02' WITHOUT LOG;

3.2 脱机备份(数据库正常关闭后,使用 DMRMAN)
# 1. 正常关闭数据库后执行脱机备份
dmrman CTLSTMT="BACKUP DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/data/dmdata/dmbak/RMANBACKUP_FILE_01'"
# 指定 USE_AP=2 的写法
dmrman CTLSTMT="BACKUP DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FULL TO BACKUP_FILE2 BACKUPSET '/data/dmdata/dmbak/RMANBACKUP_FILE_02'" USE_AP=2


注意:对于新初始化的库,首次启动不允许使用 Mount 方式,需要先正常启动并正常退出,然后才允许 Mount 方式启动;准备数据时如果主库是新初始化的库,应先正常启动并正常退出,再使用备份还原方式准备数据。
3.3 归档备份(联机)
先查询备份集信息,从指定 LSN 开始备份归档日志:
-- 如果备份集不在默认备份路径下,需要先将备份集所在目录添加进来,否则查询不到备份集信息
SQL> SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/data/dmdata/dmbak/dm0827');
-- 查询备份集信息(获取 BEGIN_LSN,假设为 38491)
SQL> SELECT BACKUP_NAME, BEGIN_LSN FROM V$BACKUPSET;
-- 从指定 LSN 开始备份归档日志
SQL> BACKUP ARCHIVE LOG FROM LSN 38491 BACKUPSET '/data/dmdata/dmbak/dm0827';

四、物理还原与恢复实战(DMRMAN 脱机操作)
还原恢复的标准三步流程为:还原(RESTORE)→ 恢复(RECOVER)→ 更新 DB_MAGIC。
4.1 联机备份集的还原恢复
# 步骤1:还原数据库
dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FROM BACKUPSET '/data/dmdata/dmbak/RMANBACKUP_FILE_01'"
# 步骤2:恢复数据库(重做日志)
dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FROM BACKUPSET '/data/dmdata/dmbak/RMANBACKUP_FILE_01'"
# 步骤3:数据库更新(更新 DB_MAGIC)
dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' UPDATE DB_MAGIC"

查看SVR_VERSION(服务器版本)、STATUS$(实例状态):

4.2 脱机备份集的还原
因为脱机备份没有产生任何 REDO 日志,可以省略恢复数据库的操作步骤,直接更新 DB_MAGIC:
./dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FROM BACKUPSET '/data/dmdata/dmbak/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' UPDATE DB_MAGIC"
4.3 归档还原 + 归档恢复(恢复到更接近最新状态)
适用于数据规模大、联机备份耗时长、主库又新产生大量归档日志的场景,可将数据恢复到更接近主库的最新状态:
# 1. 还原归档日志到指定目录
./dmrman CTLSTMT="RESTORE ARCHIVE LOG FROM BACKUPSET '/data/dmdata/dmbak/dm0827' TO ARCHIVEDIR '/data/dmdata/arch'"
# 2. 利用归档日志恢复数据库
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' WITH ARCHIVEDIR '/data/dmdata/arch'"
# 3. 更新 DB_MAGIC
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' UPDATE DB_MAGIC"
4.4 用于备库/容灾场景的还原
还原为备库时,恢复步骤使用 FOR STANDBY 关键字:
./dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FROM BACKUPSET '/data/dmdata/dmbak/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' FOR STANDBY FROM BACKUPSET '/data/dmdata/dmbak/BACKUP_FILE_01'"
./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/data/DMSJTEST/dm.ini' UPDATE DB_MAGIC"
4.5 还原恢复一致性注意事项
脱机还原恢复一致性时,如果使用的是联机备份集,建议指定 UNTIL END_LSN 选项,保证所有节点数据恢复到一致性状态(因为备份集中记录的 C_LSN 有可能小于 END_LSN);如果使用脱机备份集,主库正常退出情况下生成的不指定 UNTIL END_LSN 也可恢复一致,主库异常退出情况下则必须指定 UNTIL END_LSN。可通过 SHOW BACKUPSET 命令查看 C_LSN 和 END_LSN 信息。
4.6 DMDSC 集群环境差异
DMDSC 集群的表备份还原、表空间备份与单节点没有区别;但表空间还原和数据库恢复需要重做归档日志,需通过节点间相互配置远程归档来解决访问其他节点本地归档日志的问题。DMDSC 环境下的典型操作:
# DMDSC 需指定 dcr_ini 访问 ASM 共享存储上的归档
./dmrman dcr_ini=/dmdata/dameng/dmdcr.ini
RMAN> RESTORE DATABASE '/dmdata/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/data/dm_bak/db_full_bak_for_dsc';
RMAN> RECOVER DATABASE '/dmdata/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR '+DMDATA/DSC0/arch','+DMDATA/DSC1/arch';
RMAN> RECOVER DATABASE '/dmdata/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' UPDATE DB_MAGIC;
以上为 DMDSC 非镜像环境的完整还原恢复实例。镜像环境还原时需要使用新版 dmrman 导出备份集映射文件(mappedfile),在映射文件中指定 data_mirror 与 data_striping 等参数后以指定映射文件方式还原。
五、逻辑备份实战(dexp / dimp)
5.1 工具与四种级别
dexp 和 dimp 是 DM 数据库自带的命令行工具,位于安装目录 /dmdbms/bin 下,分别实现逻辑备份和逻辑还原;两者都是在联机方式(数据库正常运行)下完成。工具名有两种写法:dexp/dimp 的文件必须存放在客户端,dexpdp/dimpdp 的文件必须存放在服务器端。
逻辑导出和导入分为四种独立互斥的级别:
- 数据库级(FULL):导出或导入整个数据库中的所有对象
- 用户级(OWNER):导出或导入一个或多个用户所拥有的所有对象
- 模式级(SCHEMAS):导出或导入一个或多个模式下的所有对象
- 表级(TABLES):导出或导入一个或多个指定的表或表分区
语法:dexp PARAMETER=value { PARAMETER=value },其中 USERID 必须置于首位。
5.2 dexp 导出实战
# 全库导出
./dexp SYSDBA/'z+05uAGJefZJQeikc'@192.168.40.156:5237 FILE=dexp01.dmp LOG=dexp01.log DIRECTORY=/data/dmdexpbak/dexp FULL=Y
# 模式导出
./dexp USERID=SYSDBA/'z+05uAGJefZJQeikc' FILE=db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dexp
# 用户导出
./dexp USERID=SYSDBA/'z+05uAGJefZJQeikc' FILE=db_str.dmp LOG=db_str.log OWNER=USER01 DIRECTORY=/mnt/data/dexp
# 表导出
./dexp USERID=SYSDBA/'z+05uAGJefZJQeikc' FILE=db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dexp
# 加密导出
./dexp SYSDBA/'z+05uAGJefZJQeikc'@192.168.40.156:5237 FILE=dexp03.dmp LOG=dexp03.log DIRECTORY=/data/dmdexpbak/dexp FULL=Y ENCRYPTO=Y ENCRYPTO_PASSWORD=abc123_DBA ENCRYPTO_NAME=DES_CBC
常用参数说明:
- FILE/LOG/DIRECTORY 优先级:FILE 和 LOG 中指定的路径优先级高于 DIRECTORY;未指定路径时使用系统当前路径
- COMPRESS:是否压缩导出文件,缺省不压缩;COMPRESS_LEVEL 取值 0~9
- FILESIZE + %U 通配符:文件名包含 %U 时可自动扩展成多个文件(起始 00001),配合 FILESIZE 控制单个文件大小,如
FILE=db_str%U.dmp FILESIZE=128m - PARFILE:参数很多时可存成参数文件复用
5.3 dimp 导入实战
# 全库导入
./dimp SYSDBA/'z+05uAGJefZJQeikc'@192.168.40.156:5237 FILE=/data/dmdexpbak/dexp/dexp01.dmp LOG=dimp02.log DIRECTORY=/data/dmdexpbak/dimp FULL=Y
# 模式导入
./dimp SYSDBA/'z+05uAGJefZJQeikc'@192.168.40.156:5237 FILE=/data/dmdexpbak/dexp/dexp01.dmp LOG=dimp02.log DIRECTORY=/data/dmdexpbak/dimp SCHEMAS=SYSDBA,OTHER,PERSON
# 加密文件导入(加密密钥和算法必须与导出时相同)
./dimp SYSDBA/'z+05uAGJefZJQeikc'@192.168.40.156:5237 FILE=/data/dmdexpbak/dexp/dexp03.dmp LOG=dimp04.log DIRECTORY=/data/dmdexpbak/dimp FULL=Y ENCRYPTO_PASSWORD=abc123_DBA ENCRYPTO_NAME=DES_CBC
导入方式可以和导出方式不一致,例如导出方式不为 FULL 时,导入时也可以指定 FULL 方式,将导出文件包含的全部内容导入到指定实例中。
常用参数:
- TABLE_EXISTS_ACTION:表已存在时的处理方式,取值 SKIP(跳过)/ APPEND(追加)/ TRUNCATE(先清空再导)/ REPLACE(先删表再导)
- IGNORE:是否忽略创建对象错误,缺省 N
- REMAP_SCHEMA / REMAP_TABLE / REMAP_TABLESPACE:跨用户/表/表空间导入映射,如
REMAP_SCHEMA=SYSDBA:PERSON - TABLE_PARALLEL:并行导入,如
TABLE_PARALLEL=3 - INDEXFIRST:大数据量导入时建议设 Y 先建索引再导数据,避免建索引前遍历大量数据
- FEEDBACK:每 x 行打印进度
导出导入后应查看 LOG 日志(dexp01.log、dimp02.log)了解详细的对象个数与数据行数统计信息。
5.4 版本兼容注意事项
从 V8.1.2.69 版本开始用户口令新增了加盐选项,若将口令加盐的库导出后导入到不支持加盐选项的旧版本库中会失败;解决办法是导出前先用 ALTER 语句将用户口令调整为 NO SALT,再做导出导入。
六、生产环境建议与避坑要点
- 归档日志是恢复数据库的关键,建议将归档文件与数据文件分别保存到不同的磁盘上,防止归档文件和数据文件同时损坏,以降低数据无法修复的风险。
- 备份的安全检查策略由 dm.ini 中 BAK_SAFE_CHECK 参数控制(缺省值 7),包括数据文件 CORRUPT 状态报错、HUGE 文件错误检查、增量备份时检查备份集链表必须包含完全备份集等策略,支持组合取值。
- 备份文件中会记录原备份库的模式和 OGUID 信息,使用备份文件还原成功后,需要根据实际配置情况修改数据库的模式和 OGUID 值;对 Normal 模式的库如果不确定其是否一定作为主库使用,必须使用脱机备份而非联机备份,避免主备数据不一致。
- 不能使用分别初始化库或者直接拷贝数据文件的方法来同步数据:每个库的永久魔数(permanent_magic)一经生成永不改变,且 dminit 初始化时生成的随机加密密钥每次都不相同,备库无法解析主库密钥加密的数据;DB_MAGIC 每经过一次还原、恢复操作就会变化,以此区分同一数据守护环境中不同的库。
- 还原操作指定 REUSE DMINI 选项时,会将备份集中的 DM.INI 参数更新到还原节点的 DM.INI,集群中其他节点不会自动更新,需手动修改。




