备份恢复原理介绍
一、备份恢复
数据库备份是 DBA 日常最重要的工作内容。备份的主要目的是数据容灾,保证数据的安全性,在数据库发生故障时,通过还原备份集,将数据恢复到可用状态。
本文主要介绍 DM 备份与还原的概述和基本概念。
备份分为逻辑备份,物理备份,与PostgreSQL数据库的备份原理相似
- 逻辑备份就是把数据库的数据、对象等给抽取出来,放到本地文件中。
- 物理备份是直接拷贝数据库文件。
物理备份有脱机备份(就是现需要先把数据库关掉,在生产环境上不能停服先不介绍了)和联机备份 (数据库在open状态下进行的备份)
1.1 备份相关概念
1.1.1 重做日志:
又叫 REDO 日志,记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。在系统故障重启时(比如数据库突然断电,导致刷脏页失败),通过重做 REDO 日志,可以将数据库恢复到故障时的状态。
DM 数据库默认包含两个扩展名为 log 的日志文件,用来保存 REDO 日志,称为联机重做日志文件。这两个文件循环使用。任何数据页从内存缓冲区写入磁盘之前,必须保证其对应的 REDO 日志已经写入到联机日志文件。
REDO 日志包 (RLOG_PKG)是 DM 数据库保存 REDO 日志的数据单元,可容纳一个或多个 PTX (是物理事务,对数据页一系列的修改也包含ACID特性)生成的 REDO 日志。
日志包自带自描述属性,大小不固定,记录类型、长度、包序号、LSN(redo日志序列号)等控制信息。
日志包按序号连续生成,整体 LSN 呈递增;
1.1.2 LSN 介绍
LSN(LOG SEQUENCE NUMBER),即日志序列号,表示 REDO 日志产生的顺序,系统为每个 REDO 日志分配一个 LSN 值。
由系统自动维护的 Bigint 类型数值(理论上不存在耗尽的情况),具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合
可以通过查询v$rlog和 V$RAPPLY_PARALLEL_INFO 表来获取
- CUR_LSN 是系统已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值,大小等于 CUR_LSN+1,然后再修改 CUR_LSN=CUR_LSN+1。
- FLUSH_LSN 是已经发起日志刷盘请求,但还没有真正写入联机 REDO 日志文件的最大 LSN 值。
- FILE_LSN 是已经写入联机 REDO 日志文件的最大 LSN 值。每次将 REDO 日志包 RLOG_PKG 写入联机 REDO 日志文件后,都要修改 FILE_LSN 值。
- CKPT_LSN 是检查点 LSN,所有 LSN <= CKPT_LSN 的物理事务修改的数据页,都已经从数据缓冲区写入磁盘,CKPT_LSN 由检查点线程负责调整。
1.1.3 检查点
检查点的功能是按照数据页第一次被修改的顺序,依次将 BUFFER 缓冲区中的脏页写入磁盘,并在这个过程中动态调整CKPT_LSN值,释放日志空间。
执行时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
当事务提交或 REDO 日志包满或执行检查点时会进行redo日志刷盘。
1.1.4 归档
将 REDO 日志写入到本地归档日志文件的过程,
与联机 REDO 日志文件可以被覆盖重用不同,本地归档日志文件不能被覆盖,写入其中的 REDO 日志信息会一直保留,直到用户主动删除;如果配置了归档日志空间上限,系统会自动删除最早生成的归档 REDO 日志文件,腾出空间。
查询 v$dm_arch_ini、v$arch_status 等动态视图可以获取归档配置以及归档状态等相关信息。
为了最大限度地保护数据,当磁盘空间不足导致归档写入失败,系统将自动挂起等待,直到用户主动释放出足够的空间后继续运行。
1.1.5 REDO 日志备份
日志备份就是将联机备份过程中产生的 REDO 日志拷贝到备份片文件中,用来在数据库还原结束后,将数据库恢复到一致性状态。联机库备份默认开启日志备份

在备份开始时,记录一个 BEGIN_LSN,在备份结束后记录一个 END_LSN,那么 [BEGIN_LSN,END_LSN] 之间的 REDO 日志,就对应备份过程中用户对数据的修改。其中 BEGIN_LSN=CKPT_LSN,作为日志备份的起点,END_LSN = 数据备份结束时的 FILE_LSN,作为日志备份的终点。
1.2 还原相关概念
还原是备份的逆过程,具体包括数据还原和数据恢复两步。
数据还原的主要动作是将数据页从备份集中拷贝回数据库文件相应位置。
还原恢复时,若性能较差,则可以通过适当增大 dm.ini 文件中 BUFFER 的参数值(可用物理内存的 60%~80%)、 REDOS_PARALLEL_NUM 的参数值来提升还原恢复性能。
数据恢复 是指在还原执行结束后,重做 REDO 日志,将数据库恢复到一致性状态,并执行更新 DB_MAGIC 的过程。
为便于理解数据库恢复过程,先介绍达梦 MAGIC 魔数:
PERMANENT_MAGIC、DB_MAGIC 均为整型数据库标识,库初始化时生成。
永久魔数 PERMANENT_MAGIC :默认固定不变,仅通过 DDL_CLONE 备份集还原,执行RECOVER DATABASE ... UPDATE DB_MAGIC时才会变更。
数据库魔数 DB_MAGIC :用于标识数据库,每次做还原恢复操作后自动变化,区分备份源库与还原目标库。
sql
SELECT PERMANENT_MAGIC;
SELECT DB_MAGIC FROM V$RLOG;
如果备份时指定了 WITHOUT LOG 子句(不备份备份过程中产生的日志),必须使用本地的归档来恢复,执行恢复前,会检查本地归档日志文件的完整性,要求必须包括[BEGIN_LSN,END_LSN]之间完整的 REDO 日志。
日志没有指定WITHOUT LOG 子句:
- 从备份集读取 REDO 日志,并生成一个临时的本地归档日志文件;
- 利用生成的临时归档日志文件,重做 REDO 日志,并将数据修改写入磁盘;
- 删除临时生成的归档日志文件;
- 更新数据库日志信息,设置 CKPT_LSN 为最后一个重做的 REDO 日志 LSN 值;
- 修改数据状态为 ACTIVE,标记数据库启动时需要进行相应的回滚活动事务、PURGE 已提交事务。
指定归档恢复的执行场景主要包括:
- 将数据库恢复到指定时间点状态
- 将数据库恢复到指定 LSN 产生时的状态
二、备份恢复实操
DM 仅支持表的联机还原,数据库、表空间和归档日志的还原必须通过脱机工具DMRMAN执行,DMRMAN不支持数据库的联机备份。
2.1 备份、恢复数据库
可以查看数据库备份目录,备份集搜索目录统称为基备份集搜索目录.
sql
select * from V$BACKUPSET_SEARCH_DIRS;
SELECT DEVICE_TYPE,BACKUP_PATH, TYPE, RANGE# FROM V$BACKUPSET;
SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK', '/dmdata/dmbak/20260428_all');
SELECT BACKUP_PATH, PAGE_SIZE, EXTENT_SIZE, CASE_SENSITIVE FROM V$BACKUPSET_DBINFO;
执行备份命令
sql
backup database full to "DB_DAMENG_FULL_2026_04_30_10_48_55" backupset '/dmdata/dmbak/20260428_all' compressed level 4 parallel 4;
-- 执行结果
SQL> backup database full to "DB_DAMENG_FULL_2026_04_30_10_48_55" backupset '/dmdata/dmbak/20260428_all' compressed level 4 parallel 4;
操作已执行
已用时间: 00:00:05.038. 执行号:1504.
执行恢复命令
bash
# 初始化实例
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit PATH=/dmdata/data2 INSTANCE_NAME=GRP1_RWW_02 SYSDBA_PWD='Linux123!@#' SYSAUDITOR_PWD='Linux123!@#' PORT_NUM=5237
# 恢复数据
su - dmdba
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data2/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/20260428_all'"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data2/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/20260428_all'"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data2/DAMENG/dm.ini' UPDATE DB_MAGIC"
基于时间点的恢复:实践操作
例如,用户在下午 5 点做了一个误操作,删除了某些重要数据;我们可以指定恢复时间点到下午 4:59 分,恢复被误删除的数据,这种情况常发生那个在预生产环境上,需要找个测试机器(不要在生产上直接关库停服)重新还原一下这个时间状态的数据库。
sql
数据准备
CREATE TABLE TAB_FOR_RECOVER_01(C1 INT);
INSERT INTO TAB_FOR_RECOVER_01 VALUES(1);
COMMIT;
归档切换,主要是解决:redo先写入联机日志,异步写入归档,使用归档切换,可以把redo日志刷入归档。
alter system switch logfile;
备份数据库
backup database full to "DB_DAMENG_FULL" backupset '/dmdata/dmbak/20260428_all' compressed level 4 parallel 4;
误操作数据库。此步骤误删除了表 TAB_FOR_RECOVER_01 中数据
DELETE FROM TAB_FOR_RECOVER_01;
COMMIT;
使用 SELECT SYSDATE 命令查询此时的时间
SQL> SELECT SYSDATE;
行号 SYSDATE
---------- -------------------
1 2026-04-30 13:36:46
已用时间: 4.039(毫秒). 执行号:1508.
查看备份信息、校验合法性
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="SHOW BACKUPSET '/dmdata/dmbak/20260428_all' INFO DB;"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="SHOW BACKUPSET '/dmdata/dmbak/20260428_all' INFO META;"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="CHECK BACKUPSET '/dmdata/dmbak/20260428_all';"
初始化实例
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit PATH=/dmdata/data2 INSTANCE_NAME=GRP1_RWW_02 SYSDBA_PWD='Linux123!@#' SYSAUDITOR_PWD='Linux123!@#' PORT_NUM=5237
恢复数据,指定时间点
su - dmdba
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data2/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/20260428_all'"
[dmdba@localhost 20260428_all]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data2/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/20260428_all'"
dmrman V8
RESTORE DATABASE '/dmdata/data2/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/20260428_all'
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00]
restore successfully.
time used: 00:00:02.649
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data2/DAMENG/dm.ini' WITH ARCHIVEDIR'/dmdata/arch' UNTIL TIME'2026-04-30 13:36:46';"
/home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data2/DAMENG/dm.ini' UPDATE DB_MAGIC"
# 启动实例
./dmserver path=/dmdata/data2/DAMENG/dm.ini -NOCONSOLE &
[dmdba@localhost ~]$ sh login2.sh
服务器[127.0.0.1:5237]:处于普通打开状态
登录使用时间 : 4.868(ms)
disql V8
STATUS$
-------
OPEN
服务器[127.0.0.1:5237]:处于普通打开状态
登录使用时间 : 7.958(ms)
disql V8
SQL> -- 切换当前模式
SET SCHEMA "TEST_EXBASE";
SQL> select TABLE_NAME,owner from all_tables where owner='TEST_EXBASE' and TABLE_NAME ='TAB_FOR_RECOVER_01';
行号 TABLE_NAME OWNER
---------- ------------------ -----------
1 TAB_FOR_RECOVER_01 TEST_EXBASE
已用时间: 45.423(毫秒). 执行号:706.
2.2 模式级别的备份、恢复
物理备份只是支持表、空间、库级别的备份,表级别的还原可以联机,其余的还原必须脱机还原。
有的生产环境上,需要把测试环境上的某个模式下的对象,给迁移到生产上去,则需要使用逻辑备份和还原(必须联机)。
逻辑导出(dexp)和逻辑导入(dimp)是 DM 数据库的两个命令行工具,逻辑导出和逻辑导入数据库对象分为四种级别。
- 数据库级(FULL):导出或导入整个数据库中的所有对象。
- 用户级(OWNER):导出或导入一个或多个用户所拥有的所有对象。
- 模式级(SCHEMAS):导出或导入一个或多个模式下的所有对象。
- 表级(TABLES):导出或导入一个或多个指定的表或表分区。
sql
-- 生产、导出来的是SQL语句文件
dexp USERID=SYSDBA/'"Linux123!@#"'@127.0.0.1:5236 FILE=test_exbase.dmp LOG=db_str.log SCHEMAS=TEST_EXBASE DIRECTORY=/home/dmdba/data PARALLEL=4
-- 测试环境
DROP SCHEMA "TEST_EXBASE" CASCADE;
CREATE SCHEMA "TEST_EXBASE" AUTHORIZATION "SYSDBA";
dimp USERID=SYSDBA/'"Linux123!@#"'@127.0.0.1:5237 FILE=test_exbase.dmp LOG=db_str.log SCHEMAS=TEST_EXBASE DIRECTORY=/home/dmdba/data
三、创建备份定时作业
Linux 图形化界面使用的时候,同样支持 DM 管理工具的图形化方式启动:
bash
#防止出现vm与虚拟机不可粘贴复制的情况
yum install -y open-vm*
xhost +
echo $DISPLAY
su - dmdba
export DISPLAY=:0.0
cd /home/dmdba/dmdbms/tool/
ll
./manager
Linux 图形化创建定时备份作业,全量+增量+删除策略,应用场景:
此备份策略适用于数据量大于 100G 并且小于 3T 的场景下。注意开启数据库归档,确定备份路径。
例如:设置每周六 23:00 全量备份。每天(除周六) 23:00 增量备份、删除 30 天前的增量备份、删除 40 天前的全量备份。全量备份路径为 /dmdata/dmbak/all,增量备份路径为 /dmdata/dmbak/add。
需要设置两个作业,配置步骤为:创建作业-> 创建操作步骤-> 创建调度策略-> 结束。
sql
CALL SP_CREATE_JOB('bakall', 1, 0, '', 0, 0, '', 0, '每周六23:00全量备份');
CALL SP_JOB_CONFIG_START('bakall');
CALL SP_ADD_JOB_STEP('bakall', 'bakall', 6, '00040000/dmdata/dmbak/all', 1, 1, 0, 0, NULL, 0);
CALL SP_ADD_JOB_SCHEDULE('bakall', 'bakall_time01', 1, 2, 1, 64, 0, '23:00:00', NULL, '2026-04-29 16:47:26', NULL, '每周六执行一次全量备份');
CALL SP_JOB_CONFIG_COMMIT('bakall');
使用图形化来配置全量备份作业

sql
call SP_CREATE_JOB('BAKADD_DELBAK',1,0,'',0,0,'',0,'每天(除周六)23:00增量备份、删除30天前的增量备份、删除40天前的全量备份');
call SP_JOB_CONFIG_START('BAKADD_DELBAK');
call SP_ADD_JOB_STEP_EX('BAKADD_DELBAK', 'BAKADD', 6, '44040000/dmdata/dmbak/all|/dmdata/dmbak/add', 3, 3, 0, 0, NULL, 0, '');
call SP_ADD_JOB_STEP('BAKADD_DELBAK', 'delbak', 0, ' SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/dmdata/dmbak/add''); CALL SP_DB_BAKSET_REMOVE_BATCH(''DISK'',SYSDATE-30); SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/dmdata/dmbak/all''); CALL SP_DB_BAKSET_REMOVE_BATCH(''DISK'',SYSDATE-40); ', 1, 1, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('BAKADD_DELBAK', 'BAKADD_DELBAK_TIME01', 1, 2, 1, 63, 0, '23:00:00', NULL, '2026-04-29 17:21:50', NULL, '');
call SP_JOB_CONFIG_COMMIT('BAKADD_DELBAK');
使用图形化来配置增量备份 + 删除备份作业
