Oracle Grid Infrastructure (GI) 是 RAC 架构的基石,负责集群管理、存储管理、网络管理三大核心功能。然而,很多 DBA 对 GI 的理解仅停留在 crsctl start/stop 的层面,一旦遇到 OCR 损坏、Voting Disk 丢失、SCAN IP 漂移等生产故障,往往束手无策。本文将从底层机制出发,深入剖析 GI 的核心组件与启动逻辑,帮助读者建立对 GI 架构的系统性认知。
一、问题背景 在日常运维中,我们经常遇到这样的场景:
某次存储故障导致 OCR 所在磁盘组不可用,整个 RAC 集群瞬间宕机
网络抖动触发 Voting Disk 仲裁失败,节点被逐出集群
SCAN IP 无法解析,大量应用连接失败
这些问题的根源在于我们对 GI 底层机制的理解不够深入。只会用 srvctl 和 crsctl 管理集群,却不了解它们背后的运行逻辑,就像会开车却不懂发动机原理——平时没问题,出故障就抓瞎。
本文基于 Oracle 12c/19c 版本,部分内容在 11gR2 中有差异,会在文中注明。参考了 roger wiki 的 RAC 内部机制分析以及多篇 MOS 文档。
二、理论分析 2.1 GI 架构概览 在深入各组件之前,先用文字描述一下 GI 的整体架构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ┌─────────────────────────────────────────────────────┐ │ 应用层 / 数据库层 │ │ Oracle RAC Database Instances │ ├─────────────────────────────────────────────────────┤ │ 资源管理层 (CRSD) │ │ Database / Service / Listener / VIP / SCAN VIP │ ├─────────────────────────────────────────────────────┤ │ 集群同步层 (OCSSD) │ │ CSS (Cluster Synchronization Services) │ │ Voting Disk / 网络心跳 │ ├─────────────────────────────────────────────────────┤ │ 集群注册表层 │ │ OCR (Cluster Registry) │ │ GPNP (Grid Plug and Play) │ ├─────────────────────────────────────────────────────┤ │ 基础服务层 (OHASD) │ │ OHASD -> CSSDAGENT -> OCSSD │ │ ASM / 网络 / 存储管理 │ ├─────────────────────────────────────────────────────┤ │ 操作系统 / 网络 / 存储 │ └─────────────────────────────────────────────────────┘
GI 的层次关系可以概括为:OHASD 是最底层的守护进程,负责启动整个集群栈;OCSSD 负责节点间的心跳同步和脑裂仲裁;CRSD 负责管理所有集群资源;ASM 负责存储管理。 这些组件的启动有严格的顺序依赖关系,下文会详细分析。
2.2 OCR (Oracle Cluster Registry) 2.2.1 OCR 的作用与存储结构 OCR 是整个 RAC 集群的”配置中心”,存储了以下关键信息:
集群节点列表与节点编号
数据库、实例、Service 的配置信息
VIP、SCAN VIP、Listener 的网络配置
ASM 磁盘组配置
资源的属性(如 AUTO_START、START_DEPENDENCIES 等)
OCR 的存储结构经历了重大演变:
版本
存储位置
冗余方式
10g/11gR1
共享裸设备/OCFS
OCR + OCR Mirror(最多2份)
11gR2+
ASM 磁盘组
Normal Redundancy = 3份副本,High = 5份
12c+
ASM 磁盘组
同 11gR2,但引入了 OCR 备份存储在 ASM 中
在 11.2.0.2+ 中,OCR 默认存储在 ASM 磁盘组中(通常是 +CRS 磁盘组),Oracle 会在磁盘组中创建一个名为 SYSTEMDG 的文件来存储 OCR。这种设计的好处是利用了 ASM 的镜像机制来保护 OCR,而不再需要单独管理 OCR Mirror。
2.2.2 OCR 的备份机制 OCR 有三种备份方式:
1) 自动备份
CRSD 进程会按照以下策略自动备份 OCR:
每 4 小时 :保留最近 3 次备份
每天一次 :保留最近 1 天的备份
每周一次 :保留最近 1 周的备份
备份文件存储在 $GRID_HOME/cdata/<cluster_name>/ 目录下。
2) 手动备份
1 2 3 4 5 6 7 ocrconfig -manualbackup ocrconfig -showbackup manual node1 2026/06/05 10:30:15 /u01/app/19c/grid/cdata/rac-cluster/backup_20260605_103015.ocr
3) 逻辑导出
1 2 ocrconfig -export /tmp/ocr_export_$(date +%Y%m%d).bak
最佳实践 :每次 CRS 变更(添加/删除节点、修改网络配置)前,手动执行 ocrconfig -manualbackup 和 ocrconfig -export。MOS Doc ID 394654.1 详细介绍了 OCR 的备份与恢复策略。
2.2.3 OCR 恢复流程 当 OCR 出现损坏时,可以使用以下流程恢复:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 crsctl stop crs -f crsctl start crs -excl ocrconfig -showbackup ocrconfig -restore /u01/app/19c/grid/cdata/rac-cluster/backup_20260604_040000.ocr crsctl stop crs -f crsctl start crs
注意 :如果使用的是 12c+ 且 OCR 存储在 ASM 中,恢复时需要确保 ASM 磁盘组已经 mount。
2.3 Voting Disk 2.3.1 Voting Disk 的作用 Voting Disk 是 RAC 集群的”仲裁者”,承担两个核心职责:
1) 节点健康检查
每个节点的 OCSSD 进程会定期向 Voting Disk 写入心跳信息(称为 disk heartbeat )。如果某个节点在 Misscount(默认 30 秒)内没有写入心跳,其他节点会认为该节点”死亡”,并将其从集群中驱逐。
2) 脑裂仲裁(Split Brain Resolution)
当集群网络发生分区(网络分裂)时,可能出现两个分区都认为自己是”活的”。此时,Voting Disk 的仲裁机制发挥作用:
每个分区的节点都会尝试读取 Voting Disk 中其他节点的心跳信息
拥有多数节点 (> N/2)的分区胜出,继续运行
少数节点分区被驱逐(eviction)
1 2 3 4 5 节点A ──┐ ┌── 节点B 节点C ──┤ 网络分区 ├── 节点D └─────────┘ 分区1: 2个节点 → 胜出,继续运行 分区2: 2个节点 → 投票决定,取决于 Voting Disk 的仲裁结果
关键参数 :
Misscount:默认 30 秒(12c+ 中可配置),超过此时间未写入 Voting Disk 则认为节点死亡
Disktimeout:默认 200 秒,Voting Disk I/O 操作的超时时间
Reboottime:节点被驱逐后的等待重启时间,默认 3 秒
2.3.2 Voting Disk 的存储演变 与 OCR 类似,Voting Disk 在 11gR2+ 中也存储在 ASM 磁盘组中:
1 2 3 4 5 6 7 8 9 crsctl query css votedisk -- ----- ----------------- --------- --------- 1. ONLINE a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 (DATA01) [DATA] 2. ONLINE b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7 (DATA02) [DATA] 3. ONLINE c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8 (DATA03) [DATA] Located 3 voting file(s).
冗余要求:
External Redundancy:至少 1 个 Voting Disk
Normal Redundancy:至少 3 个 Voting Disk(推荐)
High Redundancy:至少 5 个 Voting Disk
重要提醒 :在 11gR2 之前,Voting Disk 可以存储在裸设备或 OCFS 上,需要手动管理冗余。11gR2 之后,Voting Disk 的冗余完全由 ASM 管理。MOS Doc ID 1388755.1 详细说明了 11gR2 中 Voting Disk 存储在 ASM 中的变化。
2.4 SCAN (Single Client Access Name) 2.4.1 SCAN 的原理 SCAN 是 11gR2 引入的客户端连接抽象层,其核心设计思想是:让客户端连接与集群节点解耦 。
1 2 3 4 5 6 7 8 客户端应用 │ ▼ SCAN Name: scan.example.com │ ├── SCAN VIP 1 (192.168.1.100) → SCAN Listener 1 → Node1 Local Listener → Instance1 ├── SCAN VIP 2 (192.168.1.101) → SCAN Listener 2 → Node2 Local Listener → Instance2 └── SCAN VIP 3 (192.168.1.102) → SCAN Listener 3 → Node1 Local Listener → Instance1
SCAN 的关键特性:
3 个 SCAN VIP :Oracle 推荐配置 3 个 SCAN VIP,通过 DNS 解析返回 3 个 IP 地址(round-robin)
2 个 SCAN Listener :默认情况下,Oracle 只会启动 2 个 SCAN Listener(在不同节点上),因为 2 个 Listener 就能服务 3 个 VIP
DNS 或 GNS 解析 :SCAN Name 必须通过 DNS 或 GNS (Grid Naming Service) 解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 srvctl config scan SCAN name: scan.example.com, Network: 1 Subnet IPv4: 192.168.1.0/255.255.255.0/eth0, static Subnet IPv6: SCAN 1 IPv4 VIP: 192.168.1.100/255.255.255.0 SCAN 2 IPv4 VIP: 192.168.1.101/255.255.255.0 SCAN 3 IPv4 VIP: 192.168.1.102/255.255.255.0 srvctl config scan_listener SCAN Listener LISTENER_SCAN1 exists. Port: TCP:1521 SCAN Listener LISTENER_SCAN2 exists. Port: TCP:1521 SCAN Listener LISTENER_SCAN3 exists. Port: TCP:1521
2.4.2 SCAN Listener 与 Local Listener 的关系 这是很多 DBA 容易混淆的地方。理解这个关系对性能调优和故障排查至关重要:
1 客户端 → SCAN Listener → Local Listener → 数据库实例
完整连接流程:
客户端使用 SCAN Name 连接数据库(如 jdbc:oracle:thin:@scan.example.com:1521/service_name)
DNS 返回 3 个 SCAN VIP 中的一个(round-robin)
客户端连接到对应的 SCAN Listener
SCAN Listener 根据负载均衡算法选择一个 Local Listener
SCAN Listener 将请求重定向(redirect)到 Local Listener
Local Listener 建立与数据库实例的连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 srvctl status scan_listener SCAN Listener LISTENER_SCAN1 is enabled SCAN Listener LISTENER_SCAN1 is running on node node2 SCAN Listener LISTENER_SCAN2 is enabled SCAN Listener LISTENER_SCAN2 is running on node node1 SCAN Listener LISTENER_SCAN3 is enabled SCAN Listener LISTENER_SCAN3 is running on node node2 srvctl config listener -l LISTENER Name: LISTENER Type: Database Listener Network: 1, Owner: grid Home: <CRS home> End points: TCP:1521 Listener is enabled. Listener is individually enabled on nodes: Listener is individually disabled on nodes:
2.4.3 SCAN 的负载均衡机制 SCAN 提供了两层负载均衡:
第一层:DNS Round-Robin
客户端解析 SCAN Name 时,DNS 返回 3 个 IP 中的一个。这是最基本的负载分散机制。
第二层:SCAN Listener 智能路由
SCAN Listener 会根据各节点的负载情况,将连接请求路由到负载最低的节点。这个信息来自 PMON 进程注册到 Listener 中的 Load 指标。
11.2 vs 12c 的差异 :12c 引入了 Remote Listener 的概念,Local Listener 和 SCAN Listener 都注册到 Remote Listener,实现了更灵活的连接路由。此外,12c 的 SCAN 支持 IPv6 和 TLS 加密连接。
2.4.4 SCAN IP 变更流程 生产环境中,SCAN IP 变更是一个常见需求(如网络迁移)。正确的变更流程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 srvctl stop scan_listener srvctl stop scan srvctl modify scan -scanname scan.newdomain.com srvctl modify scan -scanname scan.example.com -netnum 1 srvctl start scan srvctl start scan_listener srvctl config scan srvctl status scan_listener
重要 :修改 SCAN IP 后,必须同步更新 DNS 记录或 /etc/hosts 文件(仅测试环境)。生产环境强烈建议使用 DNS 解析。
2.5 GPNP Profile 2.5.1 GPNP 的作用 GPNP (Grid Plug and Play) 是 11gR2 引入的集群配置管理框架,其核心作用是:
存储集群网络配置 :节点名称、网络接口、IP 地址等
支持动态添加/删除节点 :新节点加入集群时自动获取配置
与 OUI 集成 :安装 GI 时自动创建和分发 GPNP Profile
GPNP Profile 存储在 $GRID_HOME/gpnp/<hostname>/profiles/peer/profile.xml 文件中。
2.5.2 profile.xml 文件解析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?xml version="1.0" encoding="UTF-8" ?> <gpn:GpnPProfile xmlns:gpnp ="http://www.oracle.com/GpnP/Profile" version ="11.2.0.4.0" ... <gpnp:Network-Profile > <gpnp:HostNetwork id ="gen" HostName ="node1" > <gpnp:Network id ="net1" Adapter ="eth0" IP ="subnet" Prefix ="24" Use ="cluster_interconnect" /> <gpnp:Network id ="net2" Adapter ="eth1" IP ="public" Prefix ="24" Use ="public" /> </gpnp:HostNetwork > <gpnp:Network id ="net3" Adapter ="eth2" IP ="192.168.10.0" Prefix ="24" Use ="public" /> </gpnp:Network-Profile > <orcl:CSS-Profile id ="css" DiscoveryString ="+asm" LeaseDuration ="400" /> <orcl:ASM-Profile id ="asm" DiscoveryString ="/dev/sd*" SPFile ="+CRS/rac-cluster/ASMPARAMETERFILE/registry.253.xxx" /> </gpn:GpnPProfile >
注意 :不要手动修改 profile.xml,这会导致集群配置不一致。如果 profile.xml 损坏,可以使用 gpnptool 工具从其他节点获取正确的版本。
1 2 3 4 5 gpnptool get -o- 2>/dev/null | xmllint --format - gpnptool getpval -asm_dis -pval 2>/dev/null
2.6 GI 集群启动过程 理解 GI 的启动顺序是排查集群启动故障的关键。整个启动过程可以分为以下几个阶段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [OS启动] │ ▼ [init/systemd 启动 ohasd.service] │ ▼ OHASD (Oracle High Availability Services Daemon) │ ├──→ CSSDAGENT ──→ OCSSD (集群同步服务) │ │ │ ├── 读取 Voting Disk │ ├── 建立节点间心跳 │ └── 完成集群成员发现 │ ├──→ ORAROOTAGENT ──→ 网络资源(VIP、SCAN VIP、Node VIP) │ ├──→ GPNPD (Grid Plug and Play Daemon) │ └── 加载 profile.xml │ └──→ CTSSD (Cluster Time Synchronization Service) └── 时间同步检查 │ ▼ [OCSSD 就绪,集群成员确认] │ ▼ CRSD (Cluster Ready Services Daemon) │ ├──→ 读取 OCR │ ├──→ ORAROOTAGENT │ ├── 启动 Node VIP │ ├── 启动 SCAN VIP │ └── 启动 Network Resource │ └──→ ORAAGENT (grid 用户) ├── 启动 ASM 实例 ├── 启动 SCAN Listener └── 启动 Local Listener │ ▼ [CRSD 就绪,可以管理数据库资源] │ ▼ ORAAGENT (oracle 用户) ├── 启动数据库实例 ├── 启动数据库 Service └── 启动数据库 Listener(如果使用独立 Listener)
各守护进程的职责
进程
全称
职责
OHASD
Oracle High Availability Services Daemon
最底层守护进程,管理所有本地资源
OCSSD
Oracle Cluster Synchronization Services Daemon
集群同步、节点发现、脑裂仲裁
CSSDAGENT
CSS Daemon Agent
监控 OCSSD 健康状态,负责节点驱逐
CRSD
Cluster Ready Services Daemon
管理集群资源(数据库、Service、VIP 等)
CTSSD
Cluster Time Synchronization Service Daemon
集群节点时间同步
GPNPD
Grid Plug and Play Daemon
管理 GPNP Profile
EVMD
Event Manager Daemon
集群事件管理
关键日志位置 排查 GI 启动问题时,需要关注以下日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $GRID_HOME /log/<hostname>/ohasd/ohasd.log$GRID_HOME /log/<hostname>/cssd/ocssd.log$GRID_HOME /log/<hostname>/crsd/crsd.log$GRID_HOME /log/<hostname>/asm/asm_<+ASM1>.log $GRID_HOME /log/<hostname>/alert<hostname>.log $GRID_HOME /log/<hostname>/cssd/cssdOUT.log
三、实战操作 3.1 OCR 管理 3.1.1 检查 OCR 状态 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ocrcheck Status of Oracle Cluster Registry is as follows : Version : 4 Total space (kbytes) : 409600 Used space (kbytes) : 3456 Available space (kbytes) : 406144 ID : 1234567890 Device/File Name : +CRS Device/File integrity check succeeded Device/File not configured Device/File not configured Device/File not configured Device/File not configured Cluster registry integrity check succeeded Logical corruption check bypassed due to insufficient quorum
解读 :12c+ 中,OCR 存储在 ASM 磁盘组中,Device/File Name 显示的是磁盘组名称(如 +CRS)。如果配置了 Normal Redundancy,ASM 会自动维护 3 份 OCR 副本。
3.1.2 OCR 备份 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ocrconfig -manualbackup node1 2026/06/05 10:30:15 /u01/app/19c/grid/cdata/rac-cluster/backup_20260605.ocr node2 2026/06/04 22:00:10 /u01/app/19c/grid/cdata/rac-cluster/backup_20260604.ocr ocrconfig -showbackup auto node1 2026/06/05 06:00:00 /u01/app/19c/grid/cdata/rac-cluster/backup00.ocr node1 2026/06/05 02:00:00 /u01/app/19c/grid/cdata/rac-cluster/backup01.ocr node1 2026/06/04 22:00:00 /u01/app/19c/grid/cdata/rac-cluster/backup02.ocr node1 2026/06/04 18:00:00 /u01/app/19c/grid/cdata/rac-cluster/day.ocr node1 2026/05/29 06:00:00 /u01/app/19c/grid/cdata/rac-cluster/week.ocr ocrconfig -export /tmp/ocr_export_20260605.bak
3.1.3 添加/删除 OCR 镜像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ocrcheck ocrconfig -add +DATA ocrcheck Status of Oracle Cluster Registry is as follows : Version : 4 Total space (kbytes) : 409600 Used space (kbytes) : 3456 Available space (kbytes) : 406144 ID : 1234567890 Device/File Name : +CRS Device/File integrity check succeeded Device/File Name : +DATA Device/File integrity check succeeded ocrconfig -delete +DATA
MOS 参考 :Doc ID 394654.1 - OCR / Voting Disk Location and Management
3.2 Voting Disk 管理 3.2.1 查看 Voting Disk 状态 1 2 3 4 5 6 7 8 crsctl query css votedisk -- ----- ----------------- --------- --------- 1. ONLINE a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 (DATA01) [DATA] 2. ONLINE b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7 (DATA02) [DATA] 3. ONLINE c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8 (DATA03) [DATA] Located 3 voting file(s).
3.2.2 添加/删除 Voting Disk 1 2 3 4 5 6 7 8 9 crsctl add css votedisk +FLASH crsctl delete css votedisk a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
重要提醒 :在 11gR2+ 中,如果 Voting Disk 存储在 Normal Redundancy 的 ASM 磁盘组中,ASM 会自动维护 3 份 Voting Disk 副本。你无法手动添加或删除单个 Voting Disk,只能将 Voting Disk 整体迁移到另一个磁盘组。
3.3 SCAN 管理 3.3.1 查看 SCAN 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 srvctl config scan SCAN name: scan.example.com, Network: 1 Subnet IPv4: 192.168.1.0/255.255.255.0/eth0, static Subnet IPv6: SCAN 1 IPv4 VIP: 192.168.1.100/255.255.255.0 SCAN 2 IPv4 VIP: 192.168.1.101/255.255.255.0 SCAN 3 IPv4 VIP: 192.168.1.102/255.255.255.0 srvctl status scan_listener SCAN Listener LISTENER_SCAN1 is enabled SCAN Listener LISTENER_SCAN1 is running on node node2 SCAN Listener LISTENER_SCAN2 is enabled SCAN Listener LISTENER_SCAN2 is running on node node1 SCAN Listener LISTENER_SCAN3 is enabled SCAN Listener LISTENER_SCAN3 is running on node node2 nslookup scan.example.com Server: 192.168.1.1 Address: 192.168.1.1#53 Name: scan.example.com Address: 192.168.1.100 Name: scan.example.com Address: 192.168.1.101 Name: scan.example.com Address: 192.168.1.102
3.3.2 SCAN IP 变更完整流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 srvctl stop scan_listener srvctl stop scan srvctl modify scan -scanname scan.newdomain.com srvctl modify scan -scanname scan.example.com srvctl start scan srvctl start scan_listener srvctl status scan srvctl status scan_listener nslookup scan.example.com
3.4 GI 启动诊断 3.4.1 启动失败诊断流程 当 GI 启动失败时,建议按照以下顺序排查:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 tail -100 $GRID_HOME /log/$(hostname)/ohasd/ohasd.logtail -100 $GRID_HOME /log/$(hostname)/alert$(hostname).log tail -100 $GRID_HOME /log/$(hostname)/cssd/ocssd.logcrsctl stat res -t -init srvctl status asm asmcmd lsdg
3.4.2 日志收集工具 Oracle 提供了 diagcollection.sh 工具,可以一键收集所有 GI 相关日志:
1 2 3 4 5 $GRID_HOME /bin/diagcollection.pl --collect --crs --crshome $GRID_HOME
3.4.3 紧急启动模式 当 CRS 无法正常启动时,可以使用 exclusive 模式进行紧急操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 crsctl start crs -excl crsctl stop crs -f crsctl start crs
注意 :crsctl start crs -excl 会在当前节点启动一个简化的 CRS 栈,不进行集群成员验证。这在 OCR 或 Voting Disk 损坏时非常有用。
3.4.4 常见启动故障及解决方案 故障 1:OHASD 无法启动
1 2 3 4 5 6 7 8 9 10 crsctl stop crs -f kill -9 $(pgrep -f ohasd)crsctl start crs
故障 2:OCSSD 无法加入集群
1 2 3 4 5 6 7 8 9 ping -c 3 <node2-priv-ip> iptables -L -n | grep 1521
故障 3:CRSD 启动失败(OCR 不可访问)
1 2 3 4 5 6 7 8 9 10 crsctl start crs -excl asmcmd lsdg sqlplus / as sysasm ALTER DISKGROUP DATA MOUNT;
四、结果验证 GI 安装或变更后,需要执行以下验证命令确认集群状态正常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 crsctl check cluster -all node1: CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online node2: CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online ocrcheck Status of Oracle Cluster Registry is as follows : Version : 4 Total space (kbytes) : 409600 Used space (kbytes) : 3456 Available space (kbytes) : 406144 ID : 1234567890 Device/File Name : +CRS Device/File integrity check succeeded Cluster registry integrity check succeeded crsctl query css votedisk -- ----- ----------------- --------- --------- 1. ONLINE a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 (DATA01) [DATA] 2. ONLINE b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7 (DATA02) [DATA] 3. ONLINE c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8 (DATA03) [DATA] Located 3 voting file(s). srvctl status scan_listener SCAN Listener LISTENER_SCAN1 is enabled SCAN Listener LISTENER_SCAN1 is running on node node2 SCAN Listener LISTENER_SCAN2 is enabled SCAN Listener LISTENER_SCAN2 is running on node node1 SCAN Listener LISTENER_SCAN3 is enabled SCAN Listener LISTENER_SCAN3 is running on node node2 crsctl stat res -t asmcmd lsdg oifcfg getif eth0 192.168.1.0 global public eth1 10.10.10.0 global cluster_interconnect
五、经验总结 5.1 GI 日常巡检要点 建议将以下命令纳入日常巡检脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/bin/bash echo "=== 集群状态检查 ===" crsctl check cluster -all echo "=== OCR 状态检查 ===" ocrcheck echo "=== Voting Disk 状态检查 ===" crsctl query css votedisk echo "=== SCAN Listener 状态 ===" srvctl status scan_listener echo "=== ASM 磁盘组状态 ===" asmcmd lsdg echo "=== CRS 资源状态 ===" crsctl stat res -t echo "=== 集群告警日志最近 50 行 ===" tail -50 $GRID_HOME /log/$(hostname)/alert$(hostname).log
5.2 OCR/Voting Disk 备份策略
备份项目
频率
保留策略
工具
OCR 自动备份
每 4 小时
保留最近 3 次
CRSD 自动执行
OCR 手动备份
每次变更前
永久保留
ocrconfig -manualbackup
OCR 逻辑导出
每周一次
保留最近 4 周
ocrconfig -export
GPNP Profile
每次变更前
永久保留
gpnptool get
5.3 SCAN 配置的最佳实践
始终使用 DNS 解析 SCAN Name ,不要在生产环境使用 /etc/hosts
配置 3 个 SCAN VIP ,确保 DNS 返回 3 个 IP 地址
定期验证 DNS 解析 :nslookup scan.example.com 应返回 3 个 IP
SCAN Listener 的端口统一使用 1521 ,避免应用连接配置复杂化
不要将 SCAN VIP 绑定到特定节点 ,让 Oracle 自动管理 SCAN Listener 的分布
5.4 常见 GI 故障的快速定位方法
故障现象
可能原因
排查方向
CRS 启动失败
OCR 损坏
查看 ohsd.log、crsd.log
节点频繁驱逐
网络抖动/存储超时
查看 cssd.log、检查 Misscount
SCAN IP 无法解析
DNS 配置错误
nslookup、检查 DNS 记录
ASM 实例无法启动
磁盘组损坏
查看 asm alert log、asmcmd lsdg
VIP 漂移异常
网络配置错误
oifcfg getif、检查网卡配置
集群时间不同步
NTP/CTSS 配置问题
查看 ctssd.log、检查时钟偏移
5.5 推荐 MOS 文档
Doc ID
标题
适用场景
394654.1
OCR / Voting Disk Location and Management
OCR/Voting Disk 管理
1068982.1
How to restore OCR from backup
OCR 恢复
1388755.1
Changes in 11.2.0.2 with Voting Disk on ASM
Voting Disk 存储变化
1481369.1
SCAN VIP and Listener Configuration
SCAN 配置
1323538.1
11gR2 Clusterware Startup Sequence
集群启动顺序
总结 GI 是 RAC 架构的核心,深入理解其底层机制对于 DBA 至关重要。本文从 OCR、Voting Disk、SCAN、GPNP、集群启动过程五个维度,系统性地分析了 GI 的内部工作原理,并提供了丰富的实战操作命令和故障排查方法。
核心要点回顾:
OCR 是集群配置中心,12c+ 存储在 ASM 中,利用 ASM 冗余机制保护
Voting Disk 是集群仲裁者,负责节点健康检查和脑裂解决
SCAN 是客户端连接抽象层,通过 DNS 解析和 SCAN Listener 实现负载均衡
GPNP 存储集群网络配置,支持动态节点管理
集群启动 有严格的顺序依赖:OHASD → CSSDAGENT → OCSSD → CRSD
掌握这些知识,不仅能帮助你在生产故障中快速定位问题,更能让你在架构设计和容量规划时做出更明智的决策。作为 OCM 认证的 DBA,我始终认为:深入理解底层原理,才是区分高级 DBA 和普通 DBA 的关键。