RAC中Redo日志大小必须全局一致,因多实例共享数据文件但独立写Redo,大小不一会导致检查点异常、日志切换卡死及ORA-15042错误;需确保各实例日志组数量、大小、ASM路径(如统一+DATA)完全镜像。
redo日志在oracle 11g rac中必须严格对齐:各实例日志组数量、大小、路径(尤其是asm磁盘组位置)不一致,会直接引发log file switch (checkpoint incomplete)等待飙升、归档堆积甚至实例挂起。
为什么RAC中Redo日志大小必须全局一致
RAC多实例共享同一套数据文件和控制文件,但每个实例维护独立的Redo Log Buffer和LGWR进程。若实例1的日志组是200MB而实例2是100MB,当实例2频繁切换时,会强制推进全局检查点SCN,拖慢实例1的写入节奏;更严重的是,ALTER DATABASE ADD LOGFILE GROUP操作在RAC中默认只作用于当前实例,其他实例可能“看不见”新日志组,导致日志循环卡死。
- Oracle 11g RAC要求所有实例的在线日志组配置完全镜像,包括
GROUP#编号、SIZE、成员路径、磁盘组冗余策略 - ASM路径必须显式指定为+DATA(或统一磁盘组),不能混用+DATA和+RECO,否则
v$logfile中IS_RECOVERY_DEST_FILE值不一致,触发ORA-15042 - 单实例可容忍日志组大小差异,RAC下这是硬性约束,不是建议
检查当前RAC各实例日志配置是否对齐
在任意节点执行以下查询,重点比对bytes、group#、member(ASM别名)、thread#:
SELECT a.thread#, a.group#, a.bytes, b.member FROM v$log a, v$logfile b WHERE a.group# = b.group# ORDER BY a.thread#, a.group#;
常见错配现象:
- 同一
group#在不同thread#下bytes不同(如thread 1 group 1=200M,thread 2 group 1=100M) -
member路径显示为+DATA/db1/redo01.log 和 +RECO/db1/redo01.log 混用 - 某实例缺失
group#(如thread 1有group 4,thread 2只有group 1~3)
安全扩容Redo日志(RAC专用步骤)
核心原则:先增后删,全程在RESTRICTED SESSION下操作,避免跨实例状态不一致。
- 确认所有实例处于
OPEN状态且无ACTIVE日志组残留:SELECT group#, status FROM v$log WHERE status = 'ACTIVE';结果应为空 - 在所有节点依次执行添加新日志组(必须指定
THREAD):ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 4 '+DATA/db1/redo04.log' SIZE 500M;和ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 4 '+DATA/db1/redo04.log' SIZE 500M; - 强制所有实例切换到新日志组:
ALTER SYSTEM SWITCH LOGFILE;(在每个实例分别执行,非全局命令) - 等待旧日志组全部变为
INACTIVE(非CURRENT或ACTIVE)后,再逐个删除:ALTER DATABASE DROP LOGFILE GROUP 1;(注意:RAC中DROP需确保该group在所有thread下都INACTIVE)
ASM路径与磁盘组选择的关键细节
Redo日志文件必须放在高I/O吞吐、低延迟的ASM磁盘组中,且不能与归档日志共用同一磁盘组。
- 优先使用
EXTERNAL REDUNDANCY磁盘组(如+DATA),避免NORMAL REDUNDANCY带来的双写开销——Redo本身已通过多成员保障可用性 - 禁止将Redo日志存于
+RECO(快速恢复区),该区域默认启用ARCHIVELOG模式下的自动清理,可能误删正在使用的日志文件 - ASM别名必须显式创建并验证:
ASMCMD> mkalias +DATA/db1/redo04.log redo04.log,然后在v$logfile中确认member列显示为+DATA/db1/redo04.log而非系统生成的随机名
最易被忽略的一点:RAC中ALTER DATABASE ADD LOGFILE语句里的ASM路径,必须对所有实例都可访问且权限一致;若使用了不同的ASM客户端配置(如grid用户环境变量ORACLE_HOME指向不同版本),会导致日志组在部分节点注册失败,但无报错——这种静默不一致,要靠v$logfile逐行比对才能发现。











