达梦数据库备份恢复操作指南

达梦数据库库级还原恢复

达梦数据库的库级恢复是生产环境最核心的灾备操作。当出现数据文件损坏、系统表空间故障或需要回滚到某个历史状态时,库级恢复是唯一能将数据库整体拉起的方案。

库级恢复的核心是 dmrman(脱机备份还原管理工具),必须三步走:RESTORE(还原)→ RECOVER(恢复)→ UPDATE DB_MAGIC(更新魔数)


使用 dmrman 进行库级恢复(命令行标准操作)

这是生产环境最推荐的方式,通过命令行精准控制。

1. 恢复前的准备

# 1. 停止数据库服务(必须)
cd /dm8/bin
./DmServiceDMSERVER stop

# 2. 确认 DmAPService 服务已启动(物理备份恢复依赖此辅助进程)
./DmAPService start
./DmAPService status   # 确认状态为 active

2. 执行"三步曲"恢复

进入 dmrman 交互界面,按顺序执行以下三条命令

步骤命令作用说明
1. 还原RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/full';将备份集中的有效数据页重新写入目标数据文件,使数据文件回到备份时刻的状态
2. 恢复RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dm8/arch';重做归档日志,将数据库前滚到故障发生前的最后时刻(保证数据不丢)
3. 更新魔数RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC;更新数据库唯一标识,解决“还原后的库与原集群混淆”的问题,库级恢复必须执行此步

路径说明

  • /dm8/data/DAMENG/dm.ini:你的数据库实例配置文件路径,根据实际修改。

  • /dm8/backup/full:全量备份集的存放路径。

  • /dm8/arch:归档日志存放路径。

3. 启动数据库验证

./DmServiceDMSERVER start

使用 Console 工具进行库级恢复(图形化操作)

对于不熟悉命令行的DBA,达梦提供了 console 图形化工具,操作直观,不易遗漏步骤。

  1. 启动工具:cd /dm8/tool && ./console

  2. 执行还原

    • 在左侧导航栏点击 “还原” -> “还原”

    • 在右侧窗口中,选择 “还原类型” 为 “库”

    • 点击 “选择备份集”,找到你的备份文件(如 /dm8/backup/full)。

    • 点击 “还原” 按钮。

  3. 执行恢复

    • 还原成功后,点击左侧 “恢复”

    • 系统会自动识别归档目录,确认后点击 “确定”

    • 这一步对应命令行中的 RECOVER 操作。

  4. 更新魔数

    • 恢复成功后,点击左侧 “更新Magic”

    • 点击 “确定” 完成最后一步。


关键概念解析(为什么必须三步走)

在生产环境中理解这三步背后的原理,能帮你更好地应对突发状况:

  • 还原 vs 恢复还原只是拷贝数据文件,此时的数据库是“冷备份”状态(比如昨天凌晨2点的数据)。恢复是利用归档日志,把昨天2点到今天故障前的所有操作重做一遍,让数据回到最新状态

  • 魔数的作用DB_MAGIC 是数据库的身份证。如果不更新魔数,数据库启动时会认为自己是“旧集群的副本”,可能拒绝启动或产生日志混乱这个步骤只在库级恢复时需要,表空间恢复不需要

生产环境注意事项

  1. 归档日志完整性RECOVER 步骤严重依赖归档日志。如果归档日志缺失或不连续,恢复将停留在某个时刻且无法继续。归档日志与数据文件应分开物理存储

  2. 异机恢复:如果需要将备份恢复到另一台服务器,确保目标服务器的操作系统位数、数据库版本与源库一致。

  3. 备份有效性验证:定期使用 dmrman 的 CHECK BACKUPSET 命令验证备份集是否损坏。


达梦数据库逻辑备份恢复

逻辑备份(dexp导出)后,使用 dimp 工具将数据恢复到达梦数据库。dimp 是达梦的逻辑导入工具,与 dexp 配套使用,支持将导出的 dmp 文件导入到目标库中。


逻辑导入工具 dimp

1. 基本语法

./dimp USERID=<用户名>/<密码>[@<IP>:<端口>] \
       DIRECTORY=<备份文件所在目录> \
       FILE=<导出的dmp文件名> \
       LOG=<导入日志文件名> \
       [导入级别参数] \
       [其他选项]

2. 主要导入级别参数

参数说明适用场景
FULL=Y导入整个库(全库导入)用于数据迁移、完整恢复
OWNER=<用户名>导入指定用户的所有对象恢复某用户的数据
SCHEMAS=<模式名>导入指定模式的所有对象恢复某模式的数据
TABLES=<表名>导入指定表(可多个,逗号分隔)恢复单表或部分表

3. 常用辅助参数

  • TABLE_EXISTS_ACTION=<动作>:表已存在时的处理方式。可选:

    • SKIP(默认):跳过该表,不导入数据。

    • TRUNCATE:先清空表数据,再导入。

    • APPEND:在现有数据后追加。

    • REPLACE:删除并重建表(危险,会丢失结构)。

  • IGNORE=Y:忽略导入过程中遇到的错误(如对象已存在),继续执行。

  • PARALLEL=<并行数>:并行导入,提高效率(需备份文件支持并行)。

  • COMMIT=Y:每导入一批数据后提交,防止大事务占用回滚段。

  • ROWS=Y(默认)/N:是否导入数据行。


导入前的准备工作

  1. 确认目标库环境:字符集应与导出库一致(否则可能出现乱码或导入失败)。

  2. 创建必要用户/模式:如果导入指定用户或模式,需确保目标库中存在这些用户(且权限足够)。可使用 CREATE USER 和 GRANT 提前创建。

  3. 清理目标对象:根据需求决定是否提前删除已有对象,或使用 TABLE_EXISTS_ACTION 控制冲突行为。

  4. 备份目标库:在生产环境导入前,强烈建议对目标库进行一次物理或逻辑备份,以防误操作。


导入操作示例

场景1:全库导入(FULL)

./dimp SYSDBA/SYSDBA@localhost:5236 \
       DIRECTORY=/dm8/backup \
       FILE=full_db.dmp \
       LOG=full_import.log \
       FULL=Y \
       TABLE_EXISTS_ACTION=REPLACE   # 谨慎使用,会覆盖现有表

场景2:按用户导入(OWNER)

./dimp SYSDBA/SYSDBA@localhost:5236 \
       DIRECTORY=/dm8/backup \
       FILE=owner_user01.dmp \
       LOG=import_user01.log \
       OWNER=USER01 \
       TABLE_EXISTS_ACTION=APPEND

场景3:按模式导入(SCHEMAS)

./dimp SYSDBA/SYSDBA@localhost:5236 \
       DIRECTORY=/dm8/backup \
       FILE=schema_dmhr.dmp \
       LOG=import_dmhr.log \
       SCHEMAS=DMHR \
       IGNORE=Y

场景4:按表导入(TABLES)

./dimp SYSDBA/SYSDBA@localhost:5236 \
       DIRECTORY=/dm8/backup \
       FILE=table_order.dmp \
       LOG=import_order.log \
       TABLES="PROD.ORDER_MAIN,PROD.ORDER_DETAIL" \
       TABLE_EXISTS_ACTION=TRUNCATE

生产环境注意事项

1. 表空间与存储

  • 如果导入的目标库表空间不足,导入可能失败。提前检查表空间使用情况,必要时增加数据文件。

  • 若使用 REPLACE 或创建表,需确保目标用户拥有在指定表空间上创建表的权限。

2. 约束与触发器

  • 导入时,表的约束(主键、外键等)和触发器会在数据导入后重建。如果存在外键依赖,建议先导入主表,再导入子表,或导入完成后手动启用约束。

  • 可添加参数 CONSTRAINTS=Y(默认)或 N 控制是否导入约束。

3. 索引

  • 导入数据后,索引会自动重建,但大量数据导入时,可先删除索引,导入完成后再重建,以加快导入速度(通过 INDEXES=N 实现)。

4. 大对象(LOB)

  • 导出时如果使用了 LOB_AS_FILE 等选项,导入时需要对应处理。一般默认方式下,LOB数据正常导入。

5. 权限

  • 执行导入的用户(如 SYSDBA)需要拥有创建用户、角色的权限,以及导入对象的相应权限。普通用户导入自己的对象时无需特殊权限。

6. 字符集

  • 若导出库与目标库字符集不一致,可能导致中文乱码或数据截断。建议提前使用 SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'; 检查两库字符集,保持一致。

7. 日志分析

  • 导入完成后,务必查看日志文件(LOG=...),确认无错误(Error)或警告(Warning)。若存在失败对象,需单独处理。

8. 并行导入限制

  • 使用 PARALLEL 时,要求导出文件为多文件格式(即 dexp 时使用了 FILESIZE 或 PARALLEL 导出)。否则 dimp 的并行无效。


验证导入结果

导入后,通过 disql 登录目标库,执行以下检查:

-- 检查表行数
SELECT COUNT(*) FROM SCHEMA_NAME.TABLE_NAME;

-- 检查对象是否存在
SELECT OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE OWNER='SCHEMA_NAME';

-- 检查约束状态
SELECT CONSTRAINT_NAME, STATUS FROM ALL_CONSTRAINTS WHERE OWNER='SCHEMA_NAME';

常见报错及处理

报错信息原因解决方案
ORA-00942: table or view does not exist目标库不存在该表或用户使用 IGNORE=Y 跳过,或先创建用户/模式
IMP-00058: ORACLE error 942 encountered导入时依赖的对象不存在检查导入顺序(先导入结构,再导入数据)
IMP-00041: Column data type mismatch表结构不匹配(列类型改变)删除目标表,让导入重新创建
IMP-00017: following statement failed with ORACLE error 1违反唯一约束使用 TABLE_EXISTS_ACTION=TRUNCATE 清空表,或清理重复数据
IMP-00033: Warning: Table "..." already exists, data will be skipped表存在且未指定动作添加 TABLE_EXISTS_ACTION=REPLACE/TRUNCATE/APPEND

达梦数据库表级误删恢复(应急响应场景)

当误删某张表时,利用之前的逻辑备份或从物理备份中提取,是生产环境最高频的操作 

1.初始化临时实例(从物理备份中提取数据)
如果只有物理全量备份,需要在一个临时目录初始化新库用于恢复。

# 初始化一个临时实例(注意端口不能冲突,如 5237)
cd /dm8/bin
./dminit PATH=/dm8/temp_data PORT_NUM=5237

2.将物理备份恢复到临时实例
使用上一步全库恢复的 dmrman 三步操作,将备份集恢复到 /dm8/temp_data 目录。

3.从临时实例导出误删表

# 启动临时实例
./dmserver /dm8/temp_data/DAMENG/dm.ini
# 另开窗口,导出需要恢复的表
./dexp SYSDBA/SYSDBA@localhost:5237 DIRECTORY=/dm8/backup FILE=miss_table.dmp TABLES=SCHEMA_NAME.MISS_TABLE

4.导入生产环境

# 在生产库(5236端口)中导入表
./dimp SYSDBA/SYSDBA@localhost:5236 DIRECTORY=/dm8/backup FILE=miss_table.dmp TABLES=SCHEMA_NAME.MISS_TABLE

导入后请严格验证数据行数是否一致 

生产环境最佳实践建议

  1. 备份集有效性检查:定期使用 dmrman 中的 CHECK BACKUPSET 命令验证备份集是否损坏。

  2. 异地备份:生产环境的备份集务必通过脚本(如 rsyncscp)同步至另一台服务器或对象存储,防止物理硬件损坏。

  3. 关键参数配置

    • COMPRESSED:备份时开启压缩(级别5-6),显著节省磁盘空间 

    • PARALLEL:多核服务器可设置并行度(如4或8),加快备份速度 

  4. 保留周期:建议全量备份保留30天,归档日志保留7-15天(视磁盘空间而定)。

在生产环境操作前,务必先在测试环境验证备份文件和导入流程。


参考:


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6719.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注