本文记录了在达梦数据库(DM8)上完成物理备份还原(全量/增量/归档)和逻辑导入导出(dexp/dimp)的完整实操过程,包括正确的操作流程以及过程中遇到的各种错误与解决方案。
在一台 CentOS 服务器上部署了两个达梦数据库实例:
/data/dmdata/DAMENG//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/,归档模式已开启。
-- 创建测试表并插入数据(用于验证恢复效果)
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';
✅ 正确流程:备份前先确认归档已开启,备份集目录需提前创建并授权。
[-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
还原必须在数据库关闭状态下进行。
关闭数据库(推荐使用正常方式):
./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; 才能正常查询。
增量备份分为差异增量(基于上一次备份)和累积增量(仅基于全备)。增量备份能显著减少备份时间和存储空间。
-- 在全量备份之后插入新数据
SQL> INSERT INTO TEST_BACKUP VALUES (4, 'D'), (5, 'E');
SQL> COMMIT;
-- 执行差异增量备份
SQL> BACKUP DATABASE INCREMENT BACKUPSET '/backup/full/incr_bak_after_insert';
[-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';
./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) 的核心,能在误操作(如误删表)后将数据库恢复到任意指定时刻。
BACKUP ARCHIVELOG ALL BACKUPSET '/backup/arch/arch_bak_all';
[-136]与全量备份相同,需先创建目录:
mkdir -p /backup/arch chown -R dmdba:dinstall /backup/arch chmod 755 /backup/arch
-- 先记录插入 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;
关闭数据库 → 还原全量备份 → 应用归档到指定时间:
./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;
RMAN[-2007]:语法分析出错
RMAN[-8301]:第[1]行,第[4]列[UNTIL]附近出现错误
原因:DMRMAN 不支持将 WITH ARCHIVEDIR 和 UNTIL TIME 拆分成多行。
解决方案:所有参数必须写在同一行:
RECOVER DATABASE '/data/dmdata/DAMENG/dm.ini' WITH ARCHIVEDIR '/data/dmarch/DAMENG' UNTIL TIME '2026-07-27 21:29:59';
启动数据库并查询:
SQL> ALTER DATABASE OPEN FORCE;
SQL> SELECT * FROM TEST_BACKUP;
预期结果:只看到 1~5 条记录(6 和 7 未被恢复),证明成功回退到误操作之前。
逻辑导入导出(dexp/dimp)用于数据迁移、跨库同步和细粒度对象恢复。它不复制物理文件,而是将表、模式等对象以 DMP 格式导出,整个过程数据库联机运行,不影响业务。
逻辑导出(dexp)和导入(dimp)支持四种互斥的操作级别:
| 级别 | 参数 | 适用场景 |
|---|---|---|
| 全库级 | FULL=Y |
迁移整个数据库 |
| 用户级 | OWNER=用户名 |
迁移指定用户的所有对象 |
| 模式级 | SCHEMAS=模式名 |
迁移指定模式的所有对象 |
| 表级 | TABLES=表名 |
迁移指定的一个或多个表 |
mkdir -p /backup/logical chown -R dmdba:dinstall /backup/logical
./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=full_backup.dmp \ LOG=full_export.log \ FULL=Y
./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=schemas_backup.dmp \ LOG=schemas_export.log \ SCHEMAS=DTS_TEST
./dexp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=tables_backup.dmp \ LOG=tables_export.log \ TABLES=SYSDBA.TEST_BACKUP
导出满足条件的数据行(仅导出 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)。
导出多表时提示某个表不存在:
[警告]表 SYSDBA.EMPLOYEE 不存在或者无法导出,请核对后再进行输入
原因:指定的表在数据库中不存在。
解决:先用 SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='SYSDBA'; 确认有效表名。
./dimp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=full_backup.dmp \ LOG=full_import.log \ FULL=Y
运行结果:成功执行,但出现多个“表已存在”警告,因为目标库已有同名对象。
将源模式 DTS_TEST 的所有对象导入到目标模式 NEWSCHEMA:
./dimp USERID=SYSDBA/密码@localhost:5236 \ DIRECTORY=/backup/logical \ FILE=schemas_backup.dmp \ LOG=remap_import2.log \ REMAP_SCHEMA=DTS_TEST:NEWSCHEMA
✅ 结果:
表 NEWSCHEMA.EMP 的数据导入完成,共导入数据:2 行
成功导入, 没有出现警告
第一次尝试 REMAP_SCHEMA=SYSDBA:NEWSCHEMA 时出现:
[警告]模式SYSDBA不存在,请核对后再进行输入
原因:DMP 文件中实际包含的是 DTS_TEST 模式(而非 SYSDBA),REMAP_SCHEMA 的左侧必须与 DMP 文件中的源模式名完全一致。
解决:用 SHOW=Y 或查看导出日志确认实际模式名,更正后重试。
./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 确认实际模式名 |
文章
阅读量
获赞
