增大redo log文件大小可缓解log file switch (checkpoint incomplete),因延长日志写满时间,为dbwr刷脏块、arch归档、rfs/mrp同步提供缓冲;但oracle 11g不支持alter database resize logfile,须通过新增大日志组→切换→删除旧组→重建的方式替换,且必须确保操作对象为inactive状态组。
log file switch (checkpoint incomplete) 是根本原因,不是现象。它说明 lgwr 想切日志,但 dbwr 还没把脏块刷完,归档也还没传走,旧日志不能覆盖——此时增大 redo log 文件大小是最直接有效的缓解手段。
为什么不能直接 ALTER DATABASE RESIZE LOGFILE
Oracle 11g 不支持在线调整单个日志文件大小,ALTER DATABASE RESIZE LOGFILE 会报 ORA-02231 或直接不识别该语法。你看到的“调整大小”本质是“替换”:新增大文件日志组 → 切换使用 → 删除旧组 →(可选)重建原组号。所有操作都必须围绕 v$log 中的 STATUS 状态展开,只对 INACTIVE 组执行 DROP,否则会卡在 ORA-01624(当前实例恢复所需)或 ORA-01567(删完只剩一组)。
切换失败时先查这三件事
遇到 ALTER SYSTEM SWITCH LOGFILE 不生效、日志组长期 CURRENT 或 ACTIVE,优先确认:
-
v$log中是否有大量ACTIVE组?说明 checkpoint 慢或归档延迟,需同步检查fast_start_mttr_target是否设得太小(如30),或归档目标 I/O 压力大 -
v$archive_dest_status中STATUS是否为VALID,ERROR列是否非空?常见归档路径满、权限不足、NFS 挂载异常 - 备库是否卡住?
SELECT process, status, sequence#, block# FROM v$managed_standby;若MRP为APPLYING_LOG但SEQUENCE#长期不增长,主库切日志会被阻塞
增大小日志必须同步配齐 standby redo log
在 Data Guard 环境下,主库 redo log 增大后,备库的 standby redo log 必须满足两个硬条件:
- 每组大小 ≥ 主库最大
online redo log尺寸(例如主库改到500M,备库STANDBY LOGFILE也得 ≥500M) -
VALID_FOR配置正确:至少有一组设为(PRIMARY_ROLE, ONLINE_LOGFILES),否则 RFS 进程写不进 - 组数建议 ≥ 主库 online 组数 + 1,避免 MRP 应用时被 RFS 覆盖
漏配会导致备库 RFS 写入失败,错误见告警日志:ORA-00344: unable to recreate online log 或 RFS[2]: Archived Log: 'UNKNOWN'。
实际操作中最容易卡住的三个状态点
整个替换过程真正耗时的不是 SQL 执行,而是等待状态自然流转。关键卡点有:
-
CURRENT→ACTIVE:必须等 checkpoint 完成,受fast_start_mttr_target和db_writer_processes影响;手动ALTER SYSTEM CHECKPOINT可加速,但别频繁执行 -
ACTIVE→INACTIVE:依赖归档完成,ARCH进程速度慢或归档目标响应延迟时,可能卡十几分钟 - 删除旧组后重建同组号:若控制文件未及时刷新,新
ADD LOGFILE GROUP 1可能报ORA-01568,此时需ALTER DATABASE BACKUP CONTROLFILE TO TRACE确认当前组号分配情况
别指望一次切日志就让所有旧组变 INACTIVE;观察 v$log 状态比反复执行 SWITCH LOGFILE 更可靠。











