注册
达梦数据库物理备份还原与逻辑导入导出
技术分享/ 文章详情 /

达梦数据库物理备份还原与逻辑导入导出

文橘本可 2026/07/31 274 0 0

本文记录了在达梦数据库(DM8)上完成物理备份还原(全量/增量/归档)和逻辑导入导出(dexp/dimp)的完整实操过程,包括正确的操作流程以及过程中遇到的各种错误与解决方案。


前言

在一台 CentOS 服务器上部署了两个达梦数据库实例:

  • GRP1_RT_01:端口 5236,数据目录 /data/dmdata/DAMENG/
  • GRP1_RT_02:端口 5237,数据目录 /data/dmdata/DAMENG02/

备份存储目录为 /backup/(50G 独立分区)。本文所有操作均基于 GRP1_RT_01 实例完成。


第一部分:物理备份还原

物理备份是直接复制数据库数据文件和归档日志的备份方式,是灾难恢复(如磁盘损坏、实例崩溃)的首选手段。达梦支持三种物理备份:全量备份增量备份归档备份

一、准备工作:开启归档模式

联机(热备)物理备份的前提是数据库已开启归档模式。

-- 登录 disql ./disql SYSDBA/密码@localhost:5236 -- 查询归档模式(Y 表示已开启) SQL> SELECT ARCH_MODE FROM V$DATABASE;

如果返回 N,需手动开启:

SQL> ALTER DATABASE MOUNT; SQL> ALTER DATABASE ARCHIVELOG; SQL> ALTER DATABASE OPEN;

环境:归档日志路径为 /data/dmarch/DAMENG/,归档模式已开启。


二、全量备份与还原

2.1 全量备份

-- 创建测试表并插入数据(用于验证恢复效果) SQL> CREATE TABLE TEST_BACKUP (ID INT, NAME VARCHAR(20)); SQL> INSERT INTO TEST_BACKUP VALUES (1, 'A'), (2, 'B'), (3, 'C'); SQL> COMMIT; -- 执行全量联机备份 SQL> BACKUP DATABASE FULL BACKUPSET '/backup/full/full_bak_with_test';

✅ 正确流程:备份前先确认归档已开启,备份集目录需提前创建并授权。

2.2 遇到的错误:[-136] 备份集目录创建失败

执行备份时出现:

[-10002]:[错误码:-136]备份集目录[/backup/full/full_bak_20260727]创建失败.

原因/backup/full/ 目录不存在,或 dmdba 用户无写权限。

解决方案(以 root 执行):

mkdir -p /backup/full chown -R dmdba:dinstall /backup/full chmod 755 /backup/full

2.3 全量还原恢复

还原必须在数据库关闭状态下进行。

关闭数据库(推荐使用正常方式):

./DmServiceGRP1_RT_01 stop # 或通过 disql 执行 SHUTDOWN IMMEDIATE;

使用 DMRMAN 还原

./dmrman RMAN> RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/backup/full/full_bak_with_test'; RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/backup/full/full_bak_with_test'; RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC; RMAN> EXIT;

启动数据库并验证

nohup /home/dmdba/dmdbms/bin/dmserver /data/dmdata/DAMENG/dm.ini & ./disql SYSDBA/密码@localhost:5236 SQL> SELECT * FROM TEST_BACKUP; -- 应看到 3 条记录

⚠️ 踩坑提醒:恢复后数据库处于 MOUNT 状态,需执行 ALTER DATABASE OPEN FORCE; 才能正常查询。


三、增量备份与还原

增量备份分为差异增量(基于上一次备份)和累积增量(仅基于全备)。增量备份能显著减少备份时间和存储空间。

3.1 插入新数据并执行增量备份

-- 在全量备份之后插入新数据 SQL> INSERT INTO TEST_BACKUP VALUES (4, 'D'), (5, 'E'); SQL> COMMIT; -- 执行差异增量备份 SQL> BACKUP DATABASE INCREMENT BACKUPSET '/backup/full/incr_bak_after_insert';

3.2 遇到的错误:[-8036] 无基备份或无匹配基备份

[-8036]:无基备份或无匹配基备份.

原因:增量备份默认在与全量备份相同的父目录下搜索基备份。我将增量备份放在了 /backup/incr/ 而非 /backup/full/,导致系统找不到全量备份。

解决方案(两种方式任选):

  • 方式一:将增量备份放在与全量备份相同的目录下:
    BACKUP DATABASE INCREMENT BACKUPSET '/backup/full/incr_bak_after_insert';
  • 方式二:使用 WITH BACKUPDIR 显式指定基备份路径:
    BACKUP DATABASE INCREMENT WITH BACKUPDIR '/backup/full' BACKUPSET '/backup/incr/incr_bak_after_insert';

3.3 增量还原恢复

./dmrman RMAN> RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/backup/full/incr_bak_after_insert'; RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/backup/full/incr_bak_after_insert'; RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC; RMAN> EXIT;

💡 关键点:还原时直接指定最后一个增量备份集即可,DMRMAN 会自动追溯全量备份并链式恢复。但全量备份和所有中间增量备份必须完整保留。


四、归档备份与时间点恢复

归档备份是时间点恢复(PITR) 的核心,能在误操作(如误删表)后将数据库恢复到任意指定时刻。

4.1 归档备份

BACKUP ARCHIVELOG ALL BACKUPSET '/backup/arch/arch_bak_all';

4.2 遇到的错误:同样遇到 [-136]

与全量备份相同,需先创建目录:

mkdir -p /backup/arch chown -R dmdba:dinstall /backup/arch chmod 755 /backup/arch

4.3 模拟误操作:删除表

-- 先记录插入 6,7 之前的时间(假设为 '2026-07-27 21:29:59') SQL> SELECT SYSDATE; -- 插入新数据 SQL> INSERT INTO TEST_BACKUP VALUES (6, 'F'), (7, 'G'); SQL> COMMIT; -- 模拟误删除表 SQL> DROP TABLE TEST_BACKUP;

4.4 利用归档恢复到指定时间点

关闭数据库还原全量备份应用归档到指定时间

./dmrman RMAN> RESTORE DATABASE '/data/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/backup/full/full_bak_with_test'; RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/data/dmarch/DAMENG' UNTIL TIME '2026-07-27 21:29:59'; RMAN> RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC; RMAN> EXIT;

QQ20260727151337.png

4.5 遇到的错误:DMRMAN 命令语法错误

RMAN[-2007]:语法分析出错
RMAN[-8301]:第[1]行,第[4]列[UNTIL]附近出现错误

原因:DMRMAN 不支持将 WITH ARCHIVEDIRUNTIL TIME 拆分成多行。

解决方案所有参数必须写在同一行

RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/data/dmarch/DAMENG' UNTIL TIME '2026-07-27 21:29:59';

4.6 验证恢复结果

启动数据库并查询:

SQL> ALTER DATABASE OPEN FORCE; SQL> SELECT * FROM TEST_BACKUP;

预期结果:只看到 1~5 条记录(6 和 7 未被恢复),证明成功回退到误操作之前。


第二部分:逻辑导入导出

逻辑导入导出(dexp/dimp)用于数据迁移、跨库同步和细粒度对象恢复。它不复制物理文件,而是将表、模式等对象以 DMP 格式导出,整个过程数据库联机运行,不影响业务。

一、核心概念

逻辑导出(dexp)和导入(dimp)支持四种互斥的操作级别:

级别 参数 适用场景
全库级 FULL=Y 迁移整个数据库
用户级 OWNER=用户名 迁移指定用户的所有对象
模式级 SCHEMAS=模式名 迁移指定模式的所有对象
表级 TABLES=表名 迁移指定的一个或多个表

二、逻辑导出(dexp)

2.1 准备工作:创建导出目录

mkdir -p /backup/logical chown -R dmdba:dinstall /backup/logical

2.2 全库导出(FULL)

./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=full_backup.dmp \ LOG=full_export.log \ FULL=Y

2.3 模式导出(SCHEMAS)

./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=schemas_backup.dmp \ LOG=schemas_export.log \ SCHEMAS=DTS_TEST

2.4 表级导出(TABLES)

./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=tables_backup.dmp \ LOG=tables_export.log \ TABLES=SYSDBA.TEST_BACKUP

2.5 条件导出(QUERY)

导出满足条件的数据行(仅导出 ID > 3 的记录):

./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=filtered_data.dmp \ LOG=filtered.log \ TABLES=SYSDBA.TEST_BACKUP \ QUERY="WHERE ID > 3"

✅ 结果:成功导出 2 行数据(ID=4,5)。

2.6 遇到的错误:表不存在

导出多表时提示某个表不存在:

[警告]表 SYSDBA.EMPLOYEE 不存在或者无法导出,请核对后再进行输入

原因:指定的表在数据库中不存在。

解决:先用 SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='SYSDBA'; 确认有效表名。


三、逻辑导入(dimp)

3.1 全库导入(FULL)

./dimp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=full_backup.dmp \ LOG=full_import.log \ FULL=Y

运行结果:成功执行,但出现多个“表已存在”警告,因为目标库已有同名对象。

3.2 模式映射导入(REMAP_SCHEMA)⭐核心技能

将源模式 DTS_TEST 的所有对象导入到目标模式 NEWSCHEMA

./dimp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=schemas_backup.dmp \ LOG=remap_import2.log \ REMAP_SCHEMA=DTS_TEST:NEWSCHEMA

QQ20260727155337.png
✅ 结果

表 NEWSCHEMA.EMP 的数据导入完成,共导入数据:2 行
成功导入, 没有出现警告

3.3 遇到的错误:源模式名错误

第一次尝试 REMAP_SCHEMA=SYSDBA:NEWSCHEMA 时出现:

[警告]模式SYSDBA不存在,请核对后再进行输入

原因:DMP 文件中实际包含的是 DTS_TEST 模式(而非 SYSDBA),REMAP_SCHEMA左侧必须与 DMP 文件中的源模式名完全一致

解决:用 SHOW=Y 或查看导出日志确认实际模式名,更正后重试。

3.4 表级导入与“表已存在”处理

./dimp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=tables_backup.dmp \ LOG=tables_import.log \ TABLES=SYSDBA.TEST_BACKUP

返回:

[警告]表已存在,表 SYSDBA.TEST_BACKUP 导入失败...

原因:导入时若目标表已存在,默认会跳过(不覆盖)。

解决方案

  • 方式一:先手动删除目标表,再执行导入
  • 方式二:增加 TABLE_EXISTS_ACTION=REPLACE 参数覆盖导入

总结

物理备份还原核心要点

备份类型 核心命令 关键注意事项
全量备份 BACKUP DATABASE FULL 必须开启归档;备份目录需提前创建授权
增量备份 BACKUP DATABASE INCREMENT 必须与全量备份在同一父目录,或指定 WITH BACKUPDIR
归档备份 BACKUP ARCHIVELOG ALL 恢复时配合 UNTIL TIME 实现时间点回退
还原恢复 RESTORE + RECOVER + UPDATE DB_MAGIC 数据库必须关闭;DMRMAN 命令必须写在同一行

逻辑导入导出核心要点

操作 命令 关键注意事项
导出 dexp 四种级别互斥;QUERY 可过滤行级数据
导入 dimp REMAP_SCHEMA 实现跨模移;TABLE_EXISTS_ACTION 控制覆盖策略
常见错误 文件不存在 / 源模式名错误 ls 确认文件名,用 SHOW=Y 查看 DMP 内容

遇到的典型问题速查

错误码/现象 原因 解决方案
[-136] 备份集目录创建失败 目录不存在或无权限 mkdir + chown + chmod
[-8036] 无基备份 增量备份找不到全量备份 统一备份目录或用 WITH BACKUPDIR
[-2007] 语法分析出错 DMRMAN 命令拆分多行 所有参数写在同一行
系统处于MOUNT状态 恢复后未切换状态 ALTER DATABASE OPEN FORCE;
模式XX不存在 REMAP_SCHEMA 左侧与 DMP 文件内容不一致 SHOW=Y 确认实际模式名
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服