磁盘性能IOPS (四)-归档日志清理与备份恢复方案

磁盘性能IOPS(四)-归档日志清理与备份恢复方案

归档日志清理与备份恢复方案

作为一台 Oracle 数据库服务器(实例名:CMIP),且
/oradata
空间已使用 84%(3.2T/4.0T),我们必须制定一个 安全、可靠、可恢复的归档日志清理与备份恢复方案


🛑 重要前提:绝不允许“无备份删除归档日志”!

🔥 警告
归档日志(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可安全删除:
sysdate-10
之前的归档日志(即 8月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 周
/backup/full/
增量备份 每日一次(0级或1级) 2 周
/backup/incr/
归档日志备份 每小时一次 14 天
/backup/arch/

⚠️ 备份目录应独立于
/oradata
,建议使用另一块磁盘或网络存储。


🔹 2. 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
):

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. 检查归档日志大小
du -sh /oradata/arch/
2. 查看最近备份
rman target /

list backup summary;
3. 删除7天前归档
delete archivelog until time 'sysdate-7';
4. 创建备份目录
mkdir -p /backup/{full,incr,arch}
5. 配置自动备份 编写脚本 + 添加 cron
6. 监控空间
df -h /oradata /backup

📞 六、后续建议

尽快扩容
/oradata
(如从 4T → 6T)将备份迁移到独立磁盘规划操作系统升级(RHEL 6 → 7/8)考虑使用 Oracle ASM 或 NFS 存储


© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
小肥杨Kyrene的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容