本文档详细介绍DM数据库归档丢失情况下的恢复处理方法,包括归档丢失的概念、影响、恢复策略、检测方法、恢复操作等内容,风哥教程参考DM官方文档《DM8备份与还原》手册,适合DBA人员进行归档丢失的应急处理。
Part01-基础概念与理论知识
1.1 DM数据库归档丢失概念
DM数据库归档丢失是指数据库的归档日志文件由于各种原因(如存储故障、人为删除、磁盘空间不足等)导致丢失或损坏,无法用于数据库恢复。归档日志是数据库恢复的重要组成部分,归档丢失会影响数据库的可恢复性。
DM数据库归档丢失的类型:
- 部分归档丢失:丢失部分归档日志文件
- 全部归档丢失:丢失所有归档日志文件
- 归档损坏:归档日志文件损坏无法使用
1.2 DM数据库归档丢失影响
DM数据库归档丢失的影响:
- 恢复能力下降:无法进行完全恢复
- 数据丢失风险:可能导致数据丢失
- 数据库一致性:可能影响数据库一致性
- 业务影响:可能导致业务中断
1.3 DM数据库归档丢失恢复策略
DM数据库归档丢失的恢复策略:
- 部分归档丢失:使用不完全恢复到最近的可用时间点
- 全部归档丢失:使用最近的全库备份进行恢复
- 归档损坏:从备份中恢复归档日志或使用不完全恢复
风哥提示:归档日志是数据库恢复的重要组成部分,DBA人员必须重视归档日志的管理和保护,防止归档丢失。
Part02-生产环境规划与建议
2.1 DM数据库归档日志保护
生产环境DM数据库归档日志保护建议:
# DM数据库归档日志保护措施
#
# 多路归档
– 配置多个归档目标
– 分布在不同的存储设备上
– 确保至少有2个归档目标
#
# 存储保护
– 使用RAID存储
– 定期检查存储健康状态
– 监控存储空间使用情况
#
# 权限控制
– 限制归档目录权限
– 防止误删除
– 定期备份归档日志
#
# 监控告警
– 监控归档空间使用
– 监控归档目标状态 风哥提示:
– 设置归档异常告警
#
# 多路归档
– 配置多个归档目标
– 分布在不同的存储设备上
– 确保至少有2个归档目标
#
# 存储保护
– 使用RAID存储
– 定期检查存储健康状态
– 监控存储空间使用情况
#
# 权限控制
– 限制归档目录权限
– 防止误删除
– 定期备份归档日志
#
# 监控告警
– 监控归档空间使用
– 监控归档目标状态 风哥提示:
– 设置归档异常告警
2.2 DM数据库归档日志备份
DM数据库归档日志备份策略:
- 备份频率:每小时备份一次归档日志
- 备份方式:使用dexp或操作系统命令
- 备份存储:备份到本地和远程存储
- 备份保留:保留7-14天的归档备份
2.3 DM数据库归档日志监控
DM数据库归档日志监控建议:
归档日志监控要点:
- 空间监控:监控归档目录空间使用情况
- 状态监控:监控归档目标状态
- 传输监控:监控归档日志传输状态
- 告警设置:设置空间不足和传输失败告警
Part03-生产环境项目实施方案
3.1 DM数据库归档丢失检测
3.1.1 检测归档日志状态
# 检查归档模式
SQL> select arch_mode from v$database;
行号 ARCH_MODE
———- ———
1 Y 学习交流加群风哥微信: itpux-com
# 检查归档配置
SQL> select arch_name, arch_type, arch_dest, status from v$dm_arch_ini;
行号 ARCH_NAME ARCH_TYPE ARCH_DEST STATUS
———- ———- ——— ——————– ——-
1 ARCHIVE_LOCAL1 LOCAL /dm/arch VALID
2 ARCHIVE_REMOTE1 REMOTE 192.168.1.20:/dm/arch VALID
# 检查归档日志文件
SQL> select sequence# from v
$archived_log order by sequence# desc;
行号 SEQUENCE#
———- ———-
1 100
2 99
3 98
# 检查归档日志连续性
SQL> select min(sequence#) as min_seq, max(sequence
#) as max_seq,
count(*) as count_seq
from v$archived_log;
行号 MIN_SEQ MAX_SEQ COUNT_SEQ
———- ———- ———- ———-
1 80 100 21
# 检查是否有缺失的归档日志
SQL> select a.sequence# + 1 as missing_seq
from v$archived_log a
where not exists (
select 1 from v$archived_log b
where b.sequence# = a.sequence
# + 1
) and a.sequence# < (select max(sequence #) from v $archived_log);
SQL> select arch_mode from v$database;
行号 ARCH_MODE
———- ———
1 Y 学习交流加群风哥微信: itpux-com
# 检查归档配置
SQL> select arch_name, arch_type, arch_dest, status from v$dm_arch_ini;
行号 ARCH_NAME ARCH_TYPE ARCH_DEST STATUS
———- ———- ——— ——————– ——-
1 ARCHIVE_LOCAL1 LOCAL /dm/arch VALID
2 ARCHIVE_REMOTE1 REMOTE 192.168.1.20:/dm/arch VALID
# 检查归档日志文件
SQL> select sequence# from v
$archived_log order by sequence# desc;
行号 SEQUENCE#
———- ———-
1 100
2 99
3 98
# 检查归档日志连续性
SQL> select min(sequence#) as min_seq, max(sequence
#) as max_seq,
count(*) as count_seq
from v$archived_log;
行号 MIN_SEQ MAX_SEQ COUNT_SEQ
———- ———- ———- ———-
1 80 100 21
# 检查是否有缺失的归档日志
SQL> select a.sequence# + 1 as missing_seq
from v$archived_log a
where not exists (
select 1 from v$archived_log b
where b.sequence# = a.sequence
# + 1
) and a.sequence# < (select max(sequence #) from v $archived_log);
3.1.2 检测归档日志文件
# 检查归档目录
$ ls -la /dm/arch/
total 1024000
drwxr-xr-x 2 dmdba dinstall 4096 Apr 9 10:00 .
drwxr-xr-x 4 dmdba dinstall 4096 Apr 1 00:00 ..
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 08:00 ARCHIVE_LOCAL1_20250409_080000.log
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 09:00 ARCHIVE_LOCAL1_20250409_090000.log
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 10:00 ARCHIVE_LOCAL1_20250409_100000.log
# 检查归档文件大小
$ du -h /dm/arch/* 学习交流加群风哥QQ113257174
100M /dm/arch/ARCHIVE_LOCAL1_20250409_080000.log
100M /dm/arch/ARCHIVE_LOCAL1_20250409_090000.log
100M /dm/arch/ARCHIVE_LOCAL1_20250409_100000.log
# 检查归档文件连续性
$ ls -la /dm/arch/ | sort
$ ls -la /dm/arch/
total 1024000
drwxr-xr-x 2 dmdba dinstall 4096 Apr 9 10:00 .
drwxr-xr-x 4 dmdba dinstall 4096 Apr 1 00:00 ..
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 08:00 ARCHIVE_LOCAL1_20250409_080000.log
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 09:00 ARCHIVE_LOCAL1_20250409_090000.log
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 10:00 ARCHIVE_LOCAL1_20250409_100000.log
# 检查归档文件大小
$ du -h /dm/arch/* 学习交流加群风哥QQ113257174
100M /dm/arch/ARCHIVE_LOCAL1_20250409_080000.log
100M /dm/arch/ARCHIVE_LOCAL1_20250409_090000.log
100M /dm/arch/ARCHIVE_LOCAL1_20250409_100000.log
# 检查归档文件连续性
$ ls -la /dm/arch/ | sort
3.2 DM数据库归档丢失恢复
3.2.1 部分归档丢失恢复
# 场景:丢失了归档日志序列95-98
# 1. 关闭数据库
SQL> shutdown immediate;
# 2. 启动到mount状态
SQL> startup mount;
# 3. 执行不完全恢复到最近的可用归档日志
SQL> recover database until sequence 94;
# 4. 打开数据库(需要resetlogs)
SQL> alter database open resetlogs;
# 5. 验证恢复结果
SQL> select current_scn from v$database;
行号 CURRENT_SCN
———- ————
1 987654
# 6. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_archive_loss.bak’;
# 1. 关闭数据库
SQL> shutdown immediate;
# 2. 启动到mount状态
SQL> startup mount;
# 3. 执行不完全恢复到最近的可用归档日志
SQL> recover database until sequence 94;
# 4. 打开数据库(需要resetlogs)
SQL> alter database open resetlogs;
# 5. 验证恢复结果
SQL> select current_scn from v$database;
行号 CURRENT_SCN
———- ————
1 987654
# 6. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_archive_loss.bak’;
3.2.2 全部归档丢失恢复
# 场景:丢失了所有归档日志
# 1. 关闭数据库
SQL> shutdown immediate;
# 2. 使用最近的全库备份恢复
$ dmrman
# 3. 恢复数据库
RMAN> restore database ‘/dm/fgdata/fgedudb/dm.ini’ \
from backupset ‘/dm/backup/full/backup_full_20250408.bak’;
# 4. 打开数据库(需要resetlogs)
RMAN> alter database ‘/dm/fgdata/fgedudb/dm.ini’ open resetlogs;
# 5. 验证恢复结果
SQL> select open_mode from v$database; 更多视频教程www.fgedu.net.cn
行号 OPEN_MODE
———- ——————–
1 READ WRITE
# 6. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_full_recovery.bak’;
# 1. 关闭数据库
SQL> shutdown immediate;
# 2. 使用最近的全库备份恢复
$ dmrman
# 3. 恢复数据库
RMAN> restore database ‘/dm/fgdata/fgedudb/dm.ini’ \
from backupset ‘/dm/backup/full/backup_full_20250408.bak’;
# 4. 打开数据库(需要resetlogs)
RMAN> alter database ‘/dm/fgdata/fgedudb/dm.ini’ open resetlogs;
# 5. 验证恢复结果
SQL> select open_mode from v$database; 更多视频教程www.fgedu.net.cn
行号 OPEN_MODE
———- ——————–
1 READ WRITE
# 6. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_full_recovery.bak’;
3.3 DM数据库恢复验证
3.3.1 恢复后验证
# 验证数据库状态
SQL> select open_mode, database_status from v$database;
行号 OPEN_MODE DATABASE_STATUS
———- ——————– —————–
1 READ WRITE ACTIVE
# 验证业务数据
SQL> select count(*) from fgedu.employee;
行号 COUNT(*)
———- ———-
1 1000
# 验证归档配置
SQL> select arch_name, status from v$dm_arch_ini;
行号 ARCH_NAME STATUS
———- ———- ——-
1 ARCHIVE_LOCAL1 VALID
2 ARCHIVE_REMOTE1 VALID
# 验证归档日志生成
SQL> alter system switch logfile;
# 检查新的归档日志
$ ls -la /dm/arch/ | tail -1
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 11:00 ARCHIVE_LOCAL1_20250409_110000.log
SQL> select open_mode, database_status from v$database;
行号 OPEN_MODE DATABASE_STATUS
———- ——————– —————–
1 READ WRITE ACTIVE
# 验证业务数据
SQL> select count(*) from fgedu.employee;
行号 COUNT(*)
———- ———-
1 1000
# 验证归档配置
SQL> select arch_name, status from v$dm_arch_ini;
行号 ARCH_NAME STATUS
———- ———- ——-
1 ARCHIVE_LOCAL1 VALID
2 ARCHIVE_REMOTE1 VALID
# 验证归档日志生成
SQL> alter system switch logfile;
# 检查新的归档日志
$ ls -la /dm/arch/ | tail -1
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 11:00 ARCHIVE_LOCAL1_20250409_110000.log
Part04-生产案例与实战讲解
4.1 DM数据库部分归档丢失恢复
以下是一个部分归档丢失的恢复案例:
#
# 场景描述
由于存储故障,丢失了归档日志序列100-105,需要恢复数据库
#
# 恢复步骤
# 1. 确认丢失的归档日志
$ ls -la /dm/arch/ | grep “ARCHIVE_LOCAL1_20250409” 更多学习教程公众号风哥教程itpux_com
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 08:00 ARCHIVE_LOCAL1_20250409_080000.log # 序列98
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 09:00 ARCHIVE_LOCAL1_20250409_090000.log # 序列99
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 11:00 ARCHIVE_LOCAL1_20250409_110000.log # 序列106
# 2. 关闭数据库
SQL> shutdown immediate;
# 3. 启动到mount状态
SQL> startup mount;
# 4. 执行不完全恢复到序列99
SQL> recover database until sequence 99;
# 5. 打开数据库
SQL> alter database open resetlogs;
# 6. 验证恢复结果
SQL> select count(*) from fgedu.employee;
行号 COUNT(*)
———- ———-
1 1000
# 7. 重新配置归档
SQL> alter system set ‘ARCHIVE_LOCAL1=/dm/arch’ scope=spfile;
SQL> alter system set ‘ARCHIVE_REMOTE1=192.168.1.20:/dm/arch’ scope=spfile;
# 8. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_recovery.bak’;
# 场景描述
由于存储故障,丢失了归档日志序列100-105,需要恢复数据库
#
# 恢复步骤
# 1. 确认丢失的归档日志
$ ls -la /dm/arch/ | grep “ARCHIVE_LOCAL1_20250409” 更多学习教程公众号风哥教程itpux_com
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 08:00 ARCHIVE_LOCAL1_20250409_080000.log # 序列98
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 09:00 ARCHIVE_LOCAL1_20250409_090000.log # 序列99
-rw-r–r– 1 dmdba dinstall 104857600 Apr 9 11:00 ARCHIVE_LOCAL1_20250409_110000.log # 序列106
# 2. 关闭数据库
SQL> shutdown immediate;
# 3. 启动到mount状态
SQL> startup mount;
# 4. 执行不完全恢复到序列99
SQL> recover database until sequence 99;
# 5. 打开数据库
SQL> alter database open resetlogs;
# 6. 验证恢复结果
SQL> select count(*) from fgedu.employee;
行号 COUNT(*)
———- ———-
1 1000
# 7. 重新配置归档
SQL> alter system set ‘ARCHIVE_LOCAL1=/dm/arch’ scope=spfile;
SQL> alter system set ‘ARCHIVE_REMOTE1=192.168.1.20:/dm/arch’ scope=spfile;
# 8. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_recovery.bak’;
4.2 DM数据库全部归档丢失恢复
以下是一个全部归档丢失的恢复案例:
#
# 场景描述
由于磁盘故障,所有归档日志丢失,需要使用最近的全库备份恢复
#
# 恢复步骤
# 1. 确认归档丢失
$ ls -la /dm/arch/ from DB视频:www.itpux.com
ls: cannot access /dm/arch/: No such file or directory
# 2. 检查最近的全库备份
$ ls -la /dm/backup/full/
-rw-r–r– 1 dmdba dinstall 512000000 Apr 8 02:00 backup_full_20250408.bak
# 3. 关闭数据库
SQL> shutdown immediate;
# 4. 使用DMRMAN恢复
$ dmrman
# 5. 恢复数据库
RMAN> restore database ‘/dm/fgdata/fgedudb/dm.ini’ \
from backupset ‘/dm/backup/full/backup_full_20250408.bak’;
# 6. 打开数据库
RMAN> alter database ‘/dm/fgdata/fgedudb/dm.ini’ open resetlogs;
# 7. 验证恢复结果
SQL> select open_mode from v$database;
行号 OPEN_MODE
———- ——————–
1 READ WRITE
# 8. 重建归档目录
$ mkdir -p /dm/arch
$ chown dmdba:dinstall /dm/arch
# 9. 重新配置归档
SQL> alter system set ‘ARCHIVE_LOCAL1=/dm/arch’ scope=spfile;
SQL> alter system set ‘ARCHIVE_REMOTE1=192.168.1.20:/dm/arch’ scope=spfile;
# 10. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_full_recovery.bak’;
# 场景描述
由于磁盘故障,所有归档日志丢失,需要使用最近的全库备份恢复
#
# 恢复步骤
# 1. 确认归档丢失
$ ls -la /dm/arch/ from DB视频:www.itpux.com
ls: cannot access /dm/arch/: No such file or directory
# 2. 检查最近的全库备份
$ ls -la /dm/backup/full/
-rw-r–r– 1 dmdba dinstall 512000000 Apr 8 02:00 backup_full_20250408.bak
# 3. 关闭数据库
SQL> shutdown immediate;
# 4. 使用DMRMAN恢复
$ dmrman
# 5. 恢复数据库
RMAN> restore database ‘/dm/fgdata/fgedudb/dm.ini’ \
from backupset ‘/dm/backup/full/backup_full_20250408.bak’;
# 6. 打开数据库
RMAN> alter database ‘/dm/fgdata/fgedudb/dm.ini’ open resetlogs;
# 7. 验证恢复结果
SQL> select open_mode from v$database;
行号 OPEN_MODE
———- ——————–
1 READ WRITE
# 8. 重建归档目录
$ mkdir -p /dm/arch
$ chown dmdba:dinstall /dm/arch
# 9. 重新配置归档
SQL> alter system set ‘ARCHIVE_LOCAL1=/dm/arch’ scope=spfile;
SQL> alter system set ‘ARCHIVE_REMOTE1=192.168.1.20:/dm/arch’ scope=spfile;
# 10. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_full_recovery.bak’;
4.3 DM数据库归档损坏恢复
以下是一个归档损坏的恢复案例:
#
# 场景描述
归档日志文件损坏,无法用于恢复,需要进行不完全恢复
#
# 恢复步骤
# 1. 确认归档损坏
$ dmrman
RMAN> check archivelog ‘/dm/arch/ARCHIVE_LOCAL1_20250409_100000.log’;
检查失败,归档日志损坏
# 2. 关闭数据库
SQL> shutdown immediate;
# 3. 启动到mount状态
SQL> startup mount;
# 4. 执行不完全恢复到损坏归档之前的时间点
SQL> recover database until time ‘2025-04-09 09:59:59’;
# 5. 打开数据库
SQL> alter database open resetlogs;
# 6. 验证恢复结果
SQL> select sysdate from dual;
行号 SYSDATE
———- ——————–
1 2025-04-09 09:59:59
# 7. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_corruption.bak’;
# 场景描述
归档日志文件损坏,无法用于恢复,需要进行不完全恢复
#
# 恢复步骤
# 1. 确认归档损坏
$ dmrman
RMAN> check archivelog ‘/dm/arch/ARCHIVE_LOCAL1_20250409_100000.log’;
检查失败,归档日志损坏
# 2. 关闭数据库
SQL> shutdown immediate;
# 3. 启动到mount状态
SQL> startup mount;
# 4. 执行不完全恢复到损坏归档之前的时间点
SQL> recover database until time ‘2025-04-09 09:59:59’;
# 5. 打开数据库
SQL> alter database open resetlogs;
# 6. 验证恢复结果
SQL> select sysdate from dual;
行号 SYSDATE
———- ——————–
1 2025-04-09 09:59:59
# 7. 重新备份数据库
SQL> backup database full to ‘/dm/backup/full/backup_after_corruption.bak’;
Part05-风哥经验总结与分享
5.1 DM数据库归档管理最佳实践
基于多年DM数据库运维经验,总结以下归档管理最佳实践:
- 多路归档:配置多个归档目标,提高归档可靠性
- 定期备份:每小时备份一次归档日志
- 空间监控:实时监控归档空间使用情况
- 存储保护:使用RAID存储,防止存储故障
- 权限控制:限制归档目录权限,防止误删除
- 定期清理:根据保留策略清理过期归档
生产环境建议:归档日志是数据库恢复的重要组成部分,建议配置至少2个归档目标,分布在不同的存储设备上,确保归档日志的安全。
5.2 DM数据库归档丢失常见问题
DM数据库归档丢失常见问题及解决方案:
#
# 问题1:归档空间不足
#
# 原因分析
– 归档日志生成速度超过清理速度
– 存储空间规划不足
– 归档清理策略不合理
#
# 解决方案
– 增加归档存储空间
– 优化归档清理策略
– 监控归档空间使用情况
#
# 问题2:归档日志传输失败
#
# 原因分析
– 网络连接问题
– 远程存储故障
– 权限配置错误
#
# 解决方案
– 检查网络连接
– 检查远程存储状态
– 验证权限配置
#
# 问题3:归档日志被误删除
#
# 原因分析
– 人为误操作
– 清理脚本错误
– 权限设置不当
#
# 解决方案
– 限制归档目录权限
– 完善清理脚本
– 实施归档备份策略
# 问题1:归档空间不足
#
# 原因分析
– 归档日志生成速度超过清理速度
– 存储空间规划不足
– 归档清理策略不合理
#
# 解决方案
– 增加归档存储空间
– 优化归档清理策略
– 监控归档空间使用情况
#
# 问题2:归档日志传输失败
#
# 原因分析
– 网络连接问题
– 远程存储故障
– 权限配置错误
#
# 解决方案
– 检查网络连接
– 检查远程存储状态
– 验证权限配置
#
# 问题3:归档日志被误删除
#
# 原因分析
– 人为误操作
– 清理脚本错误
– 权限设置不当
#
# 解决方案
– 限制归档目录权限
– 完善清理脚本
– 实施归档备份策略
5.3 DM数据库归档丢失预防措施
DM数据库归档丢失预防措施:
- 多路归档:配置多个归档目标,互为备份
- 定期备份:将归档日志备份到远程存储
- 监控告警:设置归档异常告警机制
- 权限控制:严格控制归档目录权限
- 存储冗余:使用RAID存储,提高存储可靠性
- 定期检查:定期检查归档日志状态
风哥提示:归档日志管理是数据库运维的重要组成部分,DBA人员必须重视归档日志的保护和管理,建立完善的归档管理机制,防止归档丢失导致的数据库恢复失败。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
