1. 这不是“装个Oracle”那么简单:RAC环境的本质是高可用架构的精密协同
你搜“VMware Centos7.4+UDEV+AMS+ORACLE 配置RAC环境”,点开一堆教程,十有八九开头就是“下载ISO、新建虚拟机、配置网络……”。但我要先泼一盆冷水:如果你只把它当成“在虚拟机里装两个Oracle数据库”,那接下来三天你会反复重装系统,最后瘫在椅子上盯着报错日志发呆。RAC(Real Application Clusters)从来就不是“多装几套Oracle”的加法题,而是一套以共享存储为心脏、以集群心跳为脉搏、以资源协调为神经的高可用操作系统。它要求底层Linux内核对SCSI设备的识别必须稳定如钟表,要求UDEV规则能像指纹一样精准绑定物理磁盘路径,要求AMS(ASM,Automatic Storage Management)不只是个“自动管理磁盘的工具”,而是整个集群数据存取的唯一调度中枢——它得同时听懂两个节点发来的IO指令,还得确保不撞车、不丢帧、不乱序。
我第一次搭这个环境时,在CentOS 7.4上卡了整整17个小时。问题出在哪?不是Oracle安装包错了,也不是密码输错了,而是UDEV规则里一个小小的SYMLINK+=写成了SYMLINK=,导致两个节点看到的ASM磁盘名完全不一致。节点1认/dev/asm-disk1,节点2却认/dev/asm-disk2,结果CRS(Cluster Ready Services)启动直接报错“ORA-15032: not all alterations performed”,后面跟着一串ASM无法挂载的连锁反应。这背后暴露的是RAC最核心的脆弱点:所有节点必须对底层硬件资源达成绝对一致的“共识”。VMware在这里不是简单的容器,它提供的共享磁盘(如RDM或独立持久化VMDK)必须被Linux内核以完全相同的方式解析;CentOS 7.4的systemd服务管理机制和udev规则加载顺序,比旧版6.x更严格也更隐蔽;AMS不是可选模块,它是RAC的基石——没有它,你就没法把多个物理磁盘聚合成一个逻辑磁盘组供Oracle读写;而Oracle本身,在11gR2及以后版本中,RAC已深度绑定ASM,脱离ASM谈RAC,就像脱离开水谈鱼。
所以这篇内容,不教你怎么点鼠标下一步,而是带你拆开这个精密钟表的每一个齿轮:为什么UDEV规则必须用KERNEL=="sd*"而不是NAME=="sd*"?为什么AMS磁盘组的AU(Allocation Unit)大小要按实际IO模式计算,而不是盲目设1M?为什么VMware里给RAC节点分配的vCPU不能简单按物理核数1:1映射?这些细节,决定了你的RAC是跑得稳如泰山,还是三天两头脑溢血。适合谁看?如果你正准备Oracle OCP认证里的RAC实验部分,或者公司测试环境急需一套可验证的双节点集群,又或者你刚接手一套生产RAC发现总在莫名重启——那你需要的不是步骤清单,而是这套架构背后的“为什么”。
2. 环境设计与技术选型:为什么是VMware+CentOS 7.4+UDEV+AMS这条技术栈?
2.1 VMware:虚拟化层的“确定性”比性能更重要
很多人问:“为什么不用VirtualBox或Hyper-V?”答案很实在:VMware Workstation Pro(或ESXi)对SCSI控制器和共享磁盘的模拟,是目前x86桌面/测试虚拟化平台中最接近物理环境的。RAC对存储路径稳定性的要求近乎苛刻,而VirtualBox的共享磁盘实现(如VMDK共享)在Linux下常出现设备节点漂移;Hyper-V的SCSI控制器在CentOS 7.4上驱动兼容性曾有长期bug(尤其涉及多路径I/O)。VMware则通过两种成熟方式解决共享存储:
- RDM(Raw Device Mapping):将物理磁盘(或SAN LUN)直接映射给虚拟机,绕过VMFS文件系统层,获得近乎裸金属的IO性能和路径稳定性。这是生产环境首选,但测试环境往往没真实SAN。
- 独立持久化VMDK:在VMware里创建多个VMDK文件,设置属性为“Independent-Persistent”,并从VM设置中将它们同时添加给两个虚拟机。关键点在于:必须勾选“Enable disk locking”(启用磁盘锁定),否则两个节点会因并发写入元数据而损坏磁盘。我实测过,未启用此选项时,CRS启动阶段就会触发ASM磁盘头校验失败。
提示:VMware Workstation 16+对CentOS 7.4支持极好,但务必关闭“3D加速”和“声卡”——这些无关设备会增加内核中断负载,干扰集群心跳检测的实时性。RAC节点间的心跳(通常走private network)延迟超过500ms就可能触发reboot,而图形子系统正是隐藏的延迟源。
2.2 CentOS 7.4:一个被低估的“黄金平衡点”
为什么不是更新的CentOS 7.9或8.x?因为Oracle官方认证矩阵里,11gR2 RAC对7.4的支持最完整,且7.4的kernel-3.10.0-693.el7带有一个关键补丁:修复了scsi_mod模块在高并发IO下偶发的device busy错误。这个错误在RAC启动ASM实例时高频出现,表现为ORA-15032伴随ORA-15183(ASM磁盘头损坏)。而7.9的kernel虽新,但Oracle 11.2.0.4的RDBMS二进制包与之存在细微ABI不兼容,需额外打PSU补丁。
CentOS 7.4的systemd服务管理也恰到好处:它既避免了6.x时代init.d脚本的手动依赖管理混乱,又不像8.x那样激进地用cgroups v2彻底重构资源隔离——RAC的OCSSD(Oracle Cluster Synchronization Services Daemon)进程对cgroups v1的CPU亲和性控制更成熟。我对比过:同样配置下,7.4节点加入集群平均耗时23秒,7.9需31秒,8.x则高达45秒以上,主要卡在crsctl start crs后的ohasd初始化阶段。
2.3 UDEV:让虚拟磁盘拥有“身份证”,而非“临时工号”
UDEV规则是RAC环境里最易被忽视、却最致命的一环。它的核心任务不是“让磁盘能被识别”,而是“让所有节点永远用同一个名字访问同一块物理磁盘”。VMware虚拟磁盘在Linux里表现为/dev/sdX,但sda、sdb的分配顺序取决于内核探测顺序——而这个顺序在虚拟机重启、热插拔后极易变化。UDEV通过设备属性(如ID_SERIAL)生成稳定符号链接,例如/dev/asm-disk1始终指向序列号为VMware_Virtual_SATA_AHCI_00000000000000000001的磁盘。
关键细节在于规则写法:
# 正确:基于唯一硬件标识,且指定SUBSYSTEM为block KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", SYMLINK+="asm-disk%n", OWNER="grid", GROUP="asmadmin", MODE="0660"这里%n代表磁盘编号(sda→0, sdb→1),PROGRAM调用scsi_id获取序列号,SYMLINK+=是追加而非覆盖。若写成SYMLINK=,当多个规则匹配同一设备时,后者会覆盖前者,导致符号链接丢失。我见过最坑的案例:规则里漏了SUBSYSTEM=="block",结果UDEV把SCSI控制器设备(如/dev/bus/usb/001/001)也卷进来,生成一堆无效链接,反而污染了ASM发现路径。
2.4 AMS(ASM):不是“自动管理”,而是“智能仲裁”
AMS(Automatic Storage Management)常被误读为“Oracle版LVM”,但它本质是RAC的分布式存储协调器。它的工作模式是:每个节点运行一个ASM实例,所有ASM实例通过集群心跳网络同步元数据变更。当节点1写入数据块时,ASM实例会广播该块的最新LSN(Log Sequence Number)给其他节点,确保缓存一致性。因此,ASM磁盘组(Disk Group)的冗余策略(NORMAL/EXTERNAL)直接决定RAC的容错能力:
- EXTERNAL冗余:仅依赖底层存储(如RAID10)做镜像,ASM不做额外拷贝。适合VMware RDM直连SAN,IO开销最低。
- NORMAL冗余:ASM在磁盘组内做2路镜像,即使一块磁盘故障,数据仍可读写。适合独立VMDK方案,但需至少3块磁盘(2块数据+1块投票盘)。
注意:投票盘(Voting Disk)和OCR(Oracle Cluster Registry)必须放在ASM磁盘组里,且该磁盘组必须是NORMAL冗余。这是RAC集群脑裂(Split-Brain)防护的核心——当节点间心跳中断时,OCR和投票盘的多数派原则决定哪个子集群存活。若放错位置(如普通文件系统),集群将无法自愈。
3. 核心配置与实操要点:从UDEV规则到ASM磁盘组的逐层构建
3.1 VMware底层存储配置:独立持久化VMDK的精确手术
在VMware Workstation中创建RAC共享磁盘,绝非简单复制粘贴VMDK文件。以下是经过12次失败验证的精确步骤:
- 创建专用存储目录:在宿主机(Windows/macOS)上新建文件夹
C:\VMware\RAC-Shared,避免路径含空格或中文(VMware对Unicode路径处理不稳定)。 - 新建第一块VMDK:
- 打开VMware Workstation → “Create a New Virtual Machine” → 选择“Custom” → “Later”跳过OS安装。
- 在“Select a Disk”步骤,选择“Create a new virtual disk” → “SCSI”控制器 → 大小设为20GB(投票盘最小要求)→ 关键:勾选“Store virtual disk as a single file”(单文件模式减少碎片)→ 完成后,立即编辑该VMDK的
.vmx文件,在末尾添加:disk.locking = "false" scsi0:1.deviceType = "disk" scsi0:1.present = "TRUE" scsi0:1.fileName = "RAC-Vote.vmdk" scsi0:1.mode = "independent-persistent" disk.locking = "false"禁用VMware文件锁,允许两个VM同时访问;independent-persistent确保写入不被快照回滚。
- 克隆剩余磁盘:右键该VMDK → “Clone” → 选择“Clone to another virtual disk” → 新建
RAC-Data1.vmdk(50GB)、RAC-Data2.vmdk(50GB)、RAC-OCR.vmdk(10GB)。克隆后必须手动修改每个克隆体的.vmdk文件头:用文本编辑器打开,找到# Disk DescriptorFile下方的CID字段,将其值全部改为唯一随机数(如12345678),否则VMware会认为它们是同一磁盘的快照链,拒绝共享。 - 挂载到两个节点:分别编辑Node1和Node2的
.vmx文件,在scsi0:段后添加:scsi0:2.present = "TRUE" scsi0:2.fileName = "RAC-Vote.vmdk" scsi0:2.mode = "independent-persistent" scsi0:2.deviceType = "disk" # 重复添加scsi0:3, scsi0:4, scsi0:5对应Data1/2/OCR
实测发现:若未修改CID,启动第二个节点时VMware会报错“Cannot open the disk ‘xxx.vmdk’ or one of the snapshot disks it depends on”,且日志显示“Failed to lock the file”。这是VMware底层的磁盘一致性保护机制,必须绕过。
3.2 CentOS 7.4系统级准备:内核参数与服务的静默加固
RAC对Linux内核的要求远超普通应用。以下配置必须在/etc/sysctl.conf中硬编码,并执行sysctl -p生效:
# 内存与网络 fs.aio-max-nr = 1048576 # ASM大量异步IO所需 fs.file-max = 6815744 # 文件句柄上限,按节点数×20000计算 kernel.shmall = 2097152 # 共享内存页总数(=shmax/PAGE_SIZE) kernel.shmmax = 8589934592 # 单个共享内存段最大值(8GB,按物理内存70%设) kernel.shmmni = 4096 # 共享内存段总数 net.core.rmem_default = 262144 # TCP接收缓冲区默认值 net.core.wmem_default = 262144 # TCP发送缓冲区默认值 net.ipv4.conf.all.arp_ignore = 1 # 防ARP欺骗,RAC私网必需 net.ipv4.conf.all.arp_announce = 2其中shmmax的计算逻辑是:Oracle SGA(System Global Area)最大值不能超过shmmax。假设你计划SGA为6GB,则shmmax至少为6*1024*1024*1024=6442450944字节,向上取整到8GB(8589934592)留出余量。若设小了,sqlplus / as sysdba连接时会报ORA-27123: unable to attach to shared memory segment。
服务管理方面,必须禁用冲突服务:
# 停止并禁用NetworkManager(它会劫持私网IP) systemctl stop NetworkManager systemctl disable NetworkManager # 启用传统network服务 systemctl enable network # 关闭防火墙(RAC端口复杂,iptables易误杀心跳包) systemctl stop firewalld systemctl disable firewalld实操心得:CentOS 7.4默认启用
firewalld,但RAC需开放数十个端口(1521, 1158, 9485等),且私网心跳使用UDP 12345端口。手动配置iptables规则极易遗漏,最稳妥方案是彻底关闭防火墙,改用VMware的虚拟交换机端口组做网络隔离。
3.3 UDEV规则实战:从设备扫描到符号链接的全链路验证
UDEV配置分三步走,缺一不可:
第一步:确认SCSI设备属性在Node1上执行:
ls -l /dev/sd* # 记录输出,如:/dev/sda -> ../devices/pci0000:00/0000:00:10.0/ata1/host0/target0:0:0/0:0:0:0/block/sda # 获取其唯一ID: /sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sda # 输出类似:36000c292e5b8a1f3b4c5d6e7f8a9b0c1此ID即磁盘的WWN(World Wide Name),是UDEV规则的锚点。
第二步:编写规则文件创建/etc/udev/rules.d/99-oracle-asm.rules:
# 投票盘规则(1块) KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c292e5b8a1f3b4c5d6e7f8a9b0c1", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660" # 数据盘规则(2块) KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c29a1b2c3d4e5f6a7b8c9d0e1f2", SYMLINK+="asm-disk2", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c29f1e2d3c4b5a6f7e8d9c0b1a2", SYMLINK+="asm-disk3", OWNER="grid", GROUP="asmadmin", MODE="0660" # OCR盘规则(1块) KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c29b1c2d3e4f5a6b7c8d9e0f1a2", SYMLINK+="asm-disk4", OWNER="grid", GROUP="asmadmin", MODE="0660"注意:RESULT必须与scsi_id输出完全一致,包括大小写和冒号位置。
第三步:加载并验证
# 重新加载UDEV规则 udevadm control --reload-rules udevadm trigger --subsystem-match=block # 检查符号链接是否生成 ls -l /dev/asm* # 应输出:lrwxrwxrwx. 1 root root 3 Jun 10 10:00 /dev/asm-disk1 -> sda # 在Node2上重复执行,确保输出完全一致!常见陷阱:scsi_id命令在CentOS 7.4中位于/sbin/而非/usr/bin/,规则中路径写错会导致PROGRAM返回空,RESULT匹配失败。我踩过的坑是:scsi_id输出末尾有换行符,而RESULT匹配时会包含它,导致匹配失败。解决方案是在PROGRAM后加| tr -d '\n',但更稳妥的是用RESULT=="36000c29..."直接匹配前缀。
3.4 AMS磁盘组创建:AU大小与冗余策略的工程化选择
ASM实例启动后,创建磁盘组是RAC部署的临门一脚。关键参数不是凭经验填,而是按IO特征计算:
- AU(Allocation Unit)大小:默认1MB,但对OLTP型RAC(高并发小IO),应设为128KB或256KB以减少元数据开销;对DW型(大块顺序读写),可设4MB提升吞吐。计算公式:
AU_size ≈ average_IO_size × 2。例如,业务SQL平均读取8KB数据块,则AU设16KB(但ASM最小AU为1MB,故选1MB)。 - 冗余策略:投票盘和OCR盘必须用
NORMAL,数据盘可用EXTERNAL(若底层RAID已提供镜像)。
创建命令示例:
-- 以grid用户登录ASM实例 sqlplus / as sysasm -- 创建OCR/VOTE磁盘组(NORMAL冗余,需3块磁盘) CREATE DISKGROUP OCR_VOTE NORMAL REDUNDANCY DISK '/dev/asm-disk1', '/dev/asm-disk4' QUORUM DISK '/dev/asm-disk1' ATTRIBUTE 'au_size'='1048576', 'compatible.asm'='11.2.0.4.0'; -- 创建DATA磁盘组(EXTERNAL冗余) CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/asm-disk2', '/dev/asm-disk3' ATTRIBUTE 'au_size'='1048576', 'compatible.asm'='11.2.0.4.0';QUORUM DISK指定投票盘,compatible.asm必须与Oracle版本严格匹配,否则CRS无法注册资源。
实操心得:创建磁盘组时若报错
ORA-15018: diskgroup cannot be created,90%原因是磁盘未被ASM识别。执行SELECT path, header_status FROM v$asm_disk;检查,若header_status为PROVISIONED,说明磁盘头为空,需先用dd if=/dev/zero of=/dev/asm-disk1 bs=1024 count=100清零前100KB。这是VMware VMDK克隆后残留的旧ASM元数据导致的。
4. RAC集群部署与故障排查:从CRS启动到实例注册的全流程解剖
4.1 Grid Infrastructure安装:静默模式下的参数博弈
Oracle Grid Infrastructure(GI)安装是RAC的“操作系统”,必须在所有节点上完全一致。推荐使用静默模式(Silent Mode)避免GUI交互差异:
# 解压GI安装包后,编辑响应文件grid.rsp oracle.install.option=CRS_CONFIG ORACLE_BASE=/u01/app/grid INVENTORY_LOCATION=/u01/app/oraInventory oracle.install.asm.OSDBA=asmadmin oracle.install.asm.OSOPER=asmoper oracle.install.asm.OSASM=asmadmin oracle.install.crs.config.gpnp.scanName=rac-scan oracle.install.crs.config.gpnp.scanPort=1521 oracle.install.crs.config.clusterName=rac-cluster oracle.install.crs.config.nodeList=node1:node1-priv,node2:node2-priv oracle.install.crs.config.networkInterfaceList=eth0:192.168.1.0:1,eth1:10.10.10.0:5 # 关键:指定ASM磁盘组发现路径 oracle.install.asm.diskGroup.name=OCR_VOTE oracle.install.asm.diskGroup.redundancy=NORMAL oracle.install.asm.diskGroup.discoveryString=/dev/asm-disk*其中networkInterfaceList格式为<interface>:<subnet>:<type>,type=1为公网(eth0),type=5为私网(eth1)。若写错,CRS会绑定到错误网卡,导致心跳失败。
执行安装:
./runInstaller -silent -responseFile /path/to/grid.rsp -ignorePrereq -waitforcompletion # 安装后,必须在每个节点以root执行: /u01/app/11.2.0/grid/root.shroot.sh会启动ohasd(Oracle High Availability Services Daemon),它是CRS的根进程。若执行后ps -ef | grep ohasd无输出,说明/etc/init.d/ohasd启动脚本未注册,需手动执行/u01/app/11.2.0/grid/crs/install/roothas.pl。
4.2 CRS状态诊断:从crsctl check crs到cluvfy的纵深排查
CRS启动后,标准检查流程如下:
基础状态检查:
crsctl check crs # 应输出"CRS-4638: Oracle High Availability Services is online" crsctl check cluster -all # 检查所有节点,正常返回"CRS-4537: Cluster Ready Services is online"若报错
CRS-4639: Could not contact Oracle High Availability Services,说明ohasd未运行,检查/var/log/oracle-grid/ohasd.log。资源状态检查:
crsctl status resource -t # 查看所有资源状态,重点关注: # ora.OCR_VOTE.dg(磁盘组) # ora.DATA.dg(数据磁盘组) # ora.registry.acfs(OCR位置) # ora.asm(ASM实例)若
ora.asm状态为OFFLINE,执行srvctl start asm -n node1,再查tail -100 /u01/app/grid/diag/asm/+asm/+ASM1/trace/alert_+ASM1.log。集群验证(Cluvfy):
# 在任意节点执行预检 /u01/app/11.2.0/grid/bin/cluvfy stage -pre crsinst -n node1,node2 -verbose # 部署后验证 /u01/app/11.2.0/grid/bin/cluvfy stage -post hwos -n node1,node2 -verbosecluvfy会检测时间同步(NTP)、SSH信任、磁盘权限等。最常见的失败项是Time drift:若节点间时间差>1秒,CRS拒绝启动。解决方案是配置NTP:# 编辑/etc/chrony.conf,添加: server 192.168.1.1 iburst # 指向内网NTP服务器 # 启动chronyd systemctl enable chronyd systemctl start chronyd
4.3 Oracle Database安装与RAC注册:跨节点的实例协同
Database软件安装后,创建RAC数据库需指定ASM磁盘组:
# 使用DBCA静默创建 dbca -silent -createDatabase \ -gdbName racdb \ -sid racdb \ -responseFile /path/to/dbca.rsp \ -characterSet AL32UTF8 \ -memoryPercentage 40 \ -storageType ASM \ -asmSysPassword <asm_password> \ -asmDiskGroupName DATA \ -asmDiskString '/dev/asm-disk*' \ -nodelist node1,node2 \ -databaseType MULTIPURPOSE \ -automaticMemoryManagement true关键参数-nodelist指定所有节点,-asmDiskString必须与UDEV规则中的路径一致。
创建完成后,验证实例状态:
# 以oracle用户登录 srvctl status database -d racdb # 应显示两个实例均online # 检查监听器 srvctl status listener # 应显示LISTENER_SCAN1(SCAN监听器)和LISTENER(本地监听器) # 测试SCAN连接 sqlplus system/password@rac-scan:1521/racdb若srvctl status database显示某实例OFFLINE,检查$ORACLE_HOME/rdbms/log/<instance_name>.log,常见原因是ORACLE_SID环境变量未正确设置为racdb1/racdb2。
4.4 典型故障速查表:从磁盘识别失败到脑裂防护失效
| 故障现象 | 根本原因 | 排查命令 | 解决方案 |
|---|---|---|---|
crsctl check cluster报错“CRS-4535: Cannot communicate with Cluster Ready Services” | ohasd进程未启动或/etc/init.d/ohasd未注册 | ps -ef | grep ohasdcat /etc/init.d/ohasd | 手动执行/u01/app/11.2.0/grid/crs/install/roothas.pl |
crsctl status resource -t中ora.asm状态为INTERMEDIATE | ASM磁盘组未挂载或发现路径错误 | sqlplus / as sysasm | SELECT name,state FROM v$asm_diskgroup;ls -l /dev/asm* | 检查UDEV规则是否生效,确认/dev/asm-disk*存在且权限为grid:asmadmin |
srvctl start database -d racdb后实例自动停止 | ORACLE_SID环境变量未按节点区分 | echo $ORACLE_SID(应在node1为racdb1,node2为racdb2) | 在~oracle/.bash_profile中添加:export ORACLE_SID=racdb$(hostname | cut -d'-' -f2) |
SCAN监听器无法连接,tnsping rac-scan超时 | DNS未解析SCAN名称,或SCAN IP未绑定到VIP | nslookup rac-scansrvctl config scan | 在DNS服务器添加A记录:rac-scan IN A 192.168.1.100rac-scan IN A 192.168.1.101rac-scan IN A 192.168.1.102(3个SCAN IP) |
| 节点重启后集群分裂,只剩一个节点在线 | 投票盘(Voting Disk)不可访问或OCR损坏 | crsctl query css votediskocrcheck | 检查ASM磁盘组OCR_VOTE状态,若DISKGROUP为DISMOUNTED,执行:sqlplus / as sysasm | ALTER DISKGROUP OCR_VOTE MOUNT; |
个人经验:最隐蔽的故障是“时间不同步”。某次客户环境,
cluvfy报告一切正常,但CRS总在启动后5分钟自动关闭。最终发现是VMware Tools的time sync功能与NTP冲突,导致节点时间在后台缓慢漂移。解决方案:在VMware设置中禁用Synchronize guest time with host,仅依赖chronyd。
5. 生产就绪加固与运维要点:让RAC不止于“能跑”,更要“稳跑”
5.1 日志与监控体系:从adrci到自定义巡检脚本
RAC的日志分散在多个位置,必须建立统一收集机制:
- Grid Infrastructure日志:
$GRID_HOME/log/<hostname>/,核心文件alert<hostname>.log(CRS告警)、ohasd.log(HA服务日志)。 - ASM实例日志:
$GRID_HOME/diag/asm/+asm/+ASM<node>/trace/alert_+ASM<node>.log。 - Oracle Database日志:
$ORACLE_HOME/diag/rdbms/<dbname>/<instance>/trace/alert_<instance>.log。
自动化巡检脚本(每日执行):
#!/bin/bash # rac-health-check.sh LOGFILE="/tmp/rac_health_$(date +%Y%m%d).log" echo "=== RAC Health Check $(date) ===" > $LOGFILE # 检查CRS状态 echo "1. CRS Status:" >> $LOGFILE crsctl check crs 2>&1 >> $LOGFILE # 检查资源状态 echo "2. Resource Status:" >> $LOGFILE crsctl status resource -t 2>&1 >> $LOGFILE # 检查ASM磁盘组 echo "3. ASM Diskgroups:" >> $LOGFILE su - grid -c "sqlplus / as sysasm <<EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT name, state, total_mb, free_mb FROM v\$asm_diskgroup; EXIT; EOF" 2>&1 >> $LOGFILE # 检查数据库实例 echo "4. DB Instances:" >> $LOGFILE su - oracle -c "srvctl status database -d racdb" 2>&1 >> $LOGFILE # 发送邮件告警(若异常) if grep -q "OFFLINE\|FAILED\|ERROR" $LOGFILE; then mail -s "RAC Health Alert" admin@company.com < $LOGFILE fi此脚本将关键状态汇总到日志,并在发现OFFLINE等关键词时自动邮件告警。
5.2 备份与恢复策略:RMAN+ASM的黄金组合
RAC备份必须考虑集群特性:
归档日志位置:必须放在ASM磁盘组(如
+FRA),而非本地文件系统,否则节点切换时归档路径不可见。RMAN备份脚本:
#!/bin/bash export ORACLE_SID=racdb1 rman target / <<EOF CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET; BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG DELETE INPUT; BACKUP CURRENT CONTROLFILE FOR STANDBY; EOFPARALLELISM 2利用双节点并行备份,DELETE INPUT确保归档日志不堆积。灾难恢复演练:每月执行一次
RESTORE CONTROLFILE FROM AUTOBACKUP,验证备份有效性。关键点:恢复控制文件后,必须执行ALTER DATABASE MOUNT,再RECOVER DATABASE,最后ALTER DATABASE OPEN RESETLOGS。
5.3 性能调优锚点:从gc buffer busy acquire到AWR报告解读
RAC性能瓶颈常出现在全局缓存(Global Cache)争用:
核心等待事件:
gc buffer busy acquire:节点间频繁请求同一数据块,需检查热点对象(如索引根块)。enq: TX - row lock contention:跨节点事务锁冲突,优化应用事务粒度。db file sequential read:单块读慢,检查存储IO延迟(iostat -x 1)。
AWR报告关键页:
- Top 5 Timed Events:定位最高耗时等待事件。
- Instance Activity Stats:关注
gc cr blocks received(远程一致性读块数),若>1000/秒,说明跨节点读频繁。 - SQL Statistics:按
Buffer Gets排序,找出高逻辑读SQL,检查其执行计划是否走全表扫描。
优化建议: