数据库的物理备份还原是保障数据安全与业务连续性的核心手段。达梦数据库作为国产数据库的领军产品,其物理备份还原机制基于数据页与日志序列号(LSN)的底层设计,提供了完全备份、增量备份、归档备份及基于时间点恢复(PITR)等丰富的容灾能力。
本文旨在系统学习达梦物理备份还原的原理机制,并通过实际操作环境(CentOS 7 + DM8)完成各类备份与恢复的完整演练,深入理解备份、还原、恢复三个环节的区别与联系,掌握联机/脱机备份、增量链式恢复、归档日志重做等关键技术,为生产环境的备份策略制定和故障应急处置提供可靠参考。
达梦数据库中,备份、还原、恢复是三个不同但紧密关联的概念:
| 概念 | 定义 | 关键特征 |
|---|---|---|
| 备份 | 对数据库有效数据、归档日志做完整拷贝,生成备份集 | 用于故障后恢复 |
| 还原 | 将备份集内的数据页覆盖写入目标库数据文件 | 还原后数据库处于非一致性状态,无法直接启动 |
| 恢复 | 重做 REDO 归档日志,将数据库推进到一致状态 | 恢复完成更新 DB_MAGIC 后才能正常启动 |
还原是备份的逆过程。还原是将备份集中的有效数据页重新写入目标数据文件的过程;恢复则是通过重做归档日志,将数据库状态恢复到备份结束时的状态,也可以恢复到指定时间点和指定 LSN。物理恢复中,RESTORE 不是终点,通常还需要 RECOVER DATABASE,并在恢复完成后执行 UPDATE DB_MAGIC。
达梦数据库物理备份的本质是从数据库文件中拷贝有效的数据页保存到备份集中。这里的有效数据页包括数据文件的描述页和被分配使用的数据页。物理备份是找出那些已经分配、使用的数据页,拷贝并保存到备份集中。物理备份是根据数据库文件系统的描述来选择有效数据页进行备份,并不关心数据页中的内容是什么。
页是数据存储的基本单元,任何对 DM 数据库的操作,其根本是对某个数据文件页的操作。
LSN(日志序列号,LOG SEQUENCE NUMBER)是备份恢复的核心标识,全局单调递增唯一编号,数据库每一次事务操作都对应一个唯一的 LSN 值。
| LSN 类型 | 含义 |
|---|---|
| CUR_LSN | 最新事务提交产生的日志序列号 |
| FILE_LSN | 已写入联机 REDO 日志的最大 LSN |
| FLUSH_LSN | 发起刷盘但未落地的日志 LSN |
| CKPT_LSN | 检查点 LSN,≤该 LSN 的数据页已落盘磁盘 |
备份日志区间规则:BEGIN_LSN = CKPT_LSN(作为日志备份的起点),END_LSN = 数据备份结束时的 FILE_LSN(作为日志备份的终点)。
检查点(Checkpoint)的功能是按照数据页第一次被修改的顺序,依次将 BUFFER 缓冲区中的脏页写入磁盘,并在这个过程中动态调整 CKPT_LSN 值,释放日志空间。全量备份开始时会触发一次检查点,刷新 CKPT_LSN 后,把下一个 LSN 作为日志恢复起点。数据库正常关闭时会产生完全检查点,将所有脏页写入磁盘。
完全备份:包含指定数据库或表空间的所有有效数据页,拷贝 CKPT_LSN 之前所有数据页及区间内 REDO 日志。备份开始时记录 BEGIN_LSN(基于检查点 LSN),锁定表空间以冻结数据文件头信息,拷贝数据文件的有效数据页,同时记录备份期间产生的重做日志。
增量备份:仅拷贝上一次基备份后发生变更的数据页。增量备份存在"链式依赖"原理,恢复时需要依赖完整的备份链。增量备份又分为:
在数据库运行的情况下,对数据库的操作不会立即体现到数据文件中,而是会先以日志形式写入归档日志。因此,联机备份需要将备份过程中产生的归档日志也保存到备份集中,便于之后通过备份集中的归档日志进行恢复。联机备份必须开启归档模式。
全库备份和归档日志备份既可以在联机状态(数据库运行状态)下进行,也可以在脱机状态(数据库关闭状态)下进行。库备份和表空间备份不支持联机还原,只有表备份支持联机还原。
| 项目 | 配置 |
|---|---|
| 操作系统 | CentOS Linux 7 x86_64 |
| CPU | x86_64 |
| 内存 | 4GB |
| 磁盘 | 40GB |
| 处理器 | 2*2 |
| 数据库版本 | DM8 V8(dm8_20260710_x86_CentOS7_64.zip) |
所有联机物理备份操作必须先开启归档模式:
vi /dmdata/data/DAMENG/dm.ini ARCH_INI=1
cat >> /dmdata/data/DAMENG/dmarch.ini << 'EOF'
ARCH_WAIT_APPLY=0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch #本地归档存放路径
ARCH_FILE_SIZE = 2048 #单个归档大小,单位MB
ARCH_SPACE_LIMIT = 102400 #归档上限,单位MB
EOF
修改数据库为 OPEN 状态:
./disql 'SYSDBA/"Dameng_123"'@localhost:5236
ALTER DATABASE OPEN FORCE;
查看归档状态:
SELECT ARCH_MODE FROM SYS.V$DATABASE;
SELECT * FROM SYS.V$DM_ARCH_INI;
-- 基本语法
BACKUP DATABASE FULL BACKUPSET '/dmdata/dmbak/db_full_bak_20260824';
-- 带备份名的方式
BACKUP DATABASE FULL TO db_full_bak BACKUP SET '/dmdata/dmbak/db_full_bak_20260824';
完全备份包含数据库的所有有效数据页。在完全备份中,可指定 DDL_CLONE(数据库克隆)参数,只备份定义不备份数据,该参数只用于数据库级完全备份中。
# 1. 关闭数据库
./DmServiceDMSERVER stop
# 2. 启动DMRMAN
./dmrman
# 3. 执行备份
RMAN> BACKUP DATABASE '/dmdata/data/DAMENG/dm.ini' FULL BACKUPSET '/dmdata/dmbak/db_full_bak_2026082411';
增量备份基于完全备份(基备份)进行:
-- 基于全量备份进行增量备份(需指定基备份目录)
BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmdata/dmbak/db_full_bak_20260824' BACKUPSET '/dmdata/dmbak/db_increment_bak_01';

-- 累积增量备份(基备份只能是全量备份集)
BACKUP DATABASE INCREMENT CUMULATIVE WITH BACKUPDIR '/dmdata/dmbak/db_full_bak_20260824' BACKUPSET '/dmdata/dmbak/db_cumulative_bak_01';
增量备份仅备份自上次备份后修改的数据块。如果是增量备份,则需选择上一次备份集为基备份。备份集搜索目录用于增量备份还原中搜索基备份。
注意:增量备份的目录建议和全量备份放在同一个目录下,恢复时只需要恢复最后一个增量备份即可,系统会自动寻找所有的增备和全备。
-- 备份所有归档日志
BACKUP ARCHIVELOG ALL TO ARCHBAK BACKUPSET '/dmdata/dmbak/arch_bak_20260824';
对于归档的备份,只需要执行还原操作即可,不需要恢复和更新数据库魔数。
所有恢复操作必须在数据库关闭状态下,使用 DMRMAN 工具进行。物理还原一般通过 DMRMAN 工具(或者 SQL 语句),把备份集中的数据内容(数据文件、数据页、归档文件)重新拷贝、写入目标文件。DMRMAN 工具用于执行脱机的数据备份、还原与恢复,包括脱机的数据库备份、还原与恢复,脱机还原表空间,归档的备份、还原与修复。
# 1. 关闭数据库
./DmServiceDMSERVER stop
# 2. 启动DMRMAN并执行还原
./dmrman
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_20260824';

# 3. 恢复(重做日志使数据库一致)
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_20260824';

# 4. 更新数据库魔数
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
增量备份恢复时,直接指定最后一个增量备份集即可,系统会自动寻找所有相关的全备和增备进行还原。
./dmrman
-- 1. 还原(指定增量备份集,系统自动链式还原基备份)
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_increment_bak_01';

-- 2. 恢复
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_increment_bak_01';
-- 3. 更新魔数
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
当有完整的备份集和连续的归档日志时,可以将数据库恢复到最新状态:
./dmrman
-- 1. 还原备份集
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_20260824';

-- 2. 使用归档日志恢复(恢复到最新状态)
-- 需要将所有归档日志拷贝到恢复目标库
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/dmbak';

-- 3. 更新魔数
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
应用场景:误删除数据后,恢复到误操作之前的时间点。
UNTIL TIME 是达梦数据库备份恢复体系中的核心参数之一,专用于实现基于时间点的恢复(Point-in-Time Recovery,PITR),也常被称为不完全恢复(Incomplete Recovery)。确保当前操作数据库归档日志有效。
./dmrman
-- 1. 还原备份集
RMAN> RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/db_full_bak_20260824';

-- 2. 恢复到指定时间点(使用归档日志)
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/dmbak' UNTIL TIME '2026-08-24 12:10:00';

-- 3. 更新魔数
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
恢复到指定 LSN:DM 中每条 REDO 日志记录都对应一个唯一的 LSN 值,指定 LSN 值以后,数据库将会精准地恢复到产生这个 LSN 时间点的状态。
RMAN> RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dmdata/dmbak' UNTIL LSN 45578;
SELECT CKPT_LSN, FILE_LSN, FLUSH_LSN, CUR_LSN FROM V$RLOG;
备份、还原、恢复三者相互独立又密不可分,还原后的数据库必须经过恢复和更新 DB_MAGIC 才能正常启动。LSN 作为贯穿全流程的核心标识,配合检查点机制动态调整 CKPT_LSN,为备份提供了可靠的日志起点。
在备份策略上,完全备份为基座,增量备份减少存储开销,归档备份保证日志连续性,三者结合可实现任意时间点的精确恢复。恢复操作中需注意增量备份的链式依赖,恢复时只需指定最后一个增量备份集,DMRMAN 会自动搜索基备份链;基于归档日志或 PITR 恢复时,则必须确保归档日志完整连续。
此外,联机备份需开启归档模式,脱机备份与所有还原恢复操作均需关闭数据库,工具与状态管理需严格区分。
文章
阅读量
获赞
