外观
DM 增量恢复
增量恢复的核心特点:
- 只恢复变化的数据,减少恢复时间
- 结合全量备份使用,形成完整恢复链
- 支持累积增量恢复和差异增量恢复
- 减少存储空间占用
- 提高恢复效率
适用场景:
- 大规模数据库,全量恢复时间长
- 对恢复时间要求较高的场景
- 存储资源有限的环境
- 需要频繁备份和恢复的测试环境
增量恢复原理
1. 增量恢复的基本概念
1.1 增量备份类型
DM数据库支持两种增量备份类型,对应的增量恢复方式也不同:
1.1.1 累积增量备份
累积增量备份只备份自上次全量备份以来发生变化的数据,恢复时只需要最新的累积增量备份:
全量备份 → 累积增量备份1 → 累积增量备份2 → 累积增量备份3恢复流程:
全量恢复 → 应用最新累积增量备份 → 应用归档日志1.1.2 差异增量备份
差异增量备份只备份自上次备份(可以是全量或增量)以来发生变化的数据,恢复时需要所有中间增量备份:
全量备份 → 差异增量备份1 → 差异增量备份2 → 差异增量备份3恢复流程:
全量恢复 → 应用差异增量备份1 → 应用差异增量备份2 → 应用差异增量备份3 → 应用归档日志1.2 增量恢复的实现机制
增量恢复的实现包括以下关键步骤:
- 全量恢复:首先从全量备份中恢复数据文件的基础版本
- 增量恢复:然后应用增量备份,恢复自全量备份以来发生变化的数据块
- 日志应用:最后应用归档日志,恢复到最新状态或指定时间点
- 更新数据库模式:更新数据库的魔术值(DB_MAGIC),确保数据库可以正常启动
1.3 增量恢复的关键技术
1.3.1 数据块级恢复
增量恢复以数据块为单位进行恢复,只恢复自上次备份以来发生变化的数据块,减少恢复时间和IO操作。
1.3.2 LSN(日志序列号)匹配
增量恢复通过LSN(日志序列号)来匹配备份和数据块,确保只恢复需要更新的数据块:
- 每个数据块都记录了最后修改它的LSN
- 增量备份中记录了备份时的LSN范围
- 恢复时只恢复LSN大于数据块当前LSN的数据块
1.3.3 恢复链管理
增量恢复需要管理完整的恢复链,包括:
- 全量备份的位置和时间
- 增量备份的顺序和依赖关系
- 归档日志的范围
2. 增量恢复的工作流程
增量恢复的工作流程包括以下阶段:
2.1 准备阶段
- 检查备份链的完整性
- 验证全量备份和增量备份的可用性
- 确定恢复的目标和范围
2.2 全量恢复阶段
- 从全量备份中恢复数据文件
- 验证全量恢复的完整性
- 准备增量恢复环境
2.3 增量恢复阶段
- 读取增量备份集
- 解析增量备份中的数据块信息
- 匹配需要恢复的数据块
- 将变化的数据块恢复到数据文件
2.4 日志应用阶段
- 读取归档日志
- 应用重做记录到数据块
- 维护数据的一致性
- 回滚未提交的事务
2.5 完成阶段
- 更新数据库模式
- 验证恢复结果
- 生成恢复报告
增量恢复前提条件
在执行增量恢复之前,需要确保满足以下前提条件:
1. 备份条件
- 有可用的全量备份:全量备份是增量恢复的基础
- 有完整的增量备份链:自全量备份以来的所有增量备份
- 有完整的归档日志:自最后一次增量备份以来的所有归档日志
- 备份集完整可用:所有备份集都经过验证,确保完整性
- 备份类型匹配:累积增量备份或差异增量备份
2. 环境条件
- 数据库实例处于关闭状态:执行增量恢复前需要关闭数据库实例
- 有足够的存储空间:目标数据库目录有足够的空间存储恢复后的数据文件
- 数据库软件版本兼容:恢复时使用的数据库软件版本应与备份时的版本兼容
- 相同的数据库配置:恢复时的数据库配置应与备份时保持一致
3. 权限条件
- 执行恢复的用户具有足够的权限:需要SYSDBA或DBA权限
- 备份文件具有可读权限:恢复过程中需要读取备份文件
- 目标目录具有可写权限:恢复过程中需要写入数据文件
增量恢复操作步骤
1. 准备工作
1.1 确认备份链
在执行增量恢复前,需要确认备份链的完整性:
shell
# 查看备份集列表
./dmrman backup list;
# 检查全量备份完整性
./dmrman check backupset '/opt/dmdbms/backup/full_backup';
# 检查增量备份完整性
./dmrman check backupset '/opt/dmdbms/backup/incremental_backup_1';
./dmrman check backupset '/opt/dmdbms/backup/incremental_backup_2';1.2 停止数据库实例
执行增量恢复前需要停止数据库实例:
shell
# 使用systemctl停止实例
systemctl stop DmServiceDMSERVER
# 或使用dmadmin命令
./dmadmin stop instance /opt/dmdbms/data/DAMENG/dm.ini2. 执行累积增量恢复
2.1 基本恢复流程
累积增量恢复的基本流程:
- 执行全量恢复
- 执行最新累积增量恢复
- 应用归档日志
- 更新数据库模式
2.2 恢复操作示例
shell
# 启动dmrman
./dmrman
# 执行全量恢复
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_backup';
# 执行累积增量恢复(只需要最新的累积增量备份)
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/cumulative_incr_backup_3';
# 应用归档日志
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/opt/dmdbms/arch';
# 更新数据库模式
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;3. 执行差异增量恢复
3.1 基本恢复流程
差异增量恢复的基本流程:
- 执行全量恢复
- 依次执行所有差异增量恢复(按顺序)
- 应用归档日志
- 更新数据库模式
3.2 恢复操作示例
shell
# 启动dmrman
./dmrman
# 执行全量恢复
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_backup';
# 依次执行差异增量恢复(按顺序)
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/diff_incr_backup_1';
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/diff_incr_backup_2';
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/diff_incr_backup_3';
# 应用归档日志
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/opt/dmdbms/arch';
# 更新数据库模式
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;4. 完整恢复脚本示例
shell
#!/bin/bash
# DM数据库增量恢复脚本
# 配置参数
DM_HOME="/opt/dmdbms"
INSTANCE_INI="/opt/dmdbms/data/DAMENG/dm.ini"
BACKUP_DIR="/opt/dmdbms/backup"
ARCH_DIR="/opt/dmdbms/arch"
LOG_FILE="/opt/dmdbms/logs/incremental_recovery_$(date +%Y%m%d%H%M%S).log"
# 记录日志
echo "=== DM数据库增量恢复开始:$(date) ===" > $LOG_FILE
# 停止数据库实例
echo "停止数据库实例..." >> $LOG_FILE
systemctl stop DmServiceDMSERVER
# 检查备份完整性
echo "检查备份完整性..." >> $LOG_FILE
$DM_HOME/bin/dmrman "CHECK BACKUPSET '$BACKUP_DIR/full_backup'" >> $LOG_FILE 2>&1
$DM_HOME/bin/dmrman "CHECK BACKUPSET '$BACKUP_DIR/incremental_backup'" >> $LOG_FILE 2>&1
# 执行增量恢复
echo "执行增量恢复..." >> $LOG_FILE
$DM_HOME/bin/dmrman << EOF >> $LOG_FILE 2>&1
# 执行全量恢复
RESTORE DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/full_backup';
# 执行增量恢复
RECOVER DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/incremental_backup';
# 应用归档日志
RECOVER DATABASE '$INSTANCE_INI' WITH ARCHIVEDIR '$ARCH_DIR';
# 更新数据库模式
RECOVER DATABASE '$INSTANCE_INI' UPDATE DB_MAGIC;
EXIT;
EOF
# 启动数据库实例
echo "启动数据库实例..." >> $LOG_FILE
systemctl start DmServiceDMSERVER
# 验证恢复结果
echo "验证恢复结果..." >> $LOG_FILE
$DM_HOME/bin/disql SYSDBA/SYSDBA@localhost:5236 << SQL_EOF >> $LOG_FILE 2>&1
-- 查看实例状态
SELECT status FROM V\$INSTANCE;
-- 查看数据库状态
SELECT status FROM V\$DATABASE;
-- 执行数据库一致性检查
CHECK DATABASE;
EXIT;
SQL_EOF
echo "=== DM数据库增量恢复完成:$(date) ===" >> $LOG_FILE
echo "增量恢复完成,日志文件:$LOG_FILE"5. 恢复验证
5.1 启动数据库实例
shell
# 使用systemctl启动实例
systemctl start DmServiceDMSERVER
# 或使用dmadmin命令
./dmadmin start instance /opt/dmdbms/data/DAMENG/dm.ini5.2 验证数据库状态
sql
-- 查看实例状态
SELECT status$ FROM V$INSTANCE;
-- 查看数据库状态
SELECT status$ FROM V$DATABASE;
-- 查看表空间状态
SELECT name, status$ FROM V$TABLESPACE;
-- 查看数据文件状态
SELECT name, status$ FROM V$datafile;5.3 验证数据完整性
sql
-- 执行数据库一致性检查
CHECK DATABASE;
-- 验证关键表数据
SELECT COUNT(*) FROM important_table;
SELECT * FROM important_table WHERE id = 1;
-- 验证增量备份后的事务
SELECT * FROM v$trx WHERE start_time > TO_DATE('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') ORDER BY start_time DESC;不同场景的增量恢复
1. 生产环境增量恢复
场景描述:生产环境数据库崩溃,需要快速恢复
恢复策略:
- 使用累积增量备份,减少恢复步骤
- 采用并行恢复,提高恢复速度
- 恢复后立即执行全量备份
恢复步骤:
shell
# 并行执行全量恢复
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_backup' PARALLEL 8;
# 并行执行累积增量恢复
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/cumulative_incr_backup' PARALLEL 8;
# 并行应用归档日志
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/opt/dmdbms/arch' PARALLEL 8;
# 更新数据库模式
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;2. 测试环境增量恢复
场景描述:测试环境需要频繁恢复到不同时间点
恢复策略:
- 使用差异增量备份,提高备份频率
- 自动化恢复脚本,减少人工干预
- 恢复后自动验证数据完整性
恢复步骤:
shell
#!/bin/bash
# 测试环境增量恢复脚本
# 配置参数
DM_HOME="/opt/dmdbms"
INSTANCE_INI="/opt/dmdbms/data/TESTDB/dm.ini"
BACKUP_DIR="/opt/dmdbms/backup/testdb"
ARCH_DIR="/opt/dmdbms/arch/testdb"
TARGET_TIME=$1 # 恢复目标时间
# 停止数据库实例
systemctl stop DmServiceTESTDB
# 执行恢复
$DM_HOME/bin/dmrman << EOF
RESTORE DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/full_backup';
RECOVER DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/diff_incr_backup_1';
RECOVER DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/diff_incr_backup_2';
RECOVER DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/diff_incr_backup_3';
RECOVER DATABASE '$INSTANCE_INI' WITH ARCHIVEDIR '$ARCH_DIR' UNTIL TIME '$TARGET_TIME';
RECOVER DATABASE '$INSTANCE_INI' UPDATE DB_MAGIC;
EOF
# 启动数据库实例
systemctl start DmServiceTESTDB
# 自动验证
echo "恢复到时间点:$TARGET_TIME 完成!"3. 异机增量恢复
场景描述:需要将数据库增量恢复到不同的服务器
恢复策略:
- 确保目标服务器环境与源服务器一致
- 复制完整的备份链到目标服务器
- 调整配置文件中的路径参数
恢复步骤:
shell
# 在源服务器上压缩备份
tar -czvf backup.tar.gz /opt/dmdbms/backup/
# 复制备份到目标服务器
scp backup.tar.gz user@target_server:/opt/dmdbms/
# 在目标服务器上解压备份
tar -xzvf /opt/dmdbms/backup.tar.gz -C /opt/dmdbms/
# 创建数据库目录
mkdir -p /opt/dmdbms/data/DAMENG
# 复制配置文件
cp /opt/dmdbms/backup/dm.ini /opt/dmdbms/data/DAMENG/
sed -i "s|/opt/dmdbms/data/DAMENG|/opt/dmdbms/data/DAMENG|g" /opt/dmdbms/data/DAMENG/dm.ini
# 执行增量恢复
$DM_HOME/bin/dmrman << EOF
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_backup';
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/incremental_backup';
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/opt/dmdbms/arch';
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;
EOF增量恢复最佳实践
1. 备份策略设计
1.1 选择合适的增量备份类型
| 场景 | 推荐备份类型 | 理由 |
|---|---|---|
| 大规模数据库,恢复时间要求高 | 累积增量备份 | 恢复时只需要最新的累积增量备份,减少恢复步骤和时间 |
| 频繁备份,存储资源有限 | 差异增量备份 | 备份文件较小,节省存储空间 |
| 测试环境,频繁恢复 | 差异增量备份 | 备份频率高,恢复到任意时间点灵活 |
| 生产环境,关键业务 | 累积增量备份 | 恢复速度快,减少业务中断时间 |
1.2 合理设置备份频率
- 全量备份:每周1次
- 累积增量备份:每天1次
- 差异增量备份:每4小时1次
- 日志备份:每小时1次
2. 恢复过程优化
2.1 使用并行恢复
shell
# 使用并行恢复,提高恢复速度
./dmrman
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_backup' PARALLEL 8;
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/incremental_backup' PARALLEL 8;2.2 优化恢复参数
sql
-- 调整恢复缓冲区大小
ALTER SYSTEM SET RECOVER_BUF_SIZE = 64 SCOPE = SPFILE;
-- 调整恢复并行度
ALTER SYSTEM SET RECOVER_PARALLEL = 8 SCOPE = SPFILE;
-- 调整日志应用参数
ALTER SYSTEM SET RECOVER_LOG_PARALLEL = 4 SCOPE = SPFILE;2.3 合理组织备份集
- 将全量备份和增量备份存储在不同的目录
- 定期清理过期的备份集
- 备份集命名包含时间戳和备份类型
- 使用压缩备份减少存储空间
3. 恢复后操作
3.1 立即执行全量备份
恢复完成后,立即执行全量备份,确保有最新的可用备份:
shell
./dmrman
BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL TO BACKUPSET '/opt/dmdbms/backup/after_incremental_recovery' COMPRESSED;3.2 检查数据库性能
- 监控数据库CPU、内存、IO使用率
- 检查SQL执行计划
- 验证关键业务流程性能
3.3 检查恢复日志
- 查看数据库告警日志
- 检查应用日志
- 确认没有恢复相关的错误
3.4 记录恢复过程
记录恢复过程的详细信息,包括:
- 恢复时间和原因
- 使用的备份集和归档日志
- 恢复步骤和命令
- 恢复时间
- 恢复结果
- 遇到的问题和解决方案
常见问题(FAQ)
Q1: 增量恢复时提示找不到基准备份怎么办?
A1: 找不到基准备份的可能原因:
- 基准备份路径错误
- 基准备份被删除或移动
- 备份集损坏
- 权限不足,无法访问备份集
解决方案:
- 检查基准备份路径是否正确
- 确认基准备份是否存在
- 检查备份集的权限
- 重新指定正确的基准备份路径
- 如果基准备份损坏,使用更早的备份重新恢复
Q2: 增量恢复时提示备份集不匹配怎么办?
A2: 备份集不匹配的可能原因:
- 增量备份与全量备份不属于同一个备份链
- 备份集损坏
- 备份类型不匹配(累积增量 vs 差异增量)
- 数据库版本不兼容
解决方案:
- 确认增量备份与全量备份属于同一个备份链
- 检查备份集的完整性
- 确认备份类型一致
- 确认数据库版本兼容
- 重新创建备份链
Q3: 增量恢复后数据不一致怎么办?
A3: 数据不一致的可能原因:
- 备份链不完整
- 归档日志缺失
- 恢复顺序错误
- 备份集损坏
解决方案:
- 检查备份链的完整性
- 验证归档日志的完整性
- 确认恢复顺序正确
- 重新执行恢复操作
- 执行数据库一致性检查
Q4: 增量恢复速度太慢怎么办?
A4: 增量恢复速度慢的可能原因:
- 备份集过大
- 归档日志过多
- 存储设备性能差
- 恢复并行度设置不合理
- 增量备份包含大量变化数据
解决方案:
- 增加恢复并行度
- 使用更快的存储设备
- 优化恢复参数
- 增加全量备份频率,减少增量备份的数据量
- 考虑使用累积增量备份替代差异增量备份
Q5: 如何验证增量恢复的完整性?
A5: 验证增量恢复完整性的方法:
sql
-- 执行数据库一致性检查
CHECK DATABASE;
-- 验证数据完整性
SELECT COUNT(*) FROM important_table;
SELECT * FROM important_table WHERE id = 1;
-- 验证增量备份中的数据是否已恢复
SELECT * FROM v$backup_set WHERE bak_type = 'INCREMENT';
SELECT * FROM v$backup_set_detail WHERE bakset_id = (SELECT bakset_id FROM v$backup_set WHERE bak_type = 'INCREMENT' ORDER BY start_time DESC LIMIT 1);Q6: 增量恢复后如何回滚?
A6: 增量恢复后回滚的方法:
- 如果恢复后发现数据有问题,需要重新执行恢复操作
- 可以恢复到之前的时间点或备份
- 建议在恢复前备份当前状态,以便回滚
shell
# 恢复前备份当前状态
./dmrman
BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL TO BACKUPSET '/opt/dmdbms/backup/before_incremental_recovery' COMPRESSED;不同版本的差异
DM 7 vs DM 8
| 特性 | DM 7 | DM 8 |
|---|---|---|
| 增量恢复类型 | 仅支持累积增量恢复 | 支持累积增量恢复和差异增量恢复 |
| 恢复并行度 | 最高支持4 | 最高支持128 |
| 恢复速度 | 一般 | 优化,恢复速度提升50%以上 |
| 恢复验证 | 基本验证 | 增强验证,自动检查恢复完整性 |
| 并行恢复 | 支持有限 | 全面支持,可配置多个并行度选项 |
| 增量恢复算法 | 传统算法 | 优化的增量恢复算法,减少IO操作 |
| 备份链管理 | 基本管理 | 增强的备份链管理,自动跟踪备份关系 |
DM 8.1 新特性
- 增强的增量恢复算法,恢复速度提升30%
- 支持增量恢复的断点续传
- 优化的并行恢复机制,支持更多并行度选项
- 增强的恢复验证功能,自动检查数据一致性
- 支持恢复过程中的进度显示
- 提供更详细的恢复日志
- 支持基于SCN的精确增量恢复
在实际恢复操作中,需要根据业务需求和系统资源选择合适的增量备份类型和恢复策略。同时,要确保备份链的完整性,严格按照恢复流程执行,恢复后进行充分的验证,确保数据的完整性和一致性。
通过合理的备份策略和恢复流程,可以提高增量恢复的成功率,减少恢复时间,保障数据库的高可用性和业务连续性。随着DM数据库版本的不断升级,增量恢复功能也在不断增强,提供了更高的恢复速度、更好的恢复验证和更丰富的恢复选项。
DBA应该持续关注DM数据库的新特性,不断优化备份和恢复策略,提高数据库的可用性和可靠性,确保在发生故障时能够快速、有效地进行恢复,保障业务的连续运行。
