Skip to content

DM 完全恢复

完全恢复的核心特点

  • 恢复到数据库的最新状态
  • 包含所有已提交的事务
  • 需要完整的备份链和归档日志
  • 适用于大多数故障恢复场景
  • 恢复后数据库可以直接使用

适用场景

  • 数据库实例崩溃
  • 数据文件损坏
  • 表空间丢失
  • 数据库完全丢失
  • 硬件故障导致的数据库不可用

完全恢复原理

1. 恢复的基本概念

1.1 备份链

完全恢复依赖于完整的备份链,备份链由以下组件组成:

  • 全量备份:数据库的完整副本,是备份链的基础
  • 增量备份:自上次备份以来发生变化的数据
  • 归档日志:记录数据库所有变更操作的日志文件

备份链的典型结构:

全量备份 → 增量备份1 → 增量备份2 → ... → 增量备份n → 归档日志

1.2 恢复点

恢复点是指数据库恢复到的目标状态,对于完全恢复,恢复点是数据库的最新状态,即故障发生前的状态。

1.3 检查点

检查点是数据库定期生成的一致性状态标记,记录了当前数据库的状态信息,包括:

  • 数据文件的最新LSN
  • 日志文件的最新LSN
  • 事务的状态信息

检查点用于加速恢复过程,减少恢复时需要处理的日志量。

2. 完全恢复的实现机制

完全恢复的实现包括以下关键步骤:

  1. 数据文件恢复:从全量备份和增量备份中恢复数据文件
  2. 重做阶段(REDO):应用归档日志中的重做记录,将数据库恢复到故障前的最新状态
  3. 回滚阶段(UNDO):回滚未提交的事务,确保数据库的一致性
  4. 更新数据库模式:更新数据库的魔术值(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.ini

2. 执行完全恢复

2.1 基本恢复流程

完全恢复的基本流程包括:

  1. 执行全量恢复
  2. 执行增量恢复(如果有)
  3. 应用归档日志
  4. 更新数据库模式

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

3.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. 实例崩溃恢复

故障现象

  • 数据库实例突然崩溃
  • 会话断开连接
  • 应用无法访问数据库

恢复步骤

  1. 确认实例状态
  2. 执行完全恢复
  3. 启动实例
  4. 验证恢复结果

恢复命令

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. 数据文件损坏恢复

故障现象

  • 访问表时报错"数据文件损坏"
  • 数据库日志中出现数据文件错误
  • 实例崩溃无法启动

恢复步骤

  1. 确定损坏的数据文件
  2. 执行完全恢复
  3. 启动实例
  4. 验证恢复结果

恢复命令

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. 数据库完全丢失恢复

故障现象

  • 数据库文件被删除
  • 存储设备损坏
  • 数据库目录为空

恢复步骤

  1. 重新创建数据库目录
  2. 复制配置文件
  3. 执行完全恢复
  4. 启动实例
  5. 验证恢复结果

恢复命令

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: 找不到备份集的可能原因:

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

解决方案

  1. 检查备份集路径是否正确
  2. 确认备份集是否存在
  3. 检查备份集的权限
  4. 重新指定正确的备份集路径

Q2: 恢复时提示归档日志缺失怎么办?

A2: 归档日志缺失的可能原因:

  • 归档日志被删除
  • 归档日志损坏
  • 归档日志路径错误

解决方案

  1. 检查归档日志路径是否正确
  2. 检查归档日志是否完整
  3. 如果归档日志确实缺失,可以考虑:
    • 恢复到归档日志可用的最近时间点
    • 从备份中恢复归档日志
    • 接受部分数据丢失,执行不完全恢复

Q3: 恢复后数据库无法启动怎么办?

A3: 数据库无法启动的可能原因:

  • 恢复过程中出现错误
  • 配置文件错误
  • 数据文件损坏
  • 内存不足

解决方案

  1. 查看数据库启动日志,定位具体错误
  2. 检查恢复过程中的输出信息
  3. 验证数据文件的完整性
  4. 检查配置文件参数
  5. 调整系统资源配置

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

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

  • 备份集过大
  • 归档日志过多
  • 存储设备性能差
  • 恢复并行度设置不合理

解决方案

  1. 增加恢复并行度
  2. 使用更快的存储设备
  3. 优化恢复参数
  4. 合理组织备份集,减少备份集大小
  5. 考虑使用增量备份减少恢复时间

Q5: 恢复后数据不一致怎么办?

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

  • 备份集损坏
  • 归档日志不完整
  • 恢复过程中出现错误
  • 数据库存在逻辑错误

解决方案

  1. 执行数据库一致性检查
  2. 验证备份集的完整性
  3. 检查归档日志的完整性
  4. 重新执行恢复操作
  5. 如问题严重,考虑从最近的有效备份恢复

Q6: 如何恢复到不同的服务器?

A6: 异机恢复的步骤:

  1. 在目标服务器上安装相同版本的DM数据库
  2. 创建必要的目录结构
  3. 复制备份集和归档日志到目标服务器
  4. 执行完全恢复
  5. 修改配置文件中的路径和参数
  6. 启动数据库实例

恢复命令

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 7DM 8
恢复并行度最高支持4最高支持128
恢复速度一般优化,恢复速度提升50%以上
恢复验证基本验证增强验证,自动检查恢复完整性
并行恢复支持有限全面支持,可配置多个并行度选项
恢复算法传统算法优化的恢复算法,减少IO操作
增量恢复支持增强支持,优化增量恢复逻辑
归档日志应用顺序应用优化的日志应用算法,提升应用速度

DM 8.1 新特性

  • 增强的并行恢复功能,支持更多并行度选项
  • 优化的恢复算法,恢复速度提升30%
  • 支持恢复过程中的进度显示
  • 增强的恢复验证功能,自动检查数据一致性
  • 支持恢复到只读模式进行验证
  • 提供更详细的恢复日志

在实际恢复操作中,需要遵循以下原则:

  • 制定详细的恢复计划
  • 确保备份集和归档日志的完整性
  • 严格按照恢复流程执行
  • 恢复后进行充分的验证
  • 记录恢复过程,总结经验

通过合理的备份策略和恢复流程,可以提高恢复操作的成功率,确保在发生故障时能够快速、有效地进行恢复,保障数据库的安全和业务的连续运行。

随着DM数据库版本的不断升级,完全恢复功能也在不断增强,提供了更高的恢复速度、更好的恢复验证和更丰富的恢复选项。DBA应该持续关注DM数据库的新特性,不断优化恢复策略和流程,提高数据库的可用性和可靠性。