重做日志维护


某金融核心系统 AWR 报出 log file switch (checkpoint incomplete)log file sync 异常,平均每小时切换 200+ 次,业务高峰时段客户登录超时。经排查,redo log 只有 3 组,每组 50 MB,果断“扩容+降频”。


风险与前期准备

风险评估

风险点影响规避措施
日志大小设置不合理切换频繁 → 等待事件飙升每 15–30 min 切换一次为佳
ASM 空间不足新增日志失败预留 ≥ 新增日志大小 × 2

前期检查清单

# 1. 确认当前 redo 位置与大小
sqlplus / as sysdba
SQL> select * from gv$logfile;
SQL> select group#, bytes/1024/1024 MB, status from gv$log;

# 2. 检查 ASM 剩余空间(grid 用户)
sqlplus / as sysasm
SQL> select name, total_mb, free_mb,
          round(free_mb*100/total_mb,2) pct_free
    from v$asm_diskgroup;

7 步完成 redo 扩容

核心理念:Oracle 不允许直接 resize redo,只能“先加后删”。

步骤命令说明
① 登录sqlplus / as sysdba必须 sysdba
② 新增大容量组alter database add logfile thread 1 group 4 '+FRA/onlinelog/redo1_4.log' size 200M; 同上再建 group 5、6thread 1 仅 RAC 需要
③ 手动切换alter system switch logfile;至少执行两次,把 CURRENT 赶到新组
④ 等待旧组变 INACTIVEselect group#, status from gv$log;ACTIVE→INACTIVE 期间最多几分钟
⑤ 删除旧组alter database drop logfile group 1;只能删 INACTIVE/UNUSED
⑥ 物理文件清理ASM 会自动删,文件系统需 rm误删前一定确认 v$log.status
⑦ 校验select group#, bytes/1024/1024 MB, status from gv$log;应只剩 200 MB 组

后期校验:3 个脚本确认疗效

  1. redo 状态总览
select inst_id, group#, thread#, bytes/1024/1024 MB, status
from gv$log
order by inst_id, group#;
  1. 30 天切换频率(按小时)
SELECT to_char(first_time, 'yyyy-mm-dd') day,
      COUNT(*) switch_cnt
FROM gv$log_history
WHERE first_time > trunc(SYSDATE - 30)
GROUP BY to_char(first_time, 'yyyy-mm-dd')
ORDER BY 1;
  1. AWR 深挖等待事件
@?/rdbms/admin/awrrpt.sql
-- 关注 log file sync、log file parallel write、log file switch...

经验值:切换次数 < 4 次/小时,等待事件明显下降。


回退方案 & 变更跟进

  • 回退:新增/扩容后无需回退,若误删 redo 导致数据库宕机,可在 MOUNT 状态下 clear logfile group N 或从备份恢复。
  • 跟进
    • 连续监控 3 天 AWR,确认 redo 相关等待 < Top 5
    • 设置告警阈值:切换频率 > 10 次/小时自动短信

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部