19c RAC安装避坑:THP、HugePages与GNS配置
简介:《Oracle 19c RAC on Linux 7.6安装手册》面向在 Red Hat Enterprise Linux 7.6 上部署 Oracle 19c RAC 的数据库运维、架构与实施人员,重点解决 GNS 配置 SCAN、Flex ASM 使用以及集群模式选型等实际问题,也可作为安装前的检查清单与实施参考。文档按落地顺序梳理 OS 环境检查、透明大页关闭与 Hugepages 开启、软件包安装、内核参数配置,以及固定网络和 GNS+固定网络两种网络方案,并补充时钟同步等系统准备事项;同时说明从 12.2 开始 Standalone Cluster 与 Domain Service Cluster 两类集群模式的差异,给出配置受阻时的分析与处理思路,帮助读者理解问题出现的环节和验证路径。压缩包内含 1 个 docx 文件,约 160KB,内容集中、便于现场随查随用;已有 719 人学习下载。读者可借此建立 19c RAC 安装前的系统与网络规划框架,理解 GNS 配置 SCAN 的落地方式,掌握常见问题的排查方向,并对照目录快速定位系统准备与网络配置中的关键项。
1. 两节点装到 70% 被弹回来,问题早在第 2 章就埋下了
前阵子帮人复盘一套 19c RAC Linux 7.6 安装,两个节点、共享存储、IP 规划写得清清楚楚,按手册一步步走,结果 gridSetup.sh 跑到 ASM 那一步直接弹回去,日志里只有一句看不出因果的 CSS 报错。翻回去查,发现装系统时没人关透明大页面,HugePages 也没配,SGA 想锁内存锁不上。
这类配方在 Oracle 圈子里太常见了:Linux 7.6 + 19c Grid Infrastructure + 两节点 RAC + ASM 存 OCR 和投票盘。装得顺,一个下午收工;装不顺,光排错能磨三天。而且九成的坑不在 gridSetup.sh 那一步,在前面那些“看起来不重要”的系统基线里。这篇就把 19c RAC Linux 7.6 安装从环境核对、THP 与 HugePages、软件包与内核参数、网络与 GNS 一路写到排错和验证,照着走能复现。
2. 环境检查与系统基线:8G 内存起步,THP 必须先关
19c 对操作系统的要求比 11g 时代收紧了不少,但也谈不上苛刻,真正麻烦的是这些要求分散在内存、swap、共享内存、内核版本、运行级别好几个地方,漏一项就要在装到一半时返工。我一般把这一章当成“开机自检”,全部核对完再动手装任何东西,因为后面每一步都建立在它上面。
2.1 先核对这七项资源,不够后面全白搭
把下面这张表当成清单,一条条在节点上敲命令确认,两个节点都要做,不要只查一个就当另一个也一样。
| 检查项 | 要求 | 检查命令 |
|---|---|---|
| 内存 | 至少 8G | grep MemTotal /proc/meminfo |
| swap | 4~16G 时等于内存;超过 16G 时给 16G;启用 HugePages 要减去大页占用 | grep SwapTotal /proc/meminfo |
| /tmp | 至少 1G | df -h /tmp |
| /dev/shm | 挂载类型为 tmpfs,权限正常 | df -h /dev/shm |
| 软件空间 | Grid 至少 12G,Oracle 至少 10G,建议直接给 100G | df -h /u01 |
| 运行级别 | 3 或 5 | runlevel |
| 内核版本 | RHEL 7.4 及以上,7.6 对应 3.10.0-957 及以上 | uname -mr、cat /etc/redhat-release |
swap 那一行是最容易被忽略的。很多人按“内存 16G 就给 16G swap”配完,然后再去开 HugePages,结果 cluvfy 报 swap 不足——因为大页是从内存里预扣的,swap 的计算基数要相应减掉。这个顺序反了就得重来一遍,属于典型的血泪经验。
/dev/shm也要专门看一眼。19c 的 ASM 和集群组件会用到它,如果被调得过小,后面会以 ORA-00845 的形式冒出来,报错信息跟 shm 本身没有半点关系,第一次遇到很容易懵。
2.2 禁用透明大页面:改 grub 比 echo never 靠谱
THP 对 Oracle 来说是玄学级的存在:它不一定会立刻出问题,但只要出问题,表现就是随机变慢、实例偶尔卡住、ASM 启动超时,排查起来极其难受。标准做法是在内核启动参数里彻底关掉,而不是往/sys里 echo 一下了事。
先确认当前状态,方括号包住的那一项就是生效值:
# 查看透明大页面是否开启 cat /sys/kernel/mm/transparent_hugepage/enabled # [always] madvise never # 查看碎片整理功能是否开启 cat /sys/kernel/mm/transparent_hugepage/defrag # [always] madvise never如果看到[always],就说明是开着的,需要改 grub。编辑/etc/default/grub,在GRUB_CMDLINE_LINUX末尾追加参数:
vi /etc/default/grub # 在原有内容后面追加,注意保留原有参数不要覆盖 GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap ... transparent_hugepage=never"改完先备份配置文件,再按固件类型重建。这一步翻车的概率不低,主要是把 BIOS 机器和 UEFI 机器的输出路径搞混:
# 备份原配置 cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak # BIOS 机器 grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 机器 grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg # 重启并验证 shutdown -r now cat /proc/cmdline/proc/cmdline里能看到transparent_hugepage=never才算真正生效。如果只是echo never > enabled,重启后一定回弹,不要自欺欺人。
注意:两个节点都要改,且必须重启。只改一个节点,后面 cluvfy 会直接给你标出来。
2.3 开启 HugePages:nr_hugepages 和 memlock 要一起算
HugePages 和 THP 是两回事,前者是显式预分配的固定大页,Oracle 官方一直推荐开;后者是内核自动合并,官方一直推荐关。这两个概念经常被混为一谈,导致有人关了 THP 就以为大页也配好了。
配置分两步,第一步算页数,第二步放权限。页数按 SGA 总量除以 2M 换算:
vi /etc/sysctl.conf # 假设两个实例 SGA 各 8G,共 16G,换算成 2M 页为 8192 页 # 再留 5%~10% 余量,取 8700 页 vm.nr_hugepages = 8700 # 生效 sysctl -p如果安装时选择配置 GIMR(19c Standalone Cluster 下 GIMR 是可选项),要把 GIMR 的 SGA 大约 1G 也算进去,否则集群起来后 MGMTDB 会因为锁不到内存而反复重启。选 Domain Services Cluster 模式时 GIMR 是必须的,这一块不能省。
第二步是让 oracle 用户有权锁住这些内存,memlock的单位是 KB:
vi /etc/security/limits.conf # 8700 页 × 2048KB = 17817600KB,取整给 18000000 oracle soft memlock 18000000 oracle hard memlock 18000000改完用ulimit -l在 oracle 用户下确认。很多人只改了 sysctl 没改 limits,结果 HugePages 分配成功但实例起不来,报的还是内存类错误,绕一大圈才回到这个文件。
3. 软件包与内核参数:preinstall RPM 还是手工 sysctl
这一章是本篇最容易被写成“复制粘贴清单”的地方,但实际装的时候,真正花时间的是判断该走哪条路:用官方 preinstall RPM 一把配完,还是手工写 sysctl 和 limits。两条路都能通,差别在可控性和可复现性。我的习惯是先用 RPM 打底,再逐项核对它改了什么,不完全依赖它。
3.1 19c 必须的包,别指望装完再补
RHEL 7.6 最小化安装出来的系统缺一堆库,而 Oracle 的安装程序在检查阶段不会一次性告诉你全部缺什么,经常是你补一个它再报一个。所以下面这批包我一般一次性装完:
yum install -y bc binutils compat-libcap1 compat-libstdc++ \ elfutils-libelf elfutils-libelf-devel fontconfig-devel \ glibc glibc-devel ksh libaio libaio-devel \ libX11 libXau libXi libXtst libXrender libXrender-devel \ libgcc librdmacm-devel libstdc++ libstdc++-devel libxcb \ make net-tools nfs-utils smartmontools sysstat unzip逐项说一下为什么在里面。compat-libcap1和compat-libstdc++是 OUI 图形界面依赖的,缺了会表现为安装界面弹不出来,而不是报缺包;libaio和libaio-devel是 ASM 异步 IO 的基础,缺了实例能起来但性能会很难看;net-tools里的ifconfig在 RAC 和 Clusterware 的脚本里还有引用,不带的话部分检查脚本会静默跳过。
ACFS 相关的几个包是可选的,但如果打算用 ACFS 放归档或者做远程复制,就要一起装上:
yum install -y python python-configshell python-rtslib \ python-six targetcli提示:
ksh一定要装。Grid Infrastructure 的不少脚本是 ksh 写的,缺了会以“命令找不到”的形式失败,日志里不太显眼。
3.2 preinstall RPM 到底改了什么
Oracle Linux 和 RHEL 都可以直接用官方预安装包,这是最省事的一条路:
cd /etc/yum.repos.d/ wget http://yum.oracle.com/public-yum-ol7.repo yum repolist yum install -y oracle-database-preinstall-19c这个包做的事比想象中多,列清楚才知道哪些还需要手工补:
- 创建
oracle用户,创建oinstall(oraInventory 属主)和dba(OSDBA)组; - 写
/etc/sysctl.conf,把 Oracle 建议的内核参数一次性配好; - 设置 hard / soft 用户资源限制,写进
/etc/security/limits.d/; - 设置
numa=off,这个在内核参数里,需要重启才生效; - 按内核版本补一些额外建议参数。
numa=off是 19c 上比较有争议的一项,preinstall 默认关掉,实际生产里如果 NUMA 调优做得好也可以保留,但 RAC 场景下我一般跟随默认,先关掉,避免节点间心跳抖动。要保留的话记得在 grub 里显式写回来。
3.3 手工 sysctl:每个参数为什么是这个值
不用预安装包的话,内核参数得自己写。19c 建议放到独立文件里,不要直接改/etc/sysctl.conf,方便以后回滚:
vi /etc/sysctl.d/97-oracledatabase-sysctl.conf fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 4294967295 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576fs.aio-max-nr:异步 IO 请求上限,ASM 磁盘多的时候容易触顶,报 ORA-27090;fs.file-max:全系统文件句柄上限,RAC 两节点实例加集群组件很容易吃满;kernel.shmall/kernel.shmmax:共享内存总页数和单段最大字节数,shmmax要给到大于最大 SGA;kernel.sem:信号量四个值,顺序是semmsl semmns semopm semmni,装 RAC 时semmni容易被忽略;net.ipv4.ip_local_port_range:本地端口范围,起点不能太低,否则和 SCAN 监听端口冲突。
改完执行sysctl --system让它生效,再核对:
/sbin/sysctl --system /sbin/sysctl -a | grep -E "shmmax|shmall|sem|aio-max-nr"ip_local_port_range单独确认一下,这个参数在有些系统上会被网络服务重写:
cat /proc/sys/net/ipv4/ip_local_port_range echo 9000 65500 > /proc/sys/net/ipv4/ip_local_port_range3.4 limits.conf 与 cvuqdisk:两个容易漏的小东西
limits.conf里除了前面写的memlock,还要把nofile、nproc一起给足。19c 的集群进程数比 11g 多不少,默认 1024 完全不够:
vi /etc/security/limits.d/19c-limits.conf oracle soft nproc 16384 oracle hard nproc 16384 oracle soft nofile 65536 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 10240cvuqdisk是集群验证工具用来识别共享磁盘的 rpm,藏在 Grid 安装介质里,每个节点都要装同一版本:
# 在 Grid 介质目录下找到 ls /u01/soft/grid/cv/rpm/cvuqdisk-*.rpm # 检查是否已有旧版本 rpm -qi cvuqdisk # 有则先卸载 rpm -e cvuqdisk # 指定属组后安装 export CVUQDISK_GRP=oinstall rpm -ivh cvuqdisk-1.0.10-1.rpm不装 cvuqdisk 的话,runcluvfy.sh跑预检查时会报找不到共享磁盘,看起来像存储没连上,实际只是缺了这个 rpm。
4. 网络与 GNS:hosts、bind 正反解和 SCAN 子域委派
网络这块是 RAC 安装里唯一一个“配错了不马上报错”的部分。IP 冲突、子网跨错、SCAN 解析不到,往往要到集群起了一半才暴露。所以我把 IP 规划、hosts、DNS、GNS 委派放在一章里连着做,做完统一验证一遍再往下走。
4.1 先定 IP 规划:四类地址别混在一起
19c 的规则比 11g 更明确,先把约束记住再动手:
| 地址类型 | 数量 | 是否必须在同一子网 | 说明 |
|---|---|---|---|
| Public IP | 每节点一个 | 与 VIP、SCAN VIP 同一子网 | 必须在网卡上固定配置 |
| Private IP | 每节点一到四个 | 独立私有网段 | 四个以内自动做 HAIP,四个以上超出部分做冗余 |
| VIP | 每节点一个 | 与 Public 同一子网 | 18c 起 VIP 变成可选项,但不能只给部分节点配 |
| SCAN VIP | 三个 | 与 Public 同一子网 | 必须由 DNS 解析,或交给 GNS |
几条硬性约束:要么全部 IPv4,要么全部 IPv6,不能混;Public、VIP、SCAN 名称只能用字母数字和-,不能用下划线,用了会在验证阶段被拒;Private 网卡不强求 bond 绑定,集群自己会做 HAIP 高可用,但每个 Member Cluster 内所有节点访问共享存储的方式必须一致。
4.2 /etc/hosts 怎么写才不打架
如果 SCAN 交给 DNS,hosts 里只写 Public、Private、VIP 和 GNS VIP 就够了,SCAN 的三条不要写进 hosts,否则会和 DNS 结果打架:
vi /etc/hosts # public 192.168.204.11 pub19-node1.rac.demo.com pub19-node1 192.168.204.12 pub19-node2.rac.demo.com pub19-node2 # private 40.40.40.41 priv19-node1.rac.demo.com 40.40.40.42 priv19-node2.rac.demo.com # vip 192.168.204.21 vip19-node1.rac.demo.com 192.168.204.22 vip19-node2.rac.demo.com # gns vip 192.168.204.10 gns19-vip.rac.demo.com两个节点的 hosts 内容必须完全一致,包括注释行位置都别差。看起来是小事,但部分集群校验会比对节点间 hosts 的差异,不一致时报的错跟网络毫无关系。
4.3 named.conf:三个 zone 一个都不能少
要自己搭 DNS 就装 bind,配置里最关键的是 zone 的划分:一个正解域、两个反解域(公网段和私网段各一个)。反解域少了会怎么样?SCAN 能解析出 IP,但集群做反向校验时失败,表现为 GNS 注册不上去。
yum install -y bind chroot vi /etc/named.conf options { directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; # 可收窄到具体网段,允许该网段查询 recursion yes; allow-transfer { none; }; }; zone "." IN { type hint; file "named.ca"; }; zone "rac.demo.com" IN { # 正解域 type master; file "named.rac.demo.com"; }; zone "204.168.192.in-addr.arpa" IN { # 公网段反解域 type master; file "named.192.168.204"; }; zone "40.40.40.in-addr.arpa" IN { # 私网段反解域 type master; file "named.40.40.40"; };allow-query建议先写any把安装走通,装完再收窄到 192.168.204.0/24 和 40.40.40.0/24。收窄得太早,GNS 那边查询会被拒,报错是 DNS 超时,很难往权限上想。
4.4 正解反解文件与 GNS 子域委派
正解文件里除了 A 记录,最后两行是整个 GNS 方案的关键——把vip.rac.demo.com这个子域的解析权交给 GNS 服务器:
vi /var/named/named.rac.demo.com $TTL 600 @ IN SOA rac.demo.com. admin.rac.demo.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS master master IN A 192.168.204.12 scan19-vip.rac.demo.com. IN A 192.168.204.33 scan19-vip.rac.demo.com. IN A 192.168.204.34 scan19-vip.rac.demo.com. IN A 192.168.204.35 priv19-node1.rac.demo.com. IN A 40.40.40.41 priv19-node2.rac.demo.com. IN A 40.40.40.42 vip19-node1.rac.demo.com. IN A 192.168.204.21 vip19-node2.rac.demo.com. IN A 192.168.204.22 pub19-node1.rac.demo.com. IN A 192.168.204.11 pub19-node2.rac.demo.com. IN A 192.168.204.12 # GNS 委派:子域 vip.rac.demo.com 由 gns.rac.demo.com 负责解析 vip.rac.demo.com. IN NS gns.rac.demo.com. gns.rac.demo.com. IN A 192.168.204.10最后两行解读一下:IN NS那行告诉 DNS,凡是*.vip.rac.demo.com的查询都转给gns.rac.demo.com;下一行的 A 记录给出 GNS 服务器地址。这就是子域委派。SCAN 的名字必须落在这个子域下,比如scan19-vip.rac.demo.com,否则 GNS 管不到它。
反解文件按网段分两个,公网段的:
vi /var/named/named.192.168.204 $TTL 600 @ IN SOA rac.demo.com. admin.rac.demo.com. ( 10 ; serial 3H ; refresh 15M ; retry 1W ; expire 1D ) ; minimum @ IN NS master.rac.demo.com. 10 IN PTR gns19-vip.rac.demo.com. 11 IN PTR pub19-node1.rac.demo.com. 12 IN PTR pub19-node2.rac.demo.com. 21 IN PTR vip19-node1.rac.demo.com. 22 IN PTR vip19-node2.rac.demo.com. 33 IN PTR scan19-vip.rac.demo.com. 34 IN PTR scan19-vip.rac.demo.com. 35 IN PTR scan19-vip.rac.demo.com.私网段那份按同样格式写40.40.40.x的 PTR 即可。写完启动服务并验证四件事:
systemctl enable named && systemctl start named # 正解 nslookup pub19-node1.rac.demo.com 192.168.204.12 # 反解 nslookup 192.168.204.11 192.168.204.12 # SCAN 三条 nslookup scan19-vip.rac.demo.com 192.168.204.12在 gridSetup.sh 的 SCAN 页面填scan19-vip.rac.demo.com,GNS 页面填 IP192.168.204.10、子域vip.rac.demo.com。三个值必须和 named 里的配置严格对应,差一个字符就注册失败。如果同时配了 DHCP,VIP、Private、SCAN 都可以交给 GNS 动态分配,这是 GNS 方案相对固定配置最大的价值。
4.5 剩下的系统杂项,一次配完省得来回切
这些配置单项都不难,但分散着做很容易漏。我一般放在网络之后一次收尾:
# 时钟同步,两节点必须指向同一源 timedatectl set-timezone Asia/Shanghai systemctl enable chronyd && systemctl start chronyd chronyc sources -v # SSH 超时,避免装到一半会话断开 vi /etc/ssh/sshd_config # ClientAliveInterval 300 # ClientAliveCountMax 3 # 关闭 X11 Forward,图形安装只在本机走 # X11Forwarding no # I/O 调度器,SSD 用 noop,机械盘用 deadline cat /sys/block/sdb/queue/scheduler echo deadline > /sys/block/sdb/queue/scheduler时钟同步这条最不能省。两节点时间差超过几秒,集群心跳和 OCR 写入就会出问题,而且报错五花八门。chrony 起来后用chronyc sources -v确认两节点指向同一个上游。
装 Grid 一般是在本机图形界面或者 VNC 里跑 gridSetup.sh,SSH 的 X11 转发在这种场景下反而容易出权限问题,所以我习惯直接关掉。要用的话,得确保xauth装了、DISPLAY变量对、oracle 用户有权限,三个条件缺一个就是“无法打开显示”。
5. 常见问题排查:五个最容易翻车的点
前面每一步都按规范走,仍然会踩坑。下面这几条是我在不同环境里反复遇到的,按“现象 → 原因 → 解决”记下来,装的时候对号入座比翻日志快。
第一条:gridSetup.sh 界面弹不出来,终端只报无法打开显示
现象是执行./gridSetup.sh后没有任何窗口,终端输出Can't connect to X11 window server。原因通常是三件事之一:当前用户不是 oracle、DISPLAY变量指向的显示器不可用、或者执行了su oracle但没带-导致环境变量没切换。解决方式是先echo $DISPLAY确认有值,再用su - oracle重新登录,本机则执行一次xhost +放开访问控制。远程走 VNC 的话,确认 VNC 会话本身没断。
第二条:ASM 磁盘在 asmca 里一个都看不到
现象是安装到 ASM 配置页面,候选磁盘列表空的,但lsblk明明能看到盘。原因是 udev 规则序号被别的规则覆盖了,或者权限给错。解决方法是这样检查:
# 查看当前规则 cat /etc/udev/rules.d/99-oracle-asmdevices.rules # 规则示例,序号建议用 60 开头,早于系统默认规则 KERNEL=="sdb1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="3600xxxx", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660" # 重载并触发 udevadm control --reload-rules udevadm trigger --type=devices --action=change udevadm info --query=all --name=/dev/asm-disk1重点看OWNER和GROUP是不是grid:asmadmin,MODE是不是0660。权限不对时 ASM 不会报错,就是看不见盘。
第三条:cluvfy 报 swap 不足,但 swap 明明配够了
现象是runcluvfy.sh的预检查阶段报 swap 空间不够,而free -g显示 swap 大小完全符合要求。原因是启用了 HugePages,大页从内存预扣,swap 的计算基数需要相应减去这部分。解决方式是按 HugePages 实际占用重新核算 swap,或者把大页数调小。这一条最麻烦的地方在于,报错信息和真实原因之间隔着一层,不看文档基本想不到。
第四条:GNS 注册不成功,SCAN 解析时好时坏
现象是 DNS 手工nslookup能解析 SCAN,但 GNS 状态里一直是未注册。原因基本是两个:SCAN 的名字没落在委派子域下,或者 named 里IN NS记录末尾漏了点号。vip.rac.demo.com和vip.rac.demo.com.在 zone 文件里是两个完全不同的东西,后者才是绝对域名。解决方式是逐条核对正解文件末尾的 NS 和 A 记录,确认 SCAN 主机名形如scan19-vip.vip.rac.demo.com,落在 GNS 托管的范围内。
第五条:root.sh 在第二个节点执行失败,提示节点不可达
现象是第一个节点 root.sh 正常,第二个节点跑到一半报无法连接对端。原因是两节点的互信在安装过程中被重置了,或者前面配的 SSH 超时限制生效把空闲连接掐了。解决方式是重新跑一遍互信配置(gridSetup.sh 里有 SSH 配置向导,也可以手工生成密钥对分发),并把ClientAliveInterval调到 300 以上。这一条特别隐蔽,因为安装前期互信检查是通过的,跑到后半程才断。
6. 验证跑通:cluvfy 与 gridSetup 的最后一公里
装完不算完,得能证明它跑起来了。我的顺序是先跑 cluvfy 预检查,再上 gridSetup.sh,最后用三条命令验收。
# 预检查,-fixup 会自动修一部分可修复项 ./runcluvfy.sh stage -pre crsinst -fixup -n pub19-node1,pub19-node2 -verbose-fixup会把能自动修的(比如部分内核参数、缺的目录权限)直接改掉,修完必须重跑一次,输出里全部passed才算干净。有failed的项先解决再往下,不要抱着“装的时候可能不检查”的侥幸。
# 图形化安装 Grid Infrastructure ./gridSetup.sh向导里几个关键选择:集群模式选 Standalone Cluster(两节点最常见);19c 下 GIMR 可选,不装能省 1G 大页,但要接受没有 MGMTDB 的诊断能力;SCAN 填scan19-vip.rac.demo.com;GNS 页面填192.168.204.10和子域vip.rac.demo.com。装完按提示在两个节点分别以 root 执行root.sh,第一个节点跑完再跑第二个,顺序不能反。
# 节点一 /u01/app/19.0.0/grid/root.sh # 节点二 /u01/app/19.0.0/grid/root.sh最后用三条命令验收,缺一不可:
# 集群资源状态,所有资源的 TARGET 和 STATE 都应是 ONLINE crsctl stat res -t # 节点列表,两个节点都要是 Active olsnodes -n # ASM 实例状态和磁盘组 srvctl status asm -detail asmcmd lsdgcrsctl stat res -t里重点看ora.cssd、ora.diskmon、ora.asm、ora.gns四项。ora.gns如果是 OFFLINE 而其他都正常,八成是子域委派的问题,回第 4 章查 named。asmcmd lsdg要能看到 OCR 和投票盘所在的磁盘组,STATE是MOUNTED。
还有一个常被略过的验证点:rpm -qa | grep cvuqdisk,两个节点的版本号必须一致。版本不一致时集群能起来,但后续打补丁或者扩容节点会出问题,属于典型的后悔药场景。
从那以后我每次装 RAC,不管多熟的環境,都强制在 gridSetup.sh 之前完整跑一遍 cluvfy,并且把输出存成文件留档——不是为了应付检查,是因为后面真出问题时,这份全passed的基线是唯一能对照的黑匣子。希望帮到你。
本文还有配套的精品资源,点击获取