简介面向需要在 Red Hat Enterprise Linux 7.6 上部署 Oracle 19c RAC 的数据库工程师与运维人员这份安装手册聚焦 GNS 配置 SCAN 的完整落地路径并顺带梳理 Flex ASM 特性及 12.2 之后 Standalone Cluster 与 Domain Service Cluster 两种集群模式的差异适合具备一定 Linux 与 Oracle 基础、希望独立完成搭建的中高级读者。压缩包内仅 1 个 docx 文档约 160KB按 OS 环境检查、关闭 THP 并开启 Hugepages、安装软件包、内核参数配置、网络配置固定配置与 GNS 加固定配置、时钟同步等章节组织目录层级清晰便于按步骤对照执行。文档还记录了配置过程中常见问题的解决思路与分析问题的方法读者可据此少走弯路快速定位安装阶段的异常。目前已有 718 人学习下载可作为 19c RAC 部署与排错时的案头参考。1. 拿到这份 19c RAC 安装手册先别急着敲命令上周帮一个朋友看一套两节点环境gridSetup.sh跑到 ASM 那一步直接卡死日志里翻来覆去就是ORA-15018: diskgroup cannot be created。折腾到凌晨两点才发现问题根本不在 Grid 安装本身而是 UDEV 规则里那条KERNELsd*把系统盘也匹配进去了ASM 候选盘里混进了不该出现的设备。这种坑手册里不会写但每一个装过 19c RAC on Linux 7.6 的人都可能踩到。这份《Oracle 19c RAC on Linux 安装手册.docx》的价值就在这儿——它不是官方文档的搬运而是把从 OS 环境检查、THP 关闭、Hugepages 计算、内核参数、网络规划含 GNS 配 SCAN、UDEV 绑盘一直到gridSetup.sh和runInstaller的完整链路串成了一条可执行的线。适合两类人一是第一次在 RHEL 7.6 上搭 19c RAC、需要一份能照着走的清单的 DBA二是装过 11g/12c、想搞清楚 19c 在 Flex Cluster、GIMR 可选、GNS 这些变化上到底该怎么配的老手。下面我按自己复现的顺序把手册里的关键步骤拆开讲顺带把几个容易翻车的地方标出来。2. OS 层预处理THP、Hugepages 与内核参数怎么落地装 RAC 之前OS 层没收拾干净后面 Grid 安装大概率会在 CVU 预检查阶段被拦下来。手册把这一块放在最前面是对的因为 THP、Hugepages、内核参数这三样是相互牵连的顺序错了就得返工。2.1 先关 THP再算 Hugepages透明大页面THP对 Oracle 来说是典型的“玄学”问题——它不会让你装不上但会在运行期制造不可预测的延迟抖动。手册里给的检查方式很直接# 查看 THP 当前状态方括号包住的是生效值 cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag如果输出是[always] madvise never说明 THP 开着必须关。手册的做法是改 GRUB 内核参数而不是运行时 echo——这点很关键运行时改重启就失效了。具体是编辑/etc/default/grub在GRUB_CMDLINE_LINUX末尾追加transparent_hugepagenever然后按 BIOS/UEFI 分别重建 grub 配置# BIOS 引导的机器 grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 引导的机器 grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg # 重启后验证输出里应能看到 transparent_hugepagenever cat /proc/cmdline这里有个参数细节transparent_hugepagenever是内核启动参数和/sys下的运行时开关是两套机制。只改/sys不改 GRUB重启后 THP 会回来CVU 检查照样报 warning。重建 grub 之前记得备份原grub.cfg我见过有人grub2-mkconfig输出路径写错直接把引导搞挂的。THP 关掉之后才轮到 Hugepages。手册里vm.nr_hugepages xxxx这个 xxxx 不是拍脑袋填的它取决于所有实例 SGA 之和加上 GIMR 的 1G。19c Standalone Cluster 可以选择不配 GIMR如果配了就要把这 1G 算进 hugepages。计算逻辑是hugepages 数量 (各实例 SGA 总和 GIMR SGA) / 2MB向上取整再留一点余量。同时limits.conf里 oracle 用户的memlock要设成 hugepages 总字节数否则实例启动时会报ORA-27125: unable to create shared memory segment。# /etc/sysctl.conf 中设置大页数量 vm.nr_hugepages 5120 # /etc/security/limits.conf 中锁定内存单位 KB oracle soft memlock 10485760 oracle hard memlock 10485760 # 生效并验证 sysctl -p grep HugePages_Total /proc/meminfomemlock给少了是新手最常见的翻车点现象是数据库能建但一启动就挂报共享内存相关错误。宁可多给不要卡着算。2.2 内核参数Preinstall RPM 还是手工配手册给了两条路用oracle-database-preinstall-19c这个 RPM 自动配或者手工写/etc/sysctl.d/97-oracledatabase-sysctl.conf。我的建议是生产环境走手工原因很简单——Preinstall RPM 会顺手把numaoff写进内核参数还会创建用户和组这些动作在已有规范的环境里往往是多余的甚至和现有配置冲突。手工配置的核心参数如下这份清单和手册一致# /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 1048576kernel.shmmax这个值在 64 位系统上其实可以设得更大手册给的 4294967295 是保守值够用但不一定最优kernel.sem的四个数字分别是semmsl semmns semopm semmniRAC 环境下如果并发连接多semmns可能需要上调。改完执行sysctl --system让所有配置文件生效再用sysctl -a | grep抽查几个关键项确认落盘。如果坚持用 Preinstall RPM手册也给了 yum 源配置方式装完它会自动创建oracle用户、oinstall和dba组并写好 sysctl 和 limits。但要注意RPM 装的参数是通用模板RAC 场景下ip_local_port_range这类和 VIP/SCAN 监听相关的项最好还是人工复核一遍。2.3 软件包与 CVU 预检查RHEL 7.6 上装 19c RAC缺包是最容易在runcluvfy阶段暴露的问题。手册列了一长串包名核心是compat-libcap1、compat-libstdc、libaio、libaio-devel、libX11系列、ksh、make、net-tools、nfs-utils、smartmontools、sysstat。其中net-tools是 RAC 和 Clusterware 的硬依赖nfs-utils和python-configshell、targetcli这一组是 ACFS 远程相关的不用 ACFS 可以省但 CVU 可能会报 warning。装完包之后手册建议跑一次 CVU 预检查。cvuqdisk这个 RPM 在 Grid 安装介质的cv/rpm目录下两个节点都要装且版本要一致# 设置 cvuqdisk 所属组通常是 oinstall export CVUQDISK_GRPoinstall # 在每个节点安装注意包名版本以实际介质为准 rpm -ivh cvuqdisk-1.0.10-1.rpm # 运行预检查-fixup 表示尝试自动修复可修复项 ./runcluvfy.sh stage -pre crsinst -fixup -n node1,node2-fixup这个参数很实用它能自动修掉一部分权限和配置问题但修不了缺包和内核参数。预检查输出里凡是标failed的必须在跑gridSetup.sh之前清零否则安装中途失败回滚更麻烦。3. 网络规划GNS 配 SCAN 到底怎么设才不返工网络是 19c RAC 安装里最容易反复的一环因为 19c 在 VIP、GNS、Flex Cluster 上的行为和 11g 差别不小。手册把网络配置单独成章并且给了“固定配置”和“GNS 固定配置”两种方案这个划分很务实。3.1 19c 网络规划的几个硬约束先把手册里散落的约束集中说清楚这些是设计阶段就要定死的第一Public、VIP、SCAN VIP 必须在同一子网段Private 走独立网段。第二从 18c 开始 VIP 变成可选项但要么所有节点都配 VIP要么都不配不支持只给部分节点配。第三Private 网卡最多四个 interface 参与 HAIP超过四个的部分自动降为冗余所以不必强行做 bond集群自己会做高可用。第四Public/VIP 主机名只能用字母数字和连字符下划线是非法的——这条踩过的人不少_在 DNS 里合法但在 Oracle 命名里会直接报错。手册给的/etc/hosts示例结构是这样的地址按自己环境替换# Public 192.168.204.11 pub19-node1.rac.example 192.168.204.12 pub19-node2.rac.example # Private 40.40.40.41 priv19-node1.rac.example 40.40.40.42 priv19-node2.rac.example # VIP 192.168.204.21 vip19-node1.rac.example 192.168.204.22 vip19-node2.rac.example # SCAN VIP三个交给 DNS 或 GNS 解析 192.168.204.33 scan19-vip.rac.example 192.168.204.34 scan19-vip.rac.example 192.168.204.35 scan19-vip.rac.example # GNS VIP 192.168.204.10 gns19-vip.rac.example注意 SCAN 是三个 IP 对应同一个 SCAN 名称这是 SCAN 的固有设计不是写错了。如果只用固定配置SCAN 的三个地址在 DNS 里做三条 A 记录即可如果要上 GNS配置逻辑就复杂一层。3.2 GNS 配 SCAN 的 DNS 关键两行GNSGrid Naming Service的本质是把 VIP、Private IP 甚至 SCAN 的地址分配权交给集群自己通过 DHCP DNS 动态下发。手册里最值钱的部分是那段named.rac.libai正解文件末尾的两行# 子域 vip.rac.libai 的解析权交给 gns.rac.libai vip.rac.libai. IN NS gns.rac.libai. # gns.rac.libai 的地址 gns.rac.libai. IN A 192.168.204.10这两行是整个 GNS 方案的枢纽。它的含义是把vip.rac.libai这个子域的权威解析委托给 GNS 服务器而 GNS 服务器本身解析到 192.168.204.10。于是当gridSetup.sh里配置 SCAN 为scan19.vip.rac.libai时这个名称落在vip.rac.libai子域内解析请求自然被转给 GNSGNS 就能动态管理 SCAN VIP 的地址。这里有个必须对齐的细节gridSetup.sh里填的 GNS IP 必须是 192.168.204.10subdomain 必须填vip.rac.libaiSCAN 名称必须包含这个子域。三者任何一处对不上安装时 SCAN 解析就会失败报PRVG-1101: SCAN name failed to resolve。我见过有人 SCAN 填成scan19.rac.libai结果不在 GNS 子域里DNS 委托不生效卡了很久。反向解析区文件named.192.168.204和named.40.40.40也要建PTR 记录和 A 记录一一对应。反向区缺失不会立刻让安装失败但后续节点加入、VIP 漂移时会出现解析异常属于埋雷。3.3 时钟同步、SSH 超时与 I/O 调度网络之外手册的“其他配置”章节里有几个容易被跳过但很要命的项。时钟同步是 RAC 的生命线两个节点时间漂移超过阈值Clusterware 会直接踢节点。手册建议配 NTP 或 Chrony生产环境用内网时间源别依赖公网。SSH 超时限制这条手册写的是调整sshd_config里的ClientAliveInterval和ClientAliveCountMax。原因是 Grid 安装和后续运维大量依赖节点间 SSH默认超时太短会导致runcluvfy或ssh等价性检查间歇性失败表现为“明明配了互信却报不通”。把ClientAliveInterval设成 300、ClientAliveCountMax设成 3 是常见做法。I/O Scheduler 这块手册提到根据存储类型调整。SSD 或全闪存阵列用none或noop机械盘用deadline别用cfq。这个设置对 ASM 的 I/O 延迟有实际影响尤其是高并发写入场景。改法是写 udev 规则或/sys/block/sdX/queue/scheduler持久化建议走 udev。4. UDEV 绑盘与 gridSetup 执行从裸盘到集群起来OS 和网络都就绪后就进入 ASM 磁盘准备和 Grid 安装。这两步是手册里操作密度最高的部分也是翻车最集中的地方。4.1 UDEV 规则绑 ASM 磁盘的正确姿势ASM 需要的是稳定、权限正确的设备名而不是每次重启可能变化的/dev/sdb。手册给的是 UDEV 方案核心是拿到磁盘的 SCSI ID 或 WWID然后写规则文件。先查盘# 用 udevadm 查块设备的唯一标识/dev/sdb 换成实际候选盘 udevadm info --queryall --name/dev/sdb | grep -E ID_SERIAL|ID_WWN # 或用 scsi_id 直接取 WWID /usr/lib/udev/scsi_id -g -u -d /dev/sdb拿到 WWID 后写/etc/udev/rules.d/99-oracle-asmdevices.rules# 每条规则对应一块 ASM 盘OWNER/GROUP 必须是 grid 用户和 asmadmin 组 KERNELsd*, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id -g -u -d /dev/$name, RESULT3600c0ff000d8a1b2c3d4e5f600000001, SYMLINKasm-disk1, OWNERgrid, GROUPasmadmin, MODE0660这里就是开头那个坑的根源KERNELsd*匹配范围太宽如果PROGRAM和RESULT没精确限定系统盘也可能被套上规则。稳妥做法是把KERNEL收窄到具体盘符范围或者确保RESULT的 WWID 完全唯一。规则写完后# 重新加载规则并触发 udevadm control --reload-rules udevadm trigger --typedevices --actionchange # 验证符号链接和权限 ls -l /dev/asm-disk*验证时重点看三样符号链接是否生成、owner 是不是 grid、权限是不是 0660。三者缺一ASM 实例就认不到盘。4.2 gridSetup.sh 的关键选择项Grid 安装用gridSetup.sh手册里标注了几个必须做对的选项。集群模式选 Standalone Cluster19c 默认就是 Flex 架构下的 StandaloneGIMR 按需选配——不配 GIMR 能省 1G SGA 和一块磁盘但会失去一些集中诊断能力生产环境我一般建议配上。SCAN 配置页是 GNS 方案的关键落点GNS IP 填 192.168.204.10subdomain 填vip.rac.libaiSCAN 名称填scan19.vip.rac.libai。如果前面 DNS 委托配对了这一步会自动解析出三个 SCAN VIP解析不出来就说明 3.2 节那两行没生效。ASM 磁盘发现路径要指向/dev/asm-disk*冗余模式按实际磁盘数选 External单块或存储已做冗余或 Normal至少两块。安装过程中root.sh要在每个节点按提示顺序执行第一个节点跑完再跑第二个顺序错了集群起不来。4.3 runInstaller 与 dbca 的衔接Grid 起来之后runInstaller装数据库软件这一步相对标准化选 RAC 数据库、指定两个节点、Grid 基础架构目录指向刚装好的 Grid Home。软件装完用dbca建库建库时注意选 ASM 存储、字符集和实例参数按业务定。手册把gridSetup.sh和runInstallerdbca放在同一章是因为这三步是连续动作中间任何一步失败都要回退检查。建库阶段最常见的失败是 ASM 磁盘组空间不足或权限不对现象是dbca跑到 80% 左右报ORA-15018回头查还是 UDEV 或磁盘组的问题。5. 避坑清单五个真实翻车现场与排查路径装 RAC 这件事成功路径大同小异失败原因却五花八门。下面五条是我和周围人实际踩过的按“现象 → 原因 → 解决”整理照着排查能省不少时间。现象一runcluvfy报PRVF-7532: Package missing但rpm -q显示已装。原因通常是装了 32 位包但缺 64 位或者包版本低于 19c 要求的最低版本。RHEL 7.6 上compat-libstdc这类包容易只装了 i686。解决用rpm -qa | grep 包名确认架构和版本缺 64 位的补装x86_64版本版本不够的升级。现象二gridSetup.sh在 SCAN 配置页报PRVG-1101: SCAN name failed to resolve。原因几乎都是 GNS 子域委托没配对或者 SCAN 名称不在 GNS 管理的子域内。解决回到 DNS 正解文件确认vip.rac.libai. IN NS gns.rac.libai.和gns.rac.libai. IN A ...两行存在用nslookup scan19.vip.rac.libai在节点上验证能否解析出三个地址解析不出来就查named服务状态和防火墙。现象三ASM 实例启动报ORA-15018: diskgroup cannot be created候选盘列表里混入了系统盘。原因就是 UDEV 规则KERNELsd*匹配过宽或者RESULT的 WWID 写错导致规则误匹配。解决ls -l /dev/asm-disk*看符号链接指向用udevadm info反查每个链接对应的真实设备把规则里的KERNEL收窄或修正 WWID重新udevadm trigger后再试。现象四节点二执行root.sh后集群起不来crsctl stat res -t显示网络资源 offline。原因多是 Private 网段不通或 HAIP 配置异常也可能是两节点hosts文件不一致。解决先ping私网地址确认连通再查ifconfig看 HAIP 地址是否起来最后比对两节点/etc/hosts是否完全一致。私网走交换机时确认 VLAN 没隔离错。现象五数据库建好后运行一段时间节点被踢出集群日志报时间同步异常。原因是 NTP/Chrony 没配或时间源不可达节点间时钟漂移超阈值。解决chronyc tracking或ntpq -p查同步状态确保两个节点指向同一内网时间源chrony的makestep参数在首次同步时允许跳变避免小偏差累积。6. 装完之后怎么验证三条命令确认集群真的健康安装成功不等于集群健康很多问题要跑一段时间才暴露。我习惯在交付前做一轮验证三条命令覆盖大部分关键面。第一条crsctl check cluster -all确认所有节点的 Clusterware 栈都是 online。输出里每个节点应该显示CRS-4537: Cluster Ready Services is online任何一个节点报 offline 都要查。第二条crsctl stat res -t看资源拓扑。重点看ora.LISTENER_SCAN1.lsnr、各节点 VIP、ora.asm、ora.DATA.dg这些资源是否都在对应节点 onlineSCAN 监听是否三个都起来。有资源在INTERMEDIATE状态说明还在切换等一会儿再看。第三条srvctl status database -d 库名确认实例在两个节点都 open而不是一个 open 一个 mount。# 一次性把关键状态拉出来 crsctl check cluster -all crsctl stat res -t | grep -E ONLINE|INTERMEDIATE|OFFLINE srvctl status database -d ORCL除了命令还有两个容易被忽略的验证点。一是 Hugepages 是否真的被用上了grep HugePages_Free /proc/meminfo如果 Free 接近 Total 说明没分配出去实例可能没走大页回头查memlock和vm.nr_hugepages。二是 SCAN 的负载是否均匀lsnrctl status在三个 SCAN VIP 上分别看连接数长期严重倾斜说明客户端连接串或 DNS 轮询有问题。有个习惯我保持了几年每次装完 RAC不管多顺利都把crsctl stat res -t和srvctl config database的输出存一份到运维文档里作为基线。后面出问题时拿当前状态和基线一比哪个资源变了、哪个配置漂了一眼就能看出来。这套手册里的步骤我照着走过几遍最大的体会是——OS 层和网络层的预处理花的时间越多后面 Grid 安装越顺反过来赶进度跳过预检查的最后都在某个ORA-错误上连本带利还回去。希望这份拆解能帮到你少走几个我走过的弯路。本文还有配套的精品资源点击获取