达梦数据库备份还原可以分成两条主线:
| 类型 | 最适合解决什么问题 |
|---|---|
| 物理备份 | 数据文件损坏、整库故障、介质故障、需要恢复到某个时间点 |
| 逻辑备份 | 单表恢复、模式迁移、跨库迁移、升级前对象留底、开发测试环境刷新 |
| 对比项 | 物理备份 | 逻辑备份 |
|---|---|---|
| 关注点 | 数据文件、有效数据页、归档日志 | 表、模式、用户、数据行、对象定义 |
| 常用工具 | SQL 、DMRMAN、CONSOLE、MANAGER | dexp、dimp、dexpdp、dimpdp |
| 备份结果 | 备份集目录,含 .bak 和 .meta |
.dmp 文件和 .log 日志 |
| 恢复粒度 | 库、表空间、数据文件、表备份集 | FULL、OWNER、SCHEMAS、TABLES |
| 速度 | 大库灾备通常更快 | 对象多、索引多时可能较慢 |
| 迁移能力 | 受版本、路径、初始化参数影响更明显 | 更适合跨环境、跨用户、部分对象迁移 |
| 灾难恢复 | 强 | 弱 |
| 对象级恢复 | 相对笨重 | 强 |
整库灾难找物理;
对象迁移找逻辑;
误删单表用临时库恢复备份集,再逻辑抽取;
升级变更前,物理兜底 + 逻辑留样。
| 动作 | 做了什么 | 达梦场景 |
|---|---|---|
| 备份 | 把数据页、归档或对象导出成文件 | backup database、dexp |
| 还原 | 把物理备份集的数据页写回目标数据文件 | restore database |
| 恢复 | 重做归档日志,让数据库达到一致状态或指定时间点 | recover database |
注意:物理恢复中,
restore不是终点。通常还需要recover database,并在恢复完成后执行update db_magic。
物理备份不是导出 SQL,也不是逐表扫描数据。它的核心动作是:
备份集一般包含:
| 文件 | 作用 |
|---|---|
.bak |
保存数据页或日志内容 |
.meta |
保存备份集元数据,如备份范围、数据文件、源库信息、备份片信息 |
联机备份时数据库仍然在运行,业务事务可能持续修改数据。此时备份读到的数据页可能并不处于同一个时间点:
备份开始 ────── 业务继续写入 ────── 备份结束
│ │ │
└─ 读到一部分旧页 └─ 产生 REDO 日志 └─ 需要日志保证一致性
所以物理联机备份必须依赖归档日志来保证恢复能力。没有连续归档,就无法可靠恢复到故障前的精确状态。
| 类型 | 是否常用 | 说明 |
|---|---|---|
| 联机库备份 | 常用 | 数据库 OPEN 状态执行,生产主力备份方式 |
| 脱机库备份 | 常用 | 停库后用 DMRMAN 执行,适合维护窗口 |
| 表空间备份 | 进阶 | 局部物理保护,恢复时依赖归档 |
| 表级物理备份 | 进阶 | 一次备份一张用户表,不支持增量 |
| 归档备份 | 常用 | 只备份归档日志,配合数据备份形成恢复链 |
| 完全备份 | 必备 | 增量链的基础 |
| 差异增量 | 常用 | 基于上一次全备或增量 |
| 累积增量 | 常用 | 只基于全备,恢复链更短 |
| 类型 | 优点 | 缺点 |
|---|---|---|
| 差异增量 | 每次备份较小 | 恢复链可能较长 |
| 累积增量 | 恢复链短 | 越靠后备份越大 |
物理备份常用 SQL 语法如下:
| 操作 | 语法示例 | 说明 |
|---|---|---|
| 库级全备 | backup database full backupset '/opt/dmbak/full/db_full_01'; |
备份整个数据库 |
| 库级增量 | backup database increment with backupdir '/opt/dmbak/full' backupset '/opt/dmbak/inc/db_inc_01'; |
基于已有备份集做增量 |
| 累积增量 | backup database increment cumulative with backupdir '/opt/dmbak/full' backupset '/opt/dmbak/inc/db_cum_01'; |
基于全备做累积增量 |
| 表空间备份 | backup tablespace ts_bak full backupset '/opt/dmbak/full/ts_bak_01'; |
备份指定表空间 |
| 表级物理备份 | backup table bakuser.t_order backupset '/opt/dmbak/full/t_order_bak_01'; |
一次备份一张用户表 |
常用参数说明:
| 参数 | 作用 |
|---|---|
FULL |
完全备份 |
INCREMENT |
增量备份 |
CUMULATIVE |
累积增量备份 |
WITH BACKUPDIR |
指定基备份集搜索目录 |
BACKUPSET |
指定备份集目录 |
BACKUPINFO |
写入备份描述 |
MAXPIECESIZE |
限制单个备份片大小 |
COMPRESSED LEVEL |
设置压缩等级 |
PARALLEL |
并行备份 |
WITHOUT LOG |
不备份日志,生成非一致性备份,恢复时更依赖归档 |
DMRMAN 常用语法:
| 操作 | 语法示例 |
|---|---|
| 校验备份集 | check backupset '/opt/dmbak/full/db_full_01'; |
| 查看备份集 | show backupset '/opt/dmbak/full/db_full_01'; |
| 还原数据库 | restore database '/opt/dmdbms/data/DAMENG/dm.ini' from backupset '/opt/dmbak/full/db_full_01'; |
| 恢复–从备份集 | recover database '/opt/dmdbms/data/DAMENG/dm.ini' from backupset '/opt/dmbak/full/db_full_01'; |
| 恢复–从归档 | recover database '/opt/dmdbms/data/DAMENG/dm.ini' with archivedir '/opt/dmdbms/arch'; |
| 恢复–指定时间点 | recover database '/opt/dmdbms/data/DAMENG/dm.ini' with archivedir '/opt/dmdbms/arch' until time '2026-05-15 10:30:00'; |
| 更新 DB_MAGIC | recover database '/opt/dmdbms/data/DAMENG/dm.ini' update db_magic; |
逻辑备份读取数据库对象和数据内容,写入 .dmp 文件:
逻辑导出可以包含:
| 级别 | 参数 | 典型场景 |
|---|---|---|
| 数据库级 | FULL=Y |
整库逻辑备份、升级前全量留底 |
| 用户级 | OWNER=USER1 |
按业务用户迁移 |
| 模式级 | SCHEMAS=SCH1 |
按模式迁移或恢复 |
| 表级 | TABLES=SCH1.T1 |
单表恢复、关键表快照 |
物理备份强在“救库”
逻辑备份强在“挑对象”
逻辑备份的优势:
QUERY 过滤部分数据。REMAP_SCHEMA 跨用户导入。REMAP_TABLESPACE 调整目标表空间。SHOW=Y 先查看导出文件内容,不实际导入。逻辑备份的限制:
dexp 用于逻辑导出,dimp 用于逻辑导入。逻辑备份还原面向的是数据库对象和数据内容,例如表、模式、用户、视图、索引、约束、权限、触发器、存储过程等。
dexp 逻辑导出基础语法:
./dexp USERID=用户名/密码@IP:端口 FILE=导出文件 LOG=日志文件 DIRECTORY=导出目录 导出级别
示例:
./dexp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=dm_full_20260515.dmp \
LOG=dm_full_20260515.log \
DIRECTORY=/opt/dmexp/full \
FULL=Y
dimp 逻辑导入基础语法:
./dimp USERID=用户名/密码@IP:端口 FILE=导入文件 LOG=日志文件 DIRECTORY=日志目录 导入级别
示例:
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/full/dm_full_20260515.dmp \
LOG=dm_full_20260515_imp.log \
DIRECTORY=/opt/dmexp/log \
FULL=Y
常见导入导出级别:
| 级别 | 参数示例 | 说明 |
|---|---|---|
| 整库级 | FULL=Y |
导入或导出整个数据库对象 |
| 用户级 | OWNER=BAKUSER |
导入或导出指定用户拥有的对象 |
| 模式级 | SCHEMAS=BAKUSER |
导入或导出指定模式下的对象 |
| 表级 | TABLES=BAKUSER.T_ORDER |
导入或导出指定表 |
常用参数:
| 参数 | 作用 | 备注 |
|---|---|---|
USERID |
数据库连接信息 | 必填,Linux 下密码含特殊字符时要注意引号 |
FILE |
指定 .dmp 文件 |
导出时为生成文件,导入时为读取文件 |
LOG |
指定日志文件 | 建议每次导入导出都保留日志 |
DIRECTORY |
指定文件或日志目录 | dexp 中表示导出目录,dimp 中常用于日志目录 |
FULL |
整库级导入导出 | FULL=Y 表示整库 |
OWNER |
用户级导入导出 | 适合按业务用户迁移 |
SCHEMAS |
模式级导入导出 | 适合按模式迁移或恢复 |
TABLES |
表级导入导出 | 适合单表备份、恢复、迁移 |
QUERY |
条件导出 | Linux 下建议写成 QUERY='WHERE ID <= 10000' |
SHOW=Y |
只查看导入文件内容 | 不真正执行导入,适合导入前确认对象 |
REMAP_SCHEMA |
模式映射 | 例如 REMAP_SCHEMA=BAKUSER:BAKUSER_TEST |
REMAP_TABLESPACE |
表空间映射 | 目标表空间需提前规划 |
TABLE_EXISTS_ACTION |
目标表已存在时的处理策略 | 常用 SKIP、APPEND、TRUNCATE、REPLACE |
PARALLEL |
导入导出线程数 | 大数据量场景可适当调整 |
TABLE_PARALLEL |
单表并行度 | 大表导入导出时更常用 |
ROWS=N |
只导对象定义,不导数据 | 适合只迁移结构 |
INDEXES=N |
不处理索引 | 大数据导入后可再重建索引 |
CONSTRAINTS=N |
控制约束处理 | 主键和非空约束需特别注意 |
GRANTS=N |
不处理授权 | 适合目标库权限重新规划的场景 |
ENCRYPT=Y |
导出文件加密 | 需保存好加密密码 |
COMPRESS=Y |
导出文件压缩 | 可减少文件体积 |
TABLE_EXISTS_ACTION 常用取值:
| 取值 | 行为 | 适合场景 | 风险 |
|---|---|---|---|
SKIP |
表存在则跳过 | 只导入目标库不存在的表 | 已有表不会刷新 |
APPEND |
向已有表追加数据 | 补充新数据 | 主键或唯一键重复会报错 |
TRUNCATE |
先清空表数据,再导入 | 表结构正确,只刷新数据 | 会删除目标表现有数据 |
REPLACE |
先删除表,再按导出文件重建并导入 | 表结构也要恢复 | 可能影响依赖对象、授权和触发器 |
TRUNCATE_CASCADE |
级联清空依赖表数据,再导入 | 存在外键依赖且确认可清理 | 风险最高,生产慎用 |
建议:
FULL=Y更适合导入空库;如果导入到已有库,建议先使用SHOW=Y查看导出文件内容,再根据对象重复情况选择TABLE_EXISTS_ACTION。
| 项目 | 示例 |
|---|---|
| 虚拟化平台 | VMware Workstation / ESXi |
| 操作系统 | 银河麒麟高级服务器操作系统 V10 |
| 数据库 | DM8 |
| 数据库用户 | dmdba |
| 实例名 | DMSERVER |
| 数据库名 | DAMENG |
| 端口 | 5236 |
| 目录 | 用途 | 生产建议 |
|---|---|---|
/opt/dmdbms |
数据库软件目录 | 已安装目录 |
/opt/dmdbms/data |
数据文件根目录 | 当前实例目录为 /opt/dmdbms/data/DAMENG |
/opt/dmdbms/arch |
归档目录 | 你当前环境已有该目录 |
/opt/dmbak |
物理备份目录 | 你已在 /opt 下创建 |
/opt/dmexp |
逻辑导出目录 | 你已在 /opt 下创建 |
mkdir -p /opt/dmbak/full /opt/dmbak/inc /opt/dmbak/arch /opt/dmexp/full /opt/dmexp/schema /opt/dmexp/table /opt/dmexp/log
chown -R dmdba:dinstall /opt/dmdbms /opt/dmbak /opt/dmexp
chmod -R 775 /opt/dmdbms/arch /opt/dmbak /opt/dmexp
生产提醒:如果数据、归档、备份都在同一块虚拟磁盘上,这只能防误操作,不能防磁盘故障。真正的备份必须离开原故障域。
命令提醒:组名是
dinstall,不是didstall;chown的用户组和路径之间要有空格,例如chown -R dmdba:dinstall /opt/dmbak /opt/dmexp。
su - dmdba
cd /opt/dmdbms/bin
./disql SYSDBA/"Dameng@1234"@localhost:5236
alter database mount;
alter database archivelog;
alter database add archivelog '
TYPE=LOCAL,
DEST=/opt/dmdbms/arch,
FILE_SIZE=1024,
SPACE_LIMIT=51200
';
alter database open;
检查:
select arch_mode from v$database;
select arch_type, arch_dest, arch_file_size, arch_space_limit from v$dm_arch_ini;
create tablespace ts_bak datafile '/opt/dmdbms/data/DAMENG/ts_bak01.dbf' size 128;
create user bakuser identified by "Dameng@1234" default tablespace ts_bak;
grant resource, public to bakuser;
conn bakuser/"Dameng@1234"@localhost:5236;
create table t_order (
id int primary key,
order_no varchar(40),
amount decimal(10,2),
create_time datetime default sysdate
);
insert into t_order(id, order_no, amount) values(1, 'DM202605150001', 100.00);
insert into t_order(id, order_no, amount) values(2, 'DM202605150002', 200.00);
commit;
backup database full
backupset '/opt/dmbak/full/db_full_20260515_01'
backupinfo 'full backup before business change';
校验备份集:
cd /opt/dmdbms/bin
./dmrman
RMAN> check backupset '/opt/dmbak/full/db_full_20260515_01';
RMAN> show backupset '/opt/dmbak/full/db_full_20260515_01';
conn bakuser/"Dameng@1234"@localhost:5236;
insert into t_order(id, order_no, amount) values(3, 'DM202605150003', 300.00);
insert into t_order(id, order_no, amount) values(4, 'DM202605150004', 400.00);
commit;
差异增量:
conn SYSDBA/"Dameng@1234"@localhost:5236;
backup database increment
with backupdir '/opt/dmbak/full'
backupset '/opt/dmbak/inc/db_inc_20260515_01'
backupinfo 'increment backup after full backup';
累积增量:
backup database increment cumulative
with backupdir '/opt/dmbak/full'
backupset '/opt/dmbak/inc/db_cum_20260515_01';
表空间备份:
backup tablespace ts_bak full
backupset '/opt/dmbak/full/ts_bak_full_01';
表级物理备份:
backup table bakuser.t_order
backupset '/opt/dmbak/full/t_order_bak_01';
停库:
su - root systemctl stop DmServiceDMSERVER
进入 DMRMAN:
su - dmdba
cd /opt/dmdbms/bin
./dmrman
第一步,校验并还原备份集:
RMAN> check backupset '/opt/dmbak/full/db_full_20260515_01';
RMAN> restore database '/opt/dmdbms/data/DAMENG/dm.ini' from backupset '/opt/dmbak/full/db_full_20260515_01';
第二步,还原完成后,根据恢复目标选择下面三种方式之一,执行恢复相关操作。
注意执行过 recover ... update db_magic 后,恢复流程已经结束。
如果要换另一种恢复方式,需要重新执行 restore database ... from backupset ...。
方式一:恢复到备份集结束状态:
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' from backupset '/opt/dmbak/full/db_full_20260515_01';
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' update db_magic;
方式二:利用归档恢复到最新状态:
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' with archivedir '/opt/dmdbms/arch';
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' update db_magic;
方式三:利用归档恢复到指定时间点:
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' with archivedir '/opt/dmdbms/arch' until time '2026-05-15 10:30:00';
RMAN> recover database '/opt/dmdbms/data/DAMENG/dm.ini' update db_magic;
| 检查项 | 为什么重要 |
|---|---|
| 备份集是否完整 | .bak 和 .meta 缺一不可 |
| 归档是否连续 | 时间点恢复依赖连续归档 |
dm.ini 路径是否正确 |
DMRMAN 根据它定位目标库 |
是否执行 recover |
只还原不恢复,数据库可能不一致 |
是否更新 DB_MAGIC |
避免恢复库与原库归档链混淆 |
导出:
cd /opt/dmdbms/bin
./dexp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=dm_full_20260515.dmp \
LOG=dm_full_20260515.log \
DIRECTORY=/opt/dmexp/full \
FULL=Y
导入:
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/full/dm_full_20260515.dmp \
LOG=dm_full_20260515_imp.log \
DIRECTORY=/opt/dmexp/log \
FULL=Y
先看内容,不导入:
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/full/dm_full_20260515.dmp \
SHOW=Y \
FULL=Y
用户级:
./dexp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=bakuser_owner_20260515.dmp \
LOG=bakuser_owner_20260515.log \
DIRECTORY=/opt/dmexp/schema \
OWNER=BAKUSER
模式级:
./dexp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=bakuser_schema_20260515.dmp \
LOG=bakuser_schema_20260515.log \
DIRECTORY=/opt/dmexp/schema \
SCHEMAS=BAKUSER
跨用户导入:
模式映射导入:
有时我们并不希望把逻辑备份导回原模式,而是希望导入到一个新的测试模式中。例如,源库中对象属于 BAKUSER,现在希望导入到 BAKUSER_TEST,用于恢复验证或数据比对。
这种场景使用 dimp 的 REMAP_SCHEMA 参数。它的本质是模式转换,即把导出文件中的源模式对象映射到目标模式下,而不是简单理解为“跨用户导入”。
语法格式:
REMAP_SCHEMA=源模式:目标模式
它表示:导入时将导出文件中 BAKUSER 模式下的对象映射到 BAKUSER_TEST 模式下。
导入前先创建目标用户/模式:
create user bakuser_test identified by "Dameng@1234" default tablespace ts_bak;
grant resource, public to bakuser_test;
执行导入:
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/schema/bakuser_schema_20260515.dmp \
LOG=bakuser_schema_remap.log \
DIRECTORY=/opt/dmexp/log \
SCHEMAS=BAKUSER \
REMAP_SCHEMA=BAKUSER:BAKUSER_TEST
这种做法的好处是不会直接覆盖原 BAKUSER 模式,可以先在 BAKUSER_TEST 中检查数据是否正确,再决定是否回迁到生产模式。
导出单表:
./dexp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=t_order_20260515.dmp \
LOG=t_order_20260515.log \
DIRECTORY=/opt/dmexp/table \
TABLES=BAKUSER.T_ORDER
按条件导出:
./dexp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=t_order_part_20260515.dmp \
LOG=t_order_part_20260515.log \
DIRECTORY=/opt/dmexp/table \
TABLES=BAKUSER.T_ORDER \
QUERY='WHERE ID <= 10000'

导入单表:
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/table/t_order_20260515.dmp \
LOG=t_order_imp_20260515.log \
DIRECTORY=/opt/dmexp/log \
TABLES=BAKUSER.T_ORDER
| 参数 | 行为 | 适合场景 | 风险 |
|---|---|---|---|
SKIP |
表存在则跳过 | 只导不存在的表 | 已有表不会刷新 |
APPEND |
追加数据 | 补充新数据 | 主键/唯一键重复会报错 |
TRUNCATE |
清空原表数据再导入 | 表结构正确,只刷新数据 | 会删除目标表现有数据 |
REPLACE |
删除原表并按导出文件重建 | 表结构也要恢复 | 影响依赖对象和授权 |
TRUNCATE_CASCADE |
级联清空依赖表数据再导入 | 有外键依赖且确认可清理 | 风险最高 |
示例:
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/table/t_order_20260515.dmp \
LOG=t_order_append.log \
DIRECTORY=/opt/dmexp/log \
TABLES=BAKUSER.T_ORDER \
TABLE_EXISTS_ACTION=APPEND
这种情况下导入不会覆盖原数据,重复主键的行会失败;如果实验环境想重新灌入这张表,可改用 TABLE_EXISTS_ACTION=TRUNCATE。
./dimp USERID=SYSDBA/'"Dameng@1234"'@127.0.0.1:5236 \
FILE=/opt/dmexp/table/t_order_20260515.dmp \
LOG=t_order_truncate.log \
DIRECTORY=/opt/dmexp/log \
TABLES=BAKUSER.T_ORDER \
TABLE_EXISTS_ACTION=TRUNCATE
| 参数 | 作用 |
|---|---|
PARALLEL |
导出或导入线程数 |
TABLE_PARALLEL |
单表导出或导入线程数 |
ROWS=N |
只导对象定义,不导数据 |
INDEXES=N |
不处理索引 |
CONSTRAINTS=N |
控制约束处理 |
GRANTS=N |
不处理授权 |
TRIGGERS=N |
不处理触发器 |
EXCLUDE |
排除指定对象类型 |
INCLUDE |
只处理指定对象类型 |
REMAP_SCHEMA |
源模式映射到目标模式 |
REMAP_TABLESPACE |
源表空间映射到目标表空间 |
ENCRYPT=Y |
导出文件加密 |
COMPRESS=Y |
导出文件压缩 |
SHOW=Y |
查看导入文件内容,不执行导入 |
check backupsetSHOW=Y 查看导出文件内容TABLE_EXISTS_ACTION 策略| 场景 | 推荐方案 |
|---|---|
| 磁盘损坏、数据文件丢失 | 物理全备 + 增量 + 归档恢复 |
| 整库回退到误操作前 | 物理备份 + 指定时间点恢复 |
| 误删单表 | 临时库物理恢复后逻辑抽取,或使用表级逻辑备份 |
| 迁移某个业务用户 | dexp OWNER / dimp OWNER |
| 迁移某个模式 | dexp SCHEMAS / dimp SCHEMAS |
| 迁移几张表 | dexp TABLES / dimp TABLES |
| 版本升级前兜底 | 物理全备 + 关键模式逻辑导出 |
| 开发环境刷新 | 逻辑导入或物理克隆,按数据量选择 |
| 大库常规灾备 | 周全备 + 日增量 + 连续归档 + 异地复制 |
| 结论 | 说明 |
|---|---|
| 物理备份是灾难恢复底座 | 没有物理备份,介质故障时很难可靠恢复 |
| 逻辑备份是对象级恢复利器 | 单表、模式、跨库迁移更灵活 |
| 归档连续性决定恢复上限 | 归档断链会直接影响时间点恢复 |
| 备份成功不等于可恢复 | 必须校验、演练、异地保存 |
| DBA 要优先恢复到临时库 | 降低生产二次破坏风险 |
文章
阅读量
获赞
