外观
DM 完全恢复
完全恢复的核心特点:
- 恢复到数据库的最新状态
- 包含所有已提交的事务
- 需要完整的备份链和归档日志
- 适用于大多数故障恢复场景
- 恢复后数据库可以直接使用
适用场景:
- 数据库实例崩溃
- 数据文件损坏
- 表空间丢失
- 数据库完全丢失
- 硬件故障导致的数据库不可用
完全恢复原理
1. 恢复的基本概念
1.1 备份链
完全恢复依赖于完整的备份链,备份链由以下组件组成:
- 全量备份:数据库的完整副本,是备份链的基础
- 增量备份:自上次备份以来发生变化的数据
- 归档日志:记录数据库所有变更操作的日志文件
备份链的典型结构:
全量备份 → 增量备份1 → 增量备份2 → ... → 增量备份n → 归档日志1.2 恢复点
恢复点是指数据库恢复到的目标状态,对于完全恢复,恢复点是数据库的最新状态,即故障发生前的状态。
1.3 检查点
检查点是数据库定期生成的一致性状态标记,记录了当前数据库的状态信息,包括:
- 数据文件的最新LSN
- 日志文件的最新LSN
- 事务的状态信息
检查点用于加速恢复过程,减少恢复时需要处理的日志量。
2. 完全恢复的实现机制
完全恢复的实现包括以下关键步骤:
- 数据文件恢复:从全量备份和增量备份中恢复数据文件
- 重做阶段(REDO):应用归档日志中的重做记录,将数据库恢复到故障前的最新状态
- 回滚阶段(UNDO):回滚未提交的事务,确保数据库的一致性
- 更新数据库模式:更新数据库的魔术值(DB_MAGIC),确保数据库可以正常启动
3. 恢复过程中的关键技术
3.1 LSN(日志序列号)
LSN是日志记录的唯一标识符,用于确定日志记录的顺序和数据块的修改顺序。在恢复过程中,LSN用于:
- 确定数据块的最新状态
- 确定需要应用的日志范围
- 确保日志应用的顺序性
3.2 数据块恢复
数据块恢复是将备份中的数据块恢复到数据文件中的过程,包括:
- 从全量备份中恢复基础数据块
- 从增量备份中恢复变化的数据块
- 验证数据块的完整性
3.3 日志应用
日志应用是将归档日志中的变更记录应用到数据库中的过程,包括:
- 读取归档日志文件
- 解析日志记录
- 应用重做记录到数据块
- 维护LSN信息
3.4 事务一致性
恢复过程中需要确保事务的一致性,包括:
- 重做已提交的事务
- 回滚未提交的事务
- 维护事务的ACID属性
完全恢复前提条件
在执行完全恢复之前,需要确保满足以下前提条件:
1. 备份条件
- 有可用的全量备份:全量备份是完全恢复的基础
- 有完整的增量备份链:自全量备份以来的所有增量备份
- 有完整的归档日志:自最后一次增量备份以来的所有归档日志
- 备份集完整可用:所有备份集都经过验证,确保完整性
2. 环境条件
- 数据库实例处于关闭状态:执行完全恢复前需要关闭数据库实例
- 有足够的存储空间:目标数据库目录有足够的空间存储恢复后的数据文件
- 数据库软件版本兼容:恢复时使用的数据库软件版本应与备份时的版本兼容
- 相同的数据库配置:恢复时的数据库配置应与备份时保持一致
3. 权限条件
- 执行恢复的用户具有足够的权限:需要SYSDBA或DBA权限
- 备份文件具有可读权限:恢复过程中需要读取备份文件
- 目标目录具有可写权限:恢复过程中需要写入数据文件
完全恢复操作步骤
1. 准备工作
1.1 确认故障情况
在执行恢复操作前,需要确认故障的具体情况:
- 故障类型:实例崩溃、数据文件损坏、硬件故障等
- 影响范围:整个数据库、单个表空间、单个数据文件
- 故障时间:故障发生的具体时间
- 可用备份:确认可用的备份集和归档日志
1.2 备份当前状态
如果数据库还能部分访问,建议先备份当前状态:
sql
-- 备份当前控制文件
ALTER DATABASE BACKUP CONTROLFILE TO '/opt/dmdbms/backup/controlfile.bak';
-- 备份当前参数文件
BACKUP PARAMETERS TO '/opt/dmdbms/backup/params.bak';1.3 停止数据库实例
执行完全恢复前需要停止数据库实例:
shell
# 使用systemctl停止实例
systemctl stop DmServiceDMSERVER
# 或使用dmadmin命令
./dmadmin stop instance /opt/dmdbms/data/DAMENG/dm.ini2. 执行完全恢复
2.1 基本恢复流程
完全恢复的基本流程包括:
- 执行全量恢复
- 执行增量恢复(如果有)
- 应用归档日志
- 更新数据库模式
2.2 使用 dmrman 执行完全恢复
2.2.1 执行全量恢复
shell
# 启动dmrman
./dmrman
# 执行全量恢复
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_backup';2.2.2 执行增量恢复
shell
# 执行第一个增量恢复
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/incremental_backup_1';
# 执行第二个增量恢复(如果有)
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/incremental_backup_2';2.2.3 应用归档日志
shell
# 应用归档日志,恢复到最新状态
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/opt/dmdbms/arch';2.2.4 更新数据库模式
shell
# 更新数据库模式,生成新的DB_MAGIC
RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC;2.3 完整恢复示例
shell
#!/bin/bash
# 完全恢复脚本
# 配置参数
DM_HOME="/opt/dmdbms"
INSTANCE_INI="/opt/dmdbms/data/DAMENG/dm.ini"
BACKUP_DIR="/opt/dmdbms/backup"
ARCH_DIR="/opt/dmdbms/arch"
# 停止数据库实例
echo "停止数据库实例..."
$DM_HOME/bin/dmadmin stop instance $INSTANCE_INI
# 执行完全恢复
echo "执行完全恢复..."
$DM_HOME/bin/dmrman << EOF
# 执行全量恢复
RESTORE DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/full_backup';
# 执行增量恢复(如果有)
RECOVER DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/incremental_backup_1';
RECOVER DATABASE '$INSTANCE_INI' FROM BACKUPSET '$BACKUP_DIR/incremental_backup_2';
# 应用归档日志
RECOVER DATABASE '$INSTANCE_INI' WITH ARCHIVEDIR '$ARCH_DIR';
# 更新数据库模式
RECOVER DATABASE '$INSTANCE_INI' UPDATE DB_MAGIC;
EXIT;
EOF
# 启动数据库实例
echo "启动数据库实例..."
$DM_HOME/bin/dmadmin start instance $INSTANCE_INI
echo "完全恢复完成!"3. 恢复验证
3.1 启动数据库实例
shell
# 使用systemctl启动实例
systemctl start DmServiceDMSERVER
# 或使用dmadmin命令
./dmadmin start instance /opt/dmdbms/data/DAMENG/dm.ini3.2 验证数据库状态
sql
-- 查看实例状态
SELECT status$ FROM V$INSTANCE;
-- 查看数据库状态
SELECT status$ FROM V$DATABASE;
-- 查看表空间状态
SELECT name, status$ FROM V$TABLESPACE;
-- 查看数据文件状态
SELECT name, status$ FROM V$datafile;3.3 验证数据完整性
sql
-- 执行数据库一致性检查
CHECK DATABASE;
-- 验证关键表数据
SELECT COUNT(*) FROM important_table;
SELECT * FROM important_table WHERE id = 1;
-- 验证最近的事务
SELECT * FROM v$trx WHERE start_time > SYSDATE - 1/24 ORDER BY start_time DESC;3.4 验证应用可用性
- 连接应用系统,验证应用是否能正常访问数据库
- 执行关键业务流程测试
- 检查应用日志,确认没有数据库相关错误
不同场景的完全恢复
1. 实例崩溃恢复
故障现象:
- 数据库实例突然崩溃
- 会话断开连接
- 应用无法访问数据库
恢复步骤:
- 确认实例状态
- 执行完全恢复
- 启动实例
- 验证恢复结果
恢复命令:
shell
./dmrman
RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/backup/full_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;2. 数据文件损坏恢复
故障现象:
- 访问表时报错"数据文件损坏"
- 数据库日志中出现数据文件错误
- 实例崩溃无法启动
恢复步骤:
- 确定损坏的数据文件
- 执行完全恢复
- 启动实例
- 验证恢复结果
恢复命令:
shell
./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/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;3. 数据库完全丢失恢复
故障现象:
- 数据库文件被删除
- 存储设备损坏
- 数据库目录为空
恢复步骤:
- 重新创建数据库目录
- 复制配置文件
- 执行完全恢复
- 启动实例
- 验证恢复结果
恢复命令:
shell
# 创建数据库目录
mkdir -p /opt/dmdbms/data/DAMENG
# 复制配置文件
cp /opt/dmdbms/backup/dm.ini /opt/dmdbms/data/DAMENG/
cp /opt/dmdbms/backup/dmarch.ini /opt/dmdbms/data/DAMENG/
# 执行恢复
./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/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;完全恢复最佳实践
1. 恢复前准备
1.1 制定恢复计划
在执行恢复操作前,制定详细的恢复计划,包括:
- 恢复步骤和顺序
- 使用的备份集和归档日志
- 预计恢复时间
- 验证方法
- 回滚计划
1.2 检查备份完整性
在执行恢复前,检查备份集的完整性:
shell
# 检查全量备份完整性
./dmrman CHECK BACKUPSET '/opt/dmdbms/backup/full_backup';
# 检查增量备份完整性
./dmrman CHECK BACKUPSET '/opt/dmdbms/backup/incremental_backup';1.3 准备恢复环境
- 确保恢复环境与生产环境一致
- 确保有足够的存储空间
- 确保备份文件可访问
- 关闭不必要的服务,释放系统资源
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' WITH ARCHIVEDIR '/opt/dmdbms/arch' PARALLEL 8;2.2 优化恢复参数
sql
-- 调整恢复缓冲区大小
ALTER SYSTEM SET RECOVER_BUF_SIZE = 64 SCOPE = SPFILE;
-- 调整恢复并行度
ALTER SYSTEM SET RECOVER_PARALLEL = 8 SCOPE = SPFILE;2.3 合理组织归档日志
- 确保归档日志连续,没有缺失
- 将归档日志存储在高速存储设备上
- 定期清理过期的归档日志
3. 恢复后操作
3.1 立即执行全量备份
恢复完成后,立即执行全量备份,确保有最新的可用备份:
shell
./dmrman
BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL TO BACKUPSET '/opt/dmdbms/backup/after_recovery_backup' COMPRESSED;3.2 检查数据库性能
- 查看数据库性能指标
- 检查SQL执行计划
- 监控系统资源使用情况
3.3 检查日志文件
- 查看数据库告警日志
- 检查应用日志
- 确认没有恢复相关的错误
3.4 记录恢复过程
记录恢复过程的详细信息,包括:
- 故障时间和原因
- 恢复步骤和命令
- 恢复时间
- 恢复结果
- 遇到的问题和解决方案
常见问题(FAQ)
Q1: 恢复时提示找不到备份集怎么办?
A1: 找不到备份集的可能原因:
- 备份集路径错误
- 备份集被删除或移动
- 权限不足,无法访问备份集
解决方案:
- 检查备份集路径是否正确
- 确认备份集是否存在
- 检查备份集的权限
- 重新指定正确的备份集路径
Q2: 恢复时提示归档日志缺失怎么办?
A2: 归档日志缺失的可能原因:
- 归档日志被删除
- 归档日志损坏
- 归档日志路径错误
解决方案:
- 检查归档日志路径是否正确
- 检查归档日志是否完整
- 如果归档日志确实缺失,可以考虑:
- 恢复到归档日志可用的最近时间点
- 从备份中恢复归档日志
- 接受部分数据丢失,执行不完全恢复
Q3: 恢复后数据库无法启动怎么办?
A3: 数据库无法启动的可能原因:
- 恢复过程中出现错误
- 配置文件错误
- 数据文件损坏
- 内存不足
解决方案:
- 查看数据库启动日志,定位具体错误
- 检查恢复过程中的输出信息
- 验证数据文件的完整性
- 检查配置文件参数
- 调整系统资源配置
Q4: 恢复速度太慢怎么办?
A4: 恢复速度慢的可能原因:
- 备份集过大
- 归档日志过多
- 存储设备性能差
- 恢复并行度设置不合理
解决方案:
- 增加恢复并行度
- 使用更快的存储设备
- 优化恢复参数
- 合理组织备份集,减少备份集大小
- 考虑使用增量备份减少恢复时间
Q5: 恢复后数据不一致怎么办?
A5: 数据不一致的可能原因:
- 备份集损坏
- 归档日志不完整
- 恢复过程中出现错误
- 数据库存在逻辑错误
解决方案:
- 执行数据库一致性检查
- 验证备份集的完整性
- 检查归档日志的完整性
- 重新执行恢复操作
- 如问题严重,考虑从最近的有效备份恢复
Q6: 如何恢复到不同的服务器?
A6: 异机恢复的步骤:
- 在目标服务器上安装相同版本的DM数据库
- 创建必要的目录结构
- 复制备份集和归档日志到目标服务器
- 执行完全恢复
- 修改配置文件中的路径和参数
- 启动数据库实例
恢复命令:
shell
./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/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;不同版本的差异
DM 7 vs DM 8
| 特性 | DM 7 | DM 8 |
|---|---|---|
| 恢复并行度 | 最高支持4 | 最高支持128 |
| 恢复速度 | 一般 | 优化,恢复速度提升50%以上 |
| 恢复验证 | 基本验证 | 增强验证,自动检查恢复完整性 |
| 并行恢复 | 支持有限 | 全面支持,可配置多个并行度选项 |
| 恢复算法 | 传统算法 | 优化的恢复算法,减少IO操作 |
| 增量恢复 | 支持 | 增强支持,优化增量恢复逻辑 |
| 归档日志应用 | 顺序应用 | 优化的日志应用算法,提升应用速度 |
DM 8.1 新特性
- 增强的并行恢复功能,支持更多并行度选项
- 优化的恢复算法,恢复速度提升30%
- 支持恢复过程中的进度显示
- 增强的恢复验证功能,自动检查数据一致性
- 支持恢复到只读模式进行验证
- 提供更详细的恢复日志
在实际恢复操作中,需要遵循以下原则:
- 制定详细的恢复计划
- 确保备份集和归档日志的完整性
- 严格按照恢复流程执行
- 恢复后进行充分的验证
- 记录恢复过程,总结经验
通过合理的备份策略和恢复流程,可以提高恢复操作的成功率,确保在发生故障时能够快速、有效地进行恢复,保障数据库的安全和业务的连续运行。
随着DM数据库版本的不断升级,完全恢复功能也在不断增强,提供了更高的恢复速度、更好的恢复验证和更丰富的恢复选项。DBA应该持续关注DM数据库的新特性,不断优化恢复策略和流程,提高数据库的可用性和可靠性。
