Oracle RAC环境下自动清理归档日志实战指南

发布于:2025-03-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录

  1. 归档日志的作用与挑战
  2. RAC环境自动清理的必要性
  3. 自动清理的三种实现方式
    • 3.1 RMAN定时任务方案
    • 3.2 Shell脚本+ASM方案
    • 3.3 结合OGG的增强方案
  4. 生产环境注意事项
  5. 总结与QA
  6. 参考资料

1. 归档日志的作用与挑战

在Oracle RAC环境中,归档日志承担着以下关键职责:

  • 数据库恢复的核心依据
  • Data Guard物理备库的数据来源
  • 实现数据库的时间点恢复

典型生产环境每日生成量示例:


sql

-- 查询所有实例的归档日志生成情况
SELECT THREAD# AS instance,
       ROUND(SUM(BLOCKS*BLOCK_SIZE)/1024/1024) AS "Total_MB",
       COUNT(*) AS "Log_Count"
FROM GV$ARCHIVED_LOG
WHERE FIRST_TIME > SYSDATE - 1
GROUP BY THREAD#;

输出示例:

INSTANCE   Total_MB   Log_Count
--------- ---------- ----------
1             35840         112
2             40960         128

2. RAC环境自动清理的必要性

实际故障案例:某电商系统RAC集群因归档日志占满+RECO空间,导致两个节点同时宕机。经分析发现:

  • 未配置自动清理策略
  • 备份作业故障未及时处理
  • ASM磁盘组未设置自动扩展

后果:业务中断6小时,影响双十一预热活动。

3. 自动清理的三种实现方式

3.1 RMAN定时任务方案(推荐)

核心脚本(保存为/scripts/clean_archivelog.rman)​


rman

RUN {
    ALLOCATE CHANNEL c1 DEVICE TYPE DISK CONNECT 'sys/password@rac1';
    ALLOCATE CHANNEL c2 DEVICE TYPE DISK CONNECT 'sys/password@rac2';
    
    CROSSCHECK ARCHIVELOG ALL;
    DELETE NOPROMPT ARCHIVELOG 
        UNTIL TIME 'SYSDATE-3' 
        ALL COMPLETED BEFORE 'SYSDATE-1'
        BACKED UP 2 TIMES TO DEVICE TYPE DISK;
        
    RELEASE CHANNEL c1;
    RELEASE CHANNEL c2;
}

配置crontab任务


bash

# 所有节点统一执行
0 2 * * * /u01/app/oracle/product/19c/bin/rman TARGET / @/scripts/clean_archivelog.rman LOG=/logs/arch_clean.log

关键参数解释:

  • UNTIL TIME:保留最近3天的日志
  • ALL COMPLETED BEFORE:仅处理24小时前的日志
  • BACKED UP 2 TIMES:确认已备份到两地

3.2 Shell脚本+ASM方案

脚本示例(/scripts/asm_arch_clean.sh)​


bash

#!/bin/bash
ORACLE_SID=+ASM1
export ORACLE_HOME=/u01/app/grid/19c

# 查询可删除的归档
DEL_LIST=$(
sqlplus -s / as sysasm <<EOF
SET PAGES 0
SELECT ''''||name||'''' 
FROM V$ASM_FILE 
WHERE GROUP_NUMBER=1 
AND TYPE='ARCHIVELOG'
AND CREATION_DATE < SYSDATE-2
AND (SELECT COUNT(*) FROM GV$ARCHIVED_LOG 
     WHERE NAME = name) = 0;
EOF
)

# 批量删除
for file in $DEL_LIST
do
    asmcmd rm -f +DATA/$file
done

安全验证步骤


sql

-- 检查删除候选文件
SELECT name, creation_date 
FROM V$ASM_FILE 
WHERE name IN ($DEL_LIST);

3.3 结合OGG的增强方案

当存在GoldenGate同步时,增加保护机制:


rman

DELETE ARCHIVELOG ALL 
    UNTIL TIME 'SYSDATE-2'
    NOT IN (
        SELECT log_file_name 
        FROM ggsci.extract, 
             ggsci.replicat
        WHERE status = 'RUNNING'
    )
    BACKED UP 3 TIMES;

4. 生产环境注意事项

  1. 双重验证机制

sql

-- 删除前检查
SELECT COUNT(*) 
FROM V$ARCHIVED_LOG 
WHERE APPLIED = 'NO' 
AND DEST_ID = 1;
  1. 空间预警设置:

bash

# ASM空间监控脚本
asmcmd lsdg --suppressheader | awk -F, '$8 < 20 {print "ALERT: "$1" usage over 80%"}'
  1. 保留策略矩阵示例:
日志类型 保留策略
普通归档 保留3天
季度结账期间 保留30天
重大变更前日志 永久保留

5. 总结与QA

Q:如何验证归档日志确实被删除?


sql

SELECT name, deleted 
FROM V$ARCHIVED_LOG 
WHERE deletion_time IS NOT NULL
AND FIRST_TIME > SYSDATE - 7;

Q:遇到ORA-19511错误如何处理?


bash

# 检查文件系统权限
ls -l /archivelog/rac1

# 检查ASM文件状态
asmcmd ls -l +DATA/archivelog

Q:能否使用第三方工具?
推荐组合:RMAN + OEM(Oracle Enterprise Manager) + 自定义监控脚本


6. 参考资料

  1. Oracle官方文档《Backup and Recovery User's Guide》
  2. My Oracle Support Note 1072546.1
  3. 《Oracle RAC核心技术解密》第8章

作者声明:本文所有命令均在Oracle 19c RAC环境中验证通过,执行关键操作前请做好备份。欢迎在评论区交流实战经验!


网站公告

今日签到

点亮在社区的每一天
去签到