DM 数据库的备份还原机制是保障数据安全的核心。其设计思路主要围绕两种状态和两种操作进行组合:
基本流程是:通过联机或脱机方式创建备份集,当灾难发生时,关闭数据库,使用 DMRMAN 工具将备份集恢复到指定位置,并通过归档日志进行精准恢复,最终使数据库恢复至可用状态。
本博客将通过具体的实操案例,覆盖以下核心场景:
更完整和深入的内容可以查阅官方的《DM 备份与还原手册》。
归档是联机备份的基石。当数据库启用归档模式后,所有已提交事务的 REDO 日志会被保存为独立的归档日志文件。这使得数据库可以在任何时间点进行一致性备份,并且能够在灾难发生后恢复到任意时间点(PITR, Point-In-Time Recovery)。
1.控制归档的INI参数:
SP_SET_PARA_VALUE 进行修改,或 ALETR 修改。dmarch.ini 文件中的配置来执行具体的归档操作。dm.ini 中 CONFIG_PATH 参数指定的路径去寻找 dmarch.ini 文件。CONFIG_PATH 默认为 SYSTEM_PATH(即数据库实例所在目录)。2. 归档策略文件默认值(位于 dmarch.ini)
当将 ARCH_INI 设置为 1 启用归档后,数据库会读取 dmarch.ini 文件来获取具体的归档策略。该文件中各项参数的默认值如下(以本地归档为例):
ARCH_WAIT_APPLY
ARCH_RESERVE_TIME
ARCH_SEND_POLICY
ARCH_FILE_SIZE (本地归档)
ARCH_SPACE_LIMIT (本地归档)
ARCH_FLUSH_BUF_SIZE (本地归档)
ARCH_HANG_FLAG (本地归档)
相关SQL命令:
-- 1. 查看当前归档状态
SELECT ARCH_MODE FROM V$DATABASE;
-- 2. 切换到配置模式 (也可在管理工具中修改)
ALTER DATABASE MOUNT;
-- 3. 开启归档模式
ALTER DATABASE ARCHIVELOG;
-- 4. 添加一个本地归档配置
-- 说明:可以联机使用SQL配置,也可以手动在指定目录下创建DMARCH.INI文件。
-- DM支持配置多个归档路径。在生产环境中,归档路径必须与数据文件位于不同的物理磁盘。
ALTER DATABASE ADD ARCHIVELOG 'DEST = /home/dmdba/dmdbms/data/DAMENG/arch, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048';
-- 5. 重新打开数据库,使配置生效
ALTER DATABASE OPEN;
1.1 INI 文件参数 (全局默认行为)
BAK_PATH (在 dm.ini 中)
SYSTEM_PATH 下的 bak 目录。bak_use_ap (在 dm.ini 中)
dmap辅助进程还是dmserver主进程。1 (使用 dmap 辅助进程)。1可获得更高性能,支持并行、压缩、加密和第三方磁带备份。如果客户环境(如某些轻量级容器)没有dmap服务,才需要手动设为2,但这会丧失第三方磁带备份功能。ARCH_INI (在 dm.ini 中)
dmarch.ini 文件。0 (不启用)。1,并正确配置 dmarch.ini,否则联机备份会失败。page_check (在 dm.ini 中)
0 (不校验)。1)。这样,备份进程在读取数据页时会进行校验,能提前发现磁盘“静默损坏”导致的数据页损坏问题。RLOG_GEN_FOR_HUGE (在 dm.ini 中)
1。1.2命令参数 (SQL / DMRMAN)
这些参数定义了备份任务的具体内容。它们是**“一次性”的,并且优先级高于** .ini 中的默认设置。
BACKUPSET '<path>'
BACKUPSET,那么 dm.ini 中的 BAK_PATH 将被忽略。FULL / INCREMENT
FULL (全量)。INCREMENT 来执行增量备份。WITHOUT LOG (仅联机SQL)
COMPRESSED [LEVEL <n>]
IDENTIFIED BY "<password>"
PARALLEL [<n>]
还原操作(尤其是DMRMAN)的参数大部分没有“默认值”,需要手动指定。
RESTORE DATABASE '<ini_path>' 或 TO '<dir_path>'
'<ini_path>' 是还原到已存在的库结构;TO '<dir_path>' 是还原到全新的目录。FROM BACKUPSET '<path>'
MAPPED FILE '<path>'
OVERWRITE
DMRMAN 覆盖目标路径下已存在的同名文件。REUSE DMINI
.ini 参数来覆盖目标库的 .ini 参数(路径相关参数除外)。.ini 参数)。RECOVER ... WITH ARCHIVEDIR '<path>'
RECOVER ... UNTIL TIME '...' / UNTIL LSN ...
RECOVER ... UPDATE DB_MAGIC
以下案例均基于 DM 官方手册中的 BOOKSHOP 示例库。
模拟研发人员误删一张重要表的常见场景,要求在不停止服务的情况下快速恢复。
步骤 1:联机备份表 (SQL)
-- 目标表:PRODUCTION.PRODUCT_REVIEW
-- 为备份集指定一个清晰的绝对路径和名称
BACKUP TABLE PRODUCTION.PRODUCT_REVIEW
BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_review_bak';
步骤 2:模拟灾难 (DROP TABLE)
-- 研发的“手抖”操作
DROP TABLE PRODUCTION.PRODUCT_REVIEW;
-- 验证表已不存在,查询将报错:-2106:无效的表或视图名[PRODUCT_REVIEW]
SELECT COUNT(*) FROM PRODUCTION.PRODUCT_REVIEW;
步骤 3:联机还原表 (SQL)
由于表已被 DROP,DM 要求分两步进行还原,否则会报错。
-- 第1步:仅还原表结构
-- 使用 STRUCT 关键字重建表的定义
RESTORE TABLE STRUCT
FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_review_bak';
-- 第2步:还原表数据
RESTORE TABLE PRODUCTION.PRODUCT_REVIEW
FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_review_bak';
步骤 4:验证恢复结果
-- 再次查询,应能返回正确的行数
SELECT COUNT(*) FROM PRODUCTION.PRODUCT_REVIEW;
-- 期望结果: 20
结论:PRODUCT_REVIEW 表已成功恢复,整个过程数据库服务未中断。
模拟数据文件全部损坏的“全库灾难”场景。注意:数据库级别的还原 (RESTORE DATABASE) 只能脱机执行!
步骤 1:联机全量库备份 (SQL)
-- 创建一个一致性的全量备份(默认包含日志)
BACKUP DATABASE FULL
BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_full_bak';
[执行语句1]:
BACKUP DATABASE FULL
BACKUPSET 'bookshop_full_bak';
执行成功, 执行耗时6秒 399毫秒. 执行号:1860
影响了0条记录
1条语句执行成功
步骤 2:第一次业务变更 (创建 test 模式)
CREATE SCHEMA test;
CREATE TABLE test.t1 (id int);
INSERT INTO test.t1 VALUES (1);
COMMIT;
步骤 3:联机增量库备份 (SQL)
-- 创建一个增量备份,它依赖于之前的全量备份
-- WITH BACKUPDIR 指明基备份的搜索路径
BACKUP DATABASE INCREMENT
WITH BACKUPDIR '/home/dmdba/dmdbms/data/DAMENG/bak'
BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_inc1_bak';
[执行语句1]:
BACKUP DATABASE INCREMENT
WITH BACKUPDIR '/home/dmdba/dmdbms/data/DAMENG/bak'
BACKUPSET 'bookshop_inc1_bak';
执行成功, 执行耗时5秒 541毫秒. 执行号:1865
影响了0条记录
1条语句执行成功
步骤 4:第二次业务变更 (创建 test2 模式)
CREATE SCHEMA test2;
CREATE TABLE test2.t2 (id int);
INSERT INTO test2.t2 VALUES (1);
COMMIT;
步骤 5:模拟全库灾难
-- 模拟毁灭性操作,删除所有业务模式
DROP SCHEMA PERSON CASCADE;
DROP SCHEMA RESOURCES CASCADE;
DROP SCHEMA SALES CASCADE;
DROP SCHEMA PRODUCTION CASCADE;
DROP SCHEMA PURCHASING CASCADE;
DROP SCHEMA OTHER CASCADE;
DROP SCHEMA test CASCADE;
DROP SCHEMA test2 CASCADE;
-- 结果:8条语句执行成功
步骤 6:准备脱机还原
-- 立即关闭数据库
SHUTDOWN IMMEDIATE;
步骤 7:执行脱机还原 (DMRMAN)
打开服务器命令行,进入 DM 安装目录的 bin 文件夹下,执行标准的三步恢复流程。
# 启动 DMRMAN 工具
./dmrman
# 第 1 步: 还原 (Restore)
# 指向最新的增量备份集,DMRMAN 会智能地先应用基备份,再应用增量备份。
RMAN> RESTORE DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini'
FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_inc1_bak'
WITH BACKUPDIR '/home/dmdba/dmdbms/data/DAMENG/bak';
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:03][Remaining:00:00:00]
restore successfully.
time used: 00:00:03.264
# 第 2 步: 恢复 (Recover)
# 应用备份集中包含的 REDO 日志,将数据库恢复到备份结束的那个时间点。
RMAN> RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini'
FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_inc1_bak';
[Percent:100.00%][Speed:8.85PKG/s][Cost:00:00:00][Remaining:00:00:00] recover successfully!
time used: 00:00:03.268
# 第 3 步: 更新魔数 (Update DB_MAGIC)
# 这是最后一步,使数据库变为可启动状态。
RMAN> RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
recover successfully!
time used: 00:00:01.282
# 退出 DMRMAN
RMAN> exit
步骤 8:验证恢复结果
启动数据库服务后,登录 DIsql 进行验证:
-- 1. 验证核心数据(成功)
SELECT COUNT(*) FROM PRODUCTION.PRODUCT_REVIEW;
-- 结果: 20
-- 2. 验证第一次变更(成功)
SELECT COUNT(*) FROM test.t1;
-- 结果: 1
-- 3. 验证第二次变更(失败)
SELECT COUNT(*) FROM test2.t2;
-- 结果: -2103: 无效的模式名[TEST2]
结论:test2 模式没有被恢复。因为灾难恢复是基于最后一次备份集 (inc1_bak) 进行的。test2 模式是在该备份之后创建的,其变更信息不存在于任何备份集中。要恢复这部分数据,必须借助归档日志。
承接上文,我们的目标是恢复包含 test2 模式在内的所有数据,即恢复到 DROP 命令执行前的最后一刻。
步骤 1:重新还原数据库
数据库需保持关闭。由于上一步已启动过数据库,数据文件状态已改变,必须重新执行 RESTORE 并覆盖现有文件,设置带待恢复标志才能在RMAN中进行归档恢复。
# 启动 DMRMAN
./dmrman
# 使用 OVERWRITE 关键字覆盖现有文件,并重新设置“待恢复”标志
RMAN> RESTORE DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' OVERWRITE
FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_inc1_bak'
WITH BACKUPDIR '/home/dmdba/dmdbms/data/DAMENG/bak';
步骤 2:执行时间点恢复 (Recover)
DROP 命令的执行时间是 2025-11-18 14:49:23。我们需要恢复到此时间点的前一秒。
# 使用 WITH ARCHIVEDIR 指定归档日志目录
# 使用 UNTIL TIME 指定恢复的精确时间点
RMAN> RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini'
WITH ARCHIVEDIR '/home/dmdba/dmdbms/data/DAMENG/arch'
UNTIL TIME '2025-11-18 14:49:22';
步骤 3:更新魔数并完成
# 移除“待恢复”标志,使数据库可启动
RMAN> RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
RMAN> exit
步骤 4:最终验证
启动数据库服务后,再次验证 test2 模式。
SELECT COUNT(*) FROM test2.t2;
-- 期望结果: 1 (test2 模式已成功恢复)
适用于计划内停机维护窗口的备份场景。
步骤 1:正常关闭数据库
-- 正常关闭会执行一个完整的检查点,确保数据文件完全一致
SHUTDOWN NORMAL;
步骤 2:执行脱机备份 (DMRMAN)
# 启动 DMRMAN
./dmrman
# 执行脱机备份
RMAN> BACKUP DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' FULL
BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_offline_full';
说明:由于数据库已正常关闭,这个备份集是 100% 一致的,因此不包含 REDO 日志。
步骤 3:执行脱机还原 (DMRMAN)
模拟灾难后,进行还原。
# 启动 DMRMAN
./dmrman
# 第 1 步: 还原 (Restore)
RMAN> RESTORE DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' OVERWRITE
FROM BACKUPSET '/home/dmdba/dmdbms/data/DAMENG/bak/bookshop_offline_full';
# 第 2 步: 更新魔数 (Update DB_MAGIC)
# 注意:因为脱机备份是完全一致的,所以不需要 RECOVER日志步骤,直接更新魔数
RMAN> RECOVER DATABASE '/home/dmdba/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
RMAN> exit
步骤 4:验证恢复结果
启动数据库服务并登录查询,数据已完全恢复到备份时的状态。
文章
阅读量
获赞
