某金融核心系统 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、6 | thread 1 仅 RAC 需要 |
③ 手动切换 | alter system switch logfile; | 至少执行两次,把 CURRENT 赶到新组 |
④ 等待旧组变 INACTIVE | select 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 个脚本确认疗效
- redo 状态总览
select inst_id, group#, thread#, bytes/1024/1024 MB, status
from gv$log
order by inst_id, group#;
- 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;
- 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 次/小时自动短信