Skip to content

DM 增量恢复

增量恢复的核心特点

  • 只恢复变化的数据,减少恢复时间
  • 结合全量备份使用,形成完整恢复链
  • 支持累积增量恢复和差异增量恢复
  • 减少存储空间占用
  • 提高恢复效率

适用场景

  • 大规模数据库,全量恢复时间长
  • 对恢复时间要求较高的场景
  • 存储资源有限的环境
  • 需要频繁备份和恢复的测试环境

增量恢复原理

1. 增量恢复的基本概念

1.1 增量备份类型

DM数据库支持两种增量备份类型,对应的增量恢复方式也不同:

1.1.1 累积增量备份

累积增量备份只备份自上次全量备份以来发生变化的数据,恢复时只需要最新的累积增量备份:

全量备份 → 累积增量备份1 → 累积增量备份2 → 累积增量备份3

恢复流程:

全量恢复 → 应用最新累积增量备份 → 应用归档日志
1.1.2 差异增量备份

差异增量备份只备份自上次备份(可以是全量或增量)以来发生变化的数据,恢复时需要所有中间增量备份:

全量备份 → 差异增量备份1 → 差异增量备份2 → 差异增量备份3

恢复流程:

全量恢复 → 应用差异增量备份1 → 应用差异增量备份2 → 应用差异增量备份3 → 应用归档日志

1.2 增量恢复的实现机制

增量恢复的实现包括以下关键步骤:

  1. 全量恢复:首先从全量备份中恢复数据文件的基础版本
  2. 增量恢复:然后应用增量备份,恢复自全量备份以来发生变化的数据块
  3. 日志应用:最后应用归档日志,恢复到最新状态或指定时间点
  4. 更新数据库模式:更新数据库的魔术值(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.ini

2. 执行累积增量恢复

2.1 基本恢复流程

累积增量恢复的基本流程:

  1. 执行全量恢复
  2. 执行最新累积增量恢复
  3. 应用归档日志
  4. 更新数据库模式

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 基本恢复流程

差异增量恢复的基本流程:

  1. 执行全量恢复
  2. 依次执行所有差异增量恢复(按顺序)
  3. 应用归档日志
  4. 更新数据库模式

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.ini

5.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: 找不到基准备份的可能原因:

  • 基准备份路径错误
  • 基准备份被删除或移动
  • 备份集损坏
  • 权限不足,无法访问备份集

解决方案

  1. 检查基准备份路径是否正确
  2. 确认基准备份是否存在
  3. 检查备份集的权限
  4. 重新指定正确的基准备份路径
  5. 如果基准备份损坏,使用更早的备份重新恢复

Q2: 增量恢复时提示备份集不匹配怎么办?

A2: 备份集不匹配的可能原因:

  • 增量备份与全量备份不属于同一个备份链
  • 备份集损坏
  • 备份类型不匹配(累积增量 vs 差异增量)
  • 数据库版本不兼容

解决方案

  1. 确认增量备份与全量备份属于同一个备份链
  2. 检查备份集的完整性
  3. 确认备份类型一致
  4. 确认数据库版本兼容
  5. 重新创建备份链

Q3: 增量恢复后数据不一致怎么办?

A3: 数据不一致的可能原因:

  • 备份链不完整
  • 归档日志缺失
  • 恢复顺序错误
  • 备份集损坏

解决方案

  1. 检查备份链的完整性
  2. 验证归档日志的完整性
  3. 确认恢复顺序正确
  4. 重新执行恢复操作
  5. 执行数据库一致性检查

Q4: 增量恢复速度太慢怎么办?

A4: 增量恢复速度慢的可能原因:

  • 备份集过大
  • 归档日志过多
  • 存储设备性能差
  • 恢复并行度设置不合理
  • 增量备份包含大量变化数据

解决方案

  1. 增加恢复并行度
  2. 使用更快的存储设备
  3. 优化恢复参数
  4. 增加全量备份频率,减少增量备份的数据量
  5. 考虑使用累积增量备份替代差异增量备份

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 7DM 8
增量恢复类型仅支持累积增量恢复支持累积增量恢复和差异增量恢复
恢复并行度最高支持4最高支持128
恢复速度一般优化,恢复速度提升50%以上
恢复验证基本验证增强验证,自动检查恢复完整性
并行恢复支持有限全面支持,可配置多个并行度选项
增量恢复算法传统算法优化的增量恢复算法,减少IO操作
备份链管理基本管理增强的备份链管理,自动跟踪备份关系

DM 8.1 新特性

  • 增强的增量恢复算法,恢复速度提升30%
  • 支持增量恢复的断点续传
  • 优化的并行恢复机制,支持更多并行度选项
  • 增强的恢复验证功能,自动检查数据一致性
  • 支持恢复过程中的进度显示
  • 提供更详细的恢复日志
  • 支持基于SCN的精确增量恢复

在实际恢复操作中,需要根据业务需求和系统资源选择合适的增量备份类型和恢复策略。同时,要确保备份链的完整性,严格按照恢复流程执行,恢复后进行充分的验证,确保数据的完整性和一致性。

通过合理的备份策略和恢复流程,可以提高增量恢复的成功率,减少恢复时间,保障数据库的高可用性和业务连续性。随着DM数据库版本的不断升级,增量恢复功能也在不断增强,提供了更高的恢复速度、更好的恢复验证和更丰富的恢复选项。

DBA应该持续关注DM数据库的新特性,不断优化备份和恢复策略,提高数据库的可用性和可靠性,确保在发生故障时能够快速、有效地进行恢复,保障业务的连续运行。