ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Oracle 19c RAC 安装避坑:Linux 7.6 内核调优与验证

Oracle 19c RAC 安装避坑:Linux 7.6 内核调优与验证

简介:这份安装手册面向具备一定 Linux 与数据库基础的 DBA 及运维工程师,聚焦在 Red Hat Enterprise Linux 7.6 环境下完成 Oracle 19c RAC 集群部署与 GNS 配置 SCAN 这类较复杂场景。内容从操作系统环境检查起步,依次覆盖关闭 THP 并开启 Hugepages、安装 Red Hat 及其余依赖软件包、通过 Preinstall RPM 或手工方式调整内核参数、CVU 校验,以及固定网络与 GNS 结合的网络配置方案,并补充操作系统杂项配置与时钟同步等收尾环节;同时穿插 Flex ASM 机制介绍与各版本变化对比,说明从 12.2 起分化为 Standalone Cluster 与 Domain Service Cluster 两种集群模式。手册还记录了实际配置中遇到的问题与分析排查方法,便于读者按章节逐项对照、定位故障。资源为单个 docx 文档,压缩包约 160KB,已有 719 人学习下载,适合作为部署实操时的手边参考。

1. 从一次重启后才暴露的故障说起

19c RAC Linux 7.6 安装最容易出问题的环节,不在 gridSetup.sh 的图形界面里,而在装完重启之后:节点上的透明大页面又回来了,GI(Grid Infrastructure)起不来,或者起来后内存一直抖动。我经手过一套两节点集群,安装当天一切正常,跑了两周开始随机踢节点,最后查到/sys/kernel/mm/transparent_hugepage/enabled还是[always],之前改的 grub 根本没生效。

这套环境在中小规模业务库上很常见:两三个节点、共享存储、要求实例级高可用,但机器往往不是全新交付的,系统层早被别人的配置动过。想一次装通,就得先把环境门槛、内核参数、网络解析这三层逐个核对清楚,再进图形界面。下面按我实际装机的顺序写,从系统检查一路到装完怎么验。

2. 环境核对:Linux 7.6 上跑 19c RAC 的硬门槛

安装前这一轮核对最省时间。很多人跳过它直接挂 ISO,结果跑到 CVU 预检才发现内核版本不够、/dev/shm只有 64M 或者/tmp塞在根分区里。这些检查全部是只读命令,不花两分钟,却能省掉后面一次回滚。

2.1 内存、swap、/tmp 与 /dev/shm 的检查命令

内存底线是 8G,实际做生产库我一般按单节点 16G 起算,因为一个节点的 GI 栈加 ASM 实例本身就要吃掉 3~4G,再叠一个 SGA 很容易触顶。swap 的算法分两段:物理内存 4G 到 16G 之间时,swap 给到和内存一样大;物理内存超过 16G,swap 固定 16G 就够。这里有个容易漏的点——如果启用了 HugePages,算 swap 时要把预分配给大页的那部分内存扣掉,否则你会写一个虚高的 swap 值。

/tmp至少要 1G,但 19c 的 grid 安装包解压阶段实际会占掉几个 G,我习惯单独挂一个 5G 以上的分区。/dev/shm要确认是 tmpfs 挂载且权限为 1777,这个目录后面 root.sh 阶段会用到。

# 物理内存与 swap,单位 kB grep MemTotal /proc/meminfo grep SwapTotal /proc/meminfo # /tmp 与 /dev/shm 的空间、挂载类型 df -h /tmp df -h /dev/shm mount | grep -E 'shm|/tmp' # /dev/shm 权限应为 drwxrwxrwt ls -ld /dev/shm

grep MemTotal出来的是 kB,除以 1024 才是 G,别直接拿数字去比对 8G。mount | grep shm如果看不到 tmpfs,说明/dev/shm没挂上,需要补fstab条目再mount -a。ls -ld /dev/shm的权限位末尾必须是t,不是1777的话后面 GI 启动会报共享内存段创建失败。

2.2 内核版本、运行级别与空间规划

Linux 7.6 自带的内核是3.10.0-957.el7.x86_64,属于 Red Hat 兼容内核分支,满足 19c 要求的3.10.0-693.5.2.0.1.el7.x86_64及以上。如果机器上跑的是 UEK 分支,门槛是 UEK4 的4.1.12-112.16.7.el7uek.x86_64或 UEK5 的4.14.35-1818.1.6.el7uek.x86_64及以上。版本号只比到el7之前那一段,小数点后的补丁号低于门槛就别硬上。

运行级别要 3 或 5,2 不行。空间上,GI 的 home 至少 12G,Oracle home 至少 10G,我一般直接给/u01分 100G,因为后面还要放补丁、trace、归档。

# 内核版本与架构,输出形如 3.10.0-957.el7.x86_64 x86_64 uname -mr # 发行版版本,确认是 7.6 cat /etc/redhat-release # 运行级别,应为 3 或 5 runlevel # 空间规划 df -h /u01

uname -mr一次给出内核版本和架构,比uname -a干净。runlevel输出两个数字,第二个才是当前级别,看到N 5或N 3就对了;如果是N 2,用systemctl set-default multi-user.target改完重启。df -h /u01如果提示目录不存在,先建目录再挂盘,别在根分区上装。

2.3 Standalone Cluster 与 Domain Service Cluster:GIMR 从 19c 起可选

从 12.2 开始,集群分成两种模式。Standalone Cluster 最多支持 64 个节点,每个节点直连共享存储,通过各自节点的 ASM 实例或共享文件系统挂载,本地管理 GIMR。Domain Services Cluster 则是一个或多个节点组成域服务集群,集中提供 MGMTDB、TFA 日志收集、合并的 ASM 存储管理,成员集群可以物理直连分片存储,也可以走 ASM IO Service 通过网络访问。

两节点自建业务库,基本都是选 Standalone,别为了“架构先进”去上 Domain Services,那套东西要额外的成员集群和 Hub 节点规划。真正影响安装参数的是 GIMR:19c 的 Standalone 安装里,GIMR 变成了可选项。如果选装,就要在 HugePages 里额外预留 1G 给 GIMR 的 SGA;如果不装,大页只算数据库实例的 SGA 就行。

提示:GIMR 选与不选,在安装向导里一旦点过就不太好回退,最好在动手前定下来,并把这个结论写进装机记录。

3. 系统层调优:THP、Hugepages、依赖包与内核参数

这一层是安装文档里最容易抄错的部分,因为很多参数是“看起来设了,其实没生效”。配置原理不复杂:THP 要在内核启动参数层面关掉,HugePages 要在 sysctl 层面预留,内核参数要落在/etc/sysctl.d/下而不是零散 echo 到/proc。区别在于,前者重启后还在,后者重启就没了。

3.1 关闭透明大页面并重建 grub

先看现状。enabled和defrag两个文件都要看,输出里方括号包住的那个就是当前值,理想状态是[never]。

cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag

如果还是[always],把参数写进 grub,而不是每次开机跑脚本:

# 备份现有 grub 配置,出问题能直接回滚 cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak.$(date +%F) # 编辑内核启动参数,在 GRUB_CMDLINE_LINUX 末尾追加 vi /etc/default/grub # GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap ... transparent_hugepage=never" # BIOS 机器重建 grub.cfg grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 机器用下面这条,路径不同 # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg # 重启后验证 shutdown -r now cat /proc/cmdline

GRUB_CMDLINE_LINUX里原有的rd.lvm.lv=之类一律保留,只在末尾追加,不要整行替换,替换掉根分区就起不来了。grub2-mkconfig的-o参数是输出文件,BIOS 和 UEFI 两台机器的路径不一样,用错路径的结果是“命令成功但重启后参数没生效”,这也是很多人以为关掉了 THP 其实没关的原因。重启后cat /proc/cmdline,能看到transparent_hugepage=never才算落地。

3.2 HugePages 与 memlock 的算法

大页数量按 SGA 总量倒推:把所有实例的 SGA 加起来,装上 GIMR 就再加 1G,除以 2M 得到页数,再上浮 10% 左右做余量。比如两个节点各一个实例、SGA 各 8G,就是 16G 除以 2M,约 8192 页,实际给 9000 上下。

# /etc/sysctl.conf 追加,数值按上面算出来的填 vm.nr_hugepages = 9216 # 立即生效 sysctl -p # 查看分配结果,HugePages_Total 应等于设定值 grep Huge /proc/meminfo

limits.conf里的 memlock 要放开,否则 oracle 用户锁不住这么多内存:

# /etc/security/limits.conf oracle soft memlock 197132288 oracle hard memlock 197132288 # grid 用户如果也跑 ASM 实例,同样需要一组 grid soft memlock 197132288 grid hard memlock 197132288

memlock 的单位是 KB,上面这个值约等于 188G,写unlimited也能过,但有些环境里unlimited会被 PAM 限制截断,我倾向写具体数字。改完必须重新登录才生效,ulimit -l看到新值才算数,su - oracle之后立刻查一次。

3.3 依赖包与 preinstall RPM 的取舍

必须装的包是一长串,缺一个libaio或compat-libcap1就会在链接阶段失败。RHEL 7.6 上我一般一次性装齐:

yum install -y \ bc binutils compat-libcap1 compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel \ fontconfig-devel glibc glibc-devel ksh libaio libaio-devel \ libX11 libXau libXi libXtst libXrender libXrender-devel libxcb \ libgcc librdmacm-devel libstdc++ libstdc++-devel make \ net-tools nfs-utils smartmontools sysstat

net-tools是 RAC 和 Clusterware 要用的,nfs-utils给 ACFS 用。如果要上 ACFS Remote,还得补python、python-configshell、python-rtslib、python-six、targetcli这组。注意 RHEL 7 里compat-libstdc++的实际包名是compat-libstdc++-33,照着文档写原名会报找不到包。

第二条路是装oracle-database-preinstall-19c,它会把 oracle 用户、oinstall 和 dba 组、sysctl 参数、limits 限制一次性配好,还会顺手设numa=off。省事,但有两个前提:机器上不能已经有你自己建的 oracle 用户和组,否则 UID/GID 会对不上;而且它写进去的 sysctl 值会跟你手工写的文件打架,这一点后面单独说。

3.4 手工写内核参数与 CVU 预检

不用 preinstall 的话,参数统一写在/etc/sysctl.d/下,不要echo到/proc/sys:

# /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 = 1048576
# 加载全部 sysctl 配置并确认 sysctl --system sysctl -a | grep -E 'shmmax|shmall|file-max|aio-max-nr'

几个值的含义:kernel.shmmax是单个共享内存段上限,源里给的4294967295是 4G 减 1 的通用值,物理内存大的机器要按内存一半重算;kernel.shmall是共享内存总页数,2097152乘 4K 等于 8G;fs.aio-max-nr是异步 IO 请求数上限,RAC 里偏小会直接报 IO 错误。sysctl --system会按文件名顺序加载/etc/sysctl.d/下所有文件,所以文件名的数字前缀决定了谁覆盖谁。

CVU 是可选步骤,但预检能提前暴露节点间不一致。包在 Grid 安装介质的cv/rpm目录里:

# 有旧版本先卸掉 rpm -qi cvuqdisk rpm -e cvuqdisk # 指定所属组后安装 export CVUQDISK_GRP=oinstall rpm -ivh cvuqdisk-1.0.10-1.rpm # 两节点预检,-fixup 表示允许它顺手修可修项 ./runcluvfy.sh stage -pre crsinst -fixup -n pub19-node1,pub19-node2

CVUQDISK_GRP一般就是oinstall,这个变量不 export 的话 rpm 装上了也跑不起来。-fixup会修改一些系统配置,第一次跑建议先不加它看原始报告,确认问题清单之后再决定要不要让它动手。

4. 网络与存储落地:hosts、固定 IP、GNS 与 UDEV 绑盘

网络这块的规则是死的,写错一个下划线或者把 VIP 和 public 放进不同网段,安装向导会直接拦住。存储这块的坑在于“当下绑好了,重启就变”,所以 UDEV 规则必须一次写对。

4.1 命名与网段的六条硬规则

第一,要么全 IPv4,要么全 IPv6,不要混着来,GNS 虽然能生成 IPv6 地址,但混配会让解析结果不可控。第二,从 18c 起 VIP 是可选的,可以给所有节点配,也可以一个都不配,但不支持只给部分节点配。第三,private 网卡最多配四个做 HAIP,超过四个的部分自动降为冗余,private 不需要做 bond,集群自己会做高可用。第四,public 和 VIP 的主机名只能用字母、数字和-,绝对不能用下划线。第五,public、VIP、SCAN VIP 必须在同一个子网段。第六,public 要固定配置在各节点网卡上,VIP、private IP、SCAN 都可以交给 GNS 管,其中 SCAN 需要三个固定 IP。

SCAN 那三个地址是硬性的,少配一个后面客户端连接会间歇性失败,而且这种失败很难和网络问题区分开。

4.2 /etc/hosts 与固定 IP 的写法

固定配置方案最直白:public、private、VIP 全部手写在 hosts 里,SCAN 走 DNS 解析。两节点示例如下:

# public 192.168.204.11 pub19-node1.rac.lab 192.168.204.12 pub19-node2.rac.lab # private 40.40.40.41 priv19-node1.rac.lab 40.40.40.42 priv19-node2.rac.lab # vip 192.168.204.21 vip19-node1.rac.lab 192.168.204.22 vip19-node2.rac.lab # scan vip(三个地址走 DNS,hosts 里不写) # 192.168.204.33 scan19-vip.rac.lab # 192.168.204.34 scan19-vip.rac.lab # 192.168.204.35 scan19-vip.rac.lab # gns vip 192.168.204.10 gns19-vip.rac.lab

域名我习惯用.lab这种不对外解析的后缀,避免和公司内网已有域名冲突。private 单独用40.40.40.0/24网段,物理上两张网卡接不同交换机,这样 private 心跳不会和 public 流量抢带宽。SCAN 的注释保留着,是为了提醒自己这三个地址必须存在 DNS 里,别顺手写进 hosts 造成解析不一致。

4.3 bind 正反解与 GNS 子域委派

要用 GNS 托管 VIP 和 SCAN,就得先有一台自己的 DNS。装 bind 之后,/etc/named.conf里配正向域和两个反向域:

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"; allow-query { any; }; # 可收紧为集群所在网段 recursion yes; allow-transfer { none; }; }; zone "." IN { type hint; file "named.ca"; }; zone "rac.lab" IN { # 正向域 type master; file "named.rac.lab"; }; zone "204.168.192.in-addr.arpa" IN { # public 网段反解 type master; file "named.192.168.204"; }; zone "40.40.40.in-addr.arpa" IN { # private 网段反解 type master; file "named.40.40.40"; };

正向域文件里,除了常规的 A 记录,最后两行是 GNS 的关键:

$TTL 600 @ IN SOA rac.lab. admin.rac.lab. ( 2024010101 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS master.rac.lab master IN A 192.168.204.12 scan19-vip.rac.lab. IN A 192.168.204.33 scan19-vip.rac.lab. IN A 192.168.204.34 scan19-vip.rac.lab. IN A 192.168.204.35 priv19-node1.rac.lab. IN A 40.40.40.41 priv19-node2.rac.lab. IN A 40.40.40.42 vip19-node1.rac.lab. IN A 192.168.204.21 vip19-node2.rac.lab. IN A 192.168.204.22 pub19-node1.rac.lab. IN A 192.168.204.11 pub19-node2.rac.lab. IN A 192.168.204.12 vip.rac.lab. IN NS gns.rac.lab. gns.rac.lab. IN A 192.168.204.10

最后两行的意思是:子域vip.rac.lab的解析服务器是gns.rac.lab,而这台 GNS 的地址是192.168.204.10。这一对记录就是委派,缺一行 GNS 就接管不了子域。

对应到安装向导里,SCAN 页填的域名必须落在这个被委派的子域下——比如scan19-vip.rac.lab属于vip.rac.lab的子域,就能被 GNS 接管;GNS 页填 IP192.168.204.10、子域填vip.rac.lab。两者对不上,安装时能过,运行期 SCAN 解析会飘。反向域文件按网段补 PTR 即可,格式是33 IN PTR scan19-vip.rac.lab.这样。改完所有 zone 文件用named-checkconf和named-checkzone各过一遍,比直接重启服务靠谱。

4.4 UDEV 绑定 ASM 磁盘与存储侧配置

手工配 ASM 磁盘,靠 UDEV 把/dev/sdX绑成固定名字。规则的核心是用磁盘的 SCSI ID 而不是盘符:

# 先取每块共享盘的唯一 ID /usr/lib/udev/scsi_id -g -u -d /dev/sdb # /etc/udev/rules.d/99-oracle-asmdevices.rules KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", \ RESULT=="3600a09803830reset0001", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", \ RESULT=="3600a09803830reset0002", SYMLINK+="asm-disk2", OWNER="grid", GROUP="asmadmin", MODE="0660"

RESULT必须和scsi_id的输出一模一样,一个字符都不能差,这是最常见的失效原因。OWNER给 grid,GROUP给 asmadmin,MODE是 0660,权限给宽了 ASM 会拒绝,给窄了 grid 用户读不到。

# 重新加载规则并触发 udevadm control --reload-rules udevadm trigger --type=devices --action=change # 验证软链接、属主、权限 ls -l /dev/asm-disk*

验证时看的是软链接指向的设备、属主 grid、组 asmadmin、权限brw-rw----。如果软链接存在但属主是 root,说明规则里的OWNER没生效,通常是SUBSYSTEM写错或者规则文件名排序被别的规则抢先。

存储侧还有几项要顺手处理:走 NAS 的话按厂商要求补挂载参数和nfs-utils版本;用 Direct NFS 就在$ORACLE_HOME/lib下配oranfstab;I/O 调度器建议对共享盘设成deadline,SSD 或全闪存储上noop也行,别留默认的cfq。SSH 超时限制也要放开,/etc/ssh/sshd_config里ClientAliveInterval 300、ClientAliveCountMax 3,否则安装中途 SSH 断开,向导会卡在半路。

5. 安装执行与现场排查:gridSetup.sh 到 dbca 的五类翻车

前面都是准备,这一章是真正动手和出问题时的处理。图形安装本身没什么技术含量,难的是执行顺序和报错定位。19c 的路径是gridSetup.sh装 GI,然后runInstaller装数据库软件,最后dbca建库,三步之间不能跳。

5.1 图形界面前的收尾清单

进图形界面之前,我固定过一遍这几项:时钟同步用 chrony 还是 ntp 无所谓,但两节点必须指向同一个源,chronyc sources -v里带^*的那一行就是当前同步源;limits.conf里 oracle 和 grid 的nofile、nproc都给足;X11Forwarding关掉,用 VNC 或本地控制台跑图形向导更稳;/etc/hosts里不要留重复记录。

# 时钟同步状态 chronyc sources -v timedatectl # 资源限制,需重新登录后查看 su - grid -c 'ulimit -n; ulimit -u' su - oracle -c 'ulimit -n; ulimit -u'

timedatectl里System clock synchronized: yes才算同步成功。ulimit -n看到 65536 以上比较放心,值太小在 root.sh 阶段会报“无法创建足够进程”。

5.2 gridSetup.sh 到 runInstaller、dbca 的执行顺序

gridSetup.sh用 grid 用户跑,向导里依次是集群类型(Standalone)、节点列表、SSH 互通、网络接口(public 和 private 分别绑定)、存储方式(ASM)、GIMR 选不选、ASM 口令、IPMI 可跳过、安装位置、预检、执行。执行阶段会在最后提示用 root 跑两个脚本:一个在 GI home 下的root.sh,两节点按提示顺序执行。

GI 装完后用 root 执行orainstRoot.sh(老版本需要,19c 里部分流程已合并),再用 oracle 用户跑runInstaller装数据库软件,最后dbca建库。dbca里选 RAC 数据库、指定两个实例、字符集、内存参数,注意内存参数里 SGA 要和前面算 HugePages 时用的值一致,否则大页不够分。

5.3 翻车一:THP 重启后回到 always

现象:装完 GI 重启,节点驱逐(eviction)记录里出现内存相关告警,/sys/kernel/mm/transparent_hugepage/enabled显示[always]。

原因:只改了/etc/default/grub,没执行grub2-mkconfig;或者机器是 UEFI 启动,输出路径写成了 BIOS 的/boot/grub2/grub.cfg,配置写进了没被读取的文件。

解决:cat /proc/cmdline确认参数是否真的进了内核命令行;没进就按启动方式重建,UEFI 机器输出到/boot/efi/EFI/redhat/grub.cfg,重建前先备份原文件。

5.4 翻车二:SCAN 解析不上,GNS 委派写错层

现象:安装向导能过,客户端连 SCAN 时好时坏,nslookup scan19-vip.rac.lab在某个节点上返回不了三个地址。

原因:正向域里漏了vip.rac.lab. IN NS gns.rac.lab.这行委派,或者 SCAN 域名不在被委派的子域下,GNS 根本不接管这个域。

解决:用dig @192.168.204.10 scan19-vip.rac.lab直接问 GNS,能答出来说明委派通了;答不出来就看正向域末尾那两行 NS 和 A 是否成对,以及 SCAN 域名后缀是否和子域一致。

5.5 翻车三:/dev/shm 权限与大小导致 root.sh 失败

现象:执行root.sh报共享内存相关错误,或者 GI 启动时提示无法创建内存段。

原因:/dev/shm权限不是 1777,或者被挂成了很小的 tmpfs。

解决:ls -ld /dev/shm看权限位,df -h /dev/shm看大小;权限用chmod 1777 /dev/shm修正,大小在fstab里调size=参数后重新挂载,改完再跑一次root.sh。

5.6 翻车四:UDEV 规则生效但重启后盘符变了

现象:装的时候/dev/asm-disk1指向正确,重启后 ASM 起不来,ls -l /dev/asm-disk*发现软链接指向了别的盘。

原因:规则里用了KERNEL=="sdb"这种固定盘符写法,或者RESULT从别的机器上抄来没改,实际匹配不上就退回了默认命名。

解决:一律用scsi_id取真实 ID 写进RESULT,规则里的KERNEL用sd*通配;改完udevadm control --reload-rules加udevadm trigger,然后重启验证一次,别只看当前会话。

5.7 翻车五:preinstall 和手工 sysctl 互相覆盖

现象:手工写了97-oracledatabase-sysctl.conf,sysctl -a查出来kernel.shmmax还是旧值。

原因:oracle-database-preinstall-19c会安装自己的 sysctl 配置文件,文件名排序在你写的文件之后,加载时后加载的覆盖先加载的。

解决:ls /etc/sysctl.d/看全部文件,确认哪个最后被加载;要么统一只保留一份,要么把自己的文件前缀改成更大数字,改完sysctl --system再核对一遍关键值。

6. 装完怎么验证:四组命令确认真跑通了

安装向导最后一步显示 successful,不代表集群可用。我固定用四组命令做验收,缺一组都不算完。

第一组看集群整体状态:

# 所有节点与集群状态,-all 会对每个节点执行 crsctl check cluster -all # 节点列表,-s 显示状态,-t 显示类型 olsnodes -s -t # 各类资源的状态表,重点看 ora.asm、ora.LISTENER_SCAN1、ora.gsd crsctl stat res -t

crsctl check cluster -all每个节点都要返回CRS-4537: Cluster Ready Services is online,出现CRS-4535就是有组件没起来。olsnodes -s -t里 Active 那列应该是Active,如果某个节点是Inactive,看/var/log/cluster/下的日志。crsctl stat res -t里 SCAN VIP、SCAN LISTENER、ASM 三类资源必须 INTERMEDIATE 以上,OFFLINE的直接对着资源名crsctl status res <名称> -f查详情。

第二组看 SCAN 和 VIP 的配置是否和计划一致:

# SCAN 配置,确认三个 VIP 和域名 srvctl config scan # SCAN VIP 与节点对应关系 srvctl status scan # 各节点 VIP 状态 srvctl status vip -n pub19-node1

srvctl config scan输出的 SCAN VIP 必须是三个,域名后缀要和 DNS 里配的一致。少一个地址,客户端连接就会出现“有时连得上有时连不上”的玄学问题。

第三组看 ASM 磁盘组:

# ASM 实例里的磁盘组状态与冗余度 asmcmd lsdg # 用 grid 用户查 ASM 实例状态 srvctl status asm -a

asmcmd lsdg里每个磁盘组的state要是MOUNTED,type要和规划一致(NORMAL 还是 EXTERNAL)。如果磁盘组是DISMOUNTED,先ls -l /dev/asm-disk*确认 UDEV 软链接还在,再查 ASM 告警日志。

第四组看数据库实例:

-- 两个实例都要是 OPEN,且 INSTANCE_STATUS 一致 SELECT inst_id, instance_name, status, database_status FROM gv$instance;

gv$instance里inst_id有 1 和 2、status都是OPEN才算真正跑通。只有一条记录说明另一个实例没起来,去对应节点的数据库告警日志里找ORA-开头的行。

验证项通过标准不通过先查
集群服务每节点 CRS-4537/var/log/cluster 下的 crsd、cssd 日志
节点成员olsnodes 全为 Active节点间 private 网络连通性
SCAN三个 VIP 与域名一致DNS 委派与 GNS 配置
ASM磁盘组 MOUNTEDUDEV 软链接与属主权限
实例gv$instance 两条 OPEN各节点数据库告警日志

从那以后我每次装完 19c RAC,都不看向导最后那句 successful,而是把这四组命令按顺序敲一遍,输出全部对上才算交付;有一次就是因为省了asmcmd lsdg这一步,交付第二天才发现一个磁盘组的冗余度和规划不一致,返工重配。希望这些顺序和检查项能帮到你,少走一遍我踩过的回头路。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进