磁盘性能IOPS(四)-归档日志清理与备份恢复方案
归档日志清理与备份恢复方案
作为一台 Oracle 数据库服务器(实例名:CMIP),且
空间已使用 84%(3.2T/4.0T),我们必须制定一个 安全、可靠、可恢复的归档日志清理与备份恢复方案。
/oradata
🛑 重要前提:绝不允许“无备份删除归档日志”!
🔥 警告:
归档日志(Archived Redo Logs)是数据库恢复的关键!
删除前必须确认:已有有效备份(RMAN 或其他工具)不会影响未来恢复需求(如 PITR – 时间点恢复)
✅ 一、归档日志清理方案
🔹 步骤 1:确认当前归档日志状态
# 切换到 oracle 用户
su - oracle
export ORACLE_SID=CMIP
# 查看归档日志使用情况
rman target /
RMAN> list archivelog all completed before 'sysdate-7';
-- 查看7天前的所有归档日志(可删除候选)
RMAN> crosscheck archivelog all;
-- 检查归档日志文件是否存在(防止删除不存在的记录)
RMAN> delete expired archivelog all;
-- 删除 RMAN 记录中已丢失的归档日志(清理元数据)
🔹 步骤 2:确认已有备份(关键!)
-- 在 RMAN 中检查最近的备份
RMAN> list backup of archivelog all;
-- 查看最近一次完整备份
RMAN> list backup summary;
-- 确认是否有可用的全量备份
-- 必须满足:归档日志的删除范围不能早于“最旧的完整备份”时间
📌 删除原则:
只能删除 最后一次完整备份之前 的归档日志。
例如:
最近一次全备时间:2025-08-20可安全删除:
之前的归档日志(即 8月10日前的)
sysdate-10
🔹 步骤 3:执行归档日志删除(建议保留7-14天)
✅ 推荐命令(保留7天):
RMAN> delete archivelog until time 'sysdate-7';
-- 或按日期删除(更精确)
RMAN> delete archivelog until time "TO_DATE('2025-08-18 00:00:00', 'YYYY-MM-DD HH24:MI:SS')";
✅ 如果只想删除部分空间(如释放 200G):
-- 先估算删除多少天能释放空间
-- 假设每天归档 50G,则删除4天可释放 ~200G
RMAN> delete archivelog until time 'sysdate-4';
💡 RMAN 会自动从文件系统删除
文件,并更新控制文件。
.arc
🔹 步骤 4:手动清理(仅当 RMAN 失效时)
如果 RMAN 无法识别归档日志位置:
# 查看归档日志路径
sqlplus / as sysdba
SQL> show parameter log_archive_dest_1;
-- 默认路径类似:
-- /oradata/arch/CMIP_1_12345.arc
# 手动删除(谨慎!)
find /oradata/arch/ -name "*.arc" -mtime +7 -exec ls -lh {} ;
# 先预览(不要加 -delete)
# 确认无误后删除
find /oradata/arch/ -name "*.arc" -mtime +7 -exec rm -f {} ;
# 最后在 RMAN 中同步
RMAN> crosscheck archivelog all;
RMAN> delete expired archivelog all;
💾 二、备份恢复方案(RMAN 基础策略)
🔹 1. 备份策略建议(适合生产环境)
类型 | 频率 | 保留时间 | 存储位置 |
---|---|---|---|
全量备份 | 每周一次(周日) | 4 周 |
|
增量备份 | 每日一次(0级或1级) | 2 周 |
|
归档日志备份 | 每小时一次 | 14 天 |
|
⚠️ 备份目录应独立于
,建议使用另一块磁盘或网络存储。
/oradata
🔹 2. RMAN 备份脚本示例
✅ 全量备份脚本(
full_backup.rman
):
full_backup.rman
run {
allocate channel c1 type disk;
backup as compressed backupset database format '/backup/full/full_%d_%T_%s.bak';
backup archivelog all format '/backup/arch/arch_%d_%T_%s.bak' delete input;
release channel c1;
}
✅ 增量备份脚本(
incr_backup.rman
):
incr_backup.rman
run {
allocate channel c1 type disk;
backup as compressed backupset incremental level 1 database format '/backup/incr/incr_%d_%T_%s.bak';
backup archivelog all format '/backup/arch/arch_%d_%T_%s.bak' delete input;
release channel c1;
}
✅ 定期清理旧备份(保留14天):
# 删除14天前的备份文件
find /backup/full/ -name "*.bak" -mtime +14 -exec rm -f {} ;
find /backup/incr/ -name "*.bak" -mtime +14 -exec rm -f {} ;
find /backup/arch/ -name "*.bak" -mtime +14 -exec rm -f {} ;
🔹 3. 自动化备份(使用 cron)
# 编辑 crontab
crontab -e
# 每小时备份归档日志(可选)
0 * * * * /bin/sh /home/oracle/scripts/backup_arch.sh
# 每日凌晨2点增量备份
0 2 * * * /bin/sh /home/oracle/scripts/backup_incr.sh
# 每周日凌晨3点全量备份(周日)
0 3 * * 0 /bin/sh /home/oracle/scripts/backup_full.sh
🧯 三、灾难恢复流程(如果数据库崩溃)
🔹 1. 恢复步骤概览
1. 恢复最近的全量备份
2. 应用增量备份
3. 应用归档日志(实现 PITR)
4. 打开数据库(resetlogs)
🔹 2. RMAN 恢复示例
rman target /
# 启动到 mount 状态
RMAN> startup mount;
# 恢复数据库
RMAN> restore database;
# 恢复到某个时间点(可选)
RMAN> recover database until time "TO_DATE('2025-08-25 10:00:00', 'YYYY-MM-DD HH24:MI:SS')";
# 打开数据库(需 resetlogs)
RMAN> alter database open resetlogs;
📁 四、目录结构建议
/oradata/
├── CMIP/ --> 数据文件
├── arch/ --> 归档日志(当前路径)
└── control01.ctl --> 控制文件
/backup/ --> 独立挂载点(建议使用 sdc 或 sdd)
├── full/ --> 全量备份
├── incr/ --> 增量备份
└── arch/ --> 归档日志备份
💡 建议将
挂载到
/backup或
sdc,避免与
sdd争抢空间。
/oradata
📌 五、立即行动清单
任务 | 命令/操作 |
---|---|
1. 检查归档日志大小 |
|
2. 查看最近备份 | →
|
3. 删除7天前归档 |
|
4. 创建备份目录 |
|
5. 配置自动备份 | 编写脚本 + 添加 cron |
6. 监控空间 |
|
📞 六、后续建议
尽快扩容
(如从 4T → 6T)将备份迁移到独立磁盘规划操作系统升级(RHEL 6 → 7/8)考虑使用 Oracle ASM 或 NFS 存储
/oradata
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END
暂无评论内容