Oracle 19c RAC Linux 7.6 安装前置配置与 GNS/SCAN 实战

发布时间:2026/10/31 2:31:26
Oracle 19c RAC Linux 7.6 安装前置配置与 GNS/SCAN 实战 简介《Oracle 19c RAC on Linux 7.6安装手册》面向Oracle数据库管理员、集群架构师与实施工程师围绕Red Hat 7.6环境下19c RAC的落地部署重点处理GNS配置SCAN、Flex ASM使用以及集群模式选择等实际问题适合具备一定Linux与数据库基础、希望向高级集群运维进阶的读者参考。内容按实施流程组织覆盖操作系统环境检查、关闭THP并开启Hugepages、Red Hat 7软件包与其他依赖安装、内核参数配置、CVU检查、固定网络与GNS加固定网络两种方案、时钟同步及杂项配置并说明Standalone Cluster与Domain Service Cluster模式差异、版本变化和常见问题排查思路。压缩包共1个docx文件约160KB轻量便于随查随用已有719人学习下载说明其在RAC实施场景中具备一定参考价值。读者可据此系统梳理19c RAC安装全链路理解Flex ASM与集群模式选择并借鉴问题定位、日志分析、故障处理与复盘方法减少重复试错。1. 卡在安装器之前那两天19c RAC 在 Linux 7.6 上的真实工作量两台机器、双网卡、三块共享盘gridSetup.sh的图形界面点完不到四十分钟而从裸机走到能点那一步我用了整整两天。Oracle 19c RAC 在 Linux 7.6 上的难点从来不在安装器本身而在安装器之前的一长串前置条件THP 有没有真关掉、HugePages 和 memlock 对不对得上、SCAN 的正反解走不走得通、ASM 盘的属主稳不稳定。这份手册把 OS 检查、内核参数、网络含 GNS 代管 SCAN、UDEV 绑盘、gridSetup 到 dbca 的整条链路拆成了可执行步骤也交代了 Flex ASM 以及 Standalone Cluster 与 Domain Service Cluster 两种集群模式的版本背景。第一次上手 19c RAC 的 DBA 能照着走装过 11g、12c 想搞清楚 19c 变了什么的老手也能从参数对照表里挑到自己要的那几行。2. 从 OS 检查到 HugePages内存、内核参数与 limits 的四个落点这一章是整份手册里最容易被跳过、也最容易在后面翻车的部分。19c 对操作系统的要求本身不苛刻麻烦的是这些要求分散在内存、内核、用户限制、大页四个地方任何一个没对上症状都不会在检查阶段暴露而是在gridSetup.sh跑到一半或者实例启动时才炸出来。我的习惯是先把这一章的所有动作做完并留下记录再去碰安装介质。2.1 开局先量七个数字先别急着装包把机器现状量清楚。手册里列了七项硬性检查我按可执行顺序整理成下面这张表两节点都要跑输出保存成安装记录的一部分。检查项命令19c 要求物理内存grep MemTotal /proc/meminfo至少 8G运行级别runlevel3 或 5内核与发行版uname -mr、cat /etc/redhat-releaseRHEL 7.4 起3.10.0-693.5.2.0.1.el7 及以上OEL 用 UEK4/UEK5/tmp 空间df -h /tmp至少 1GSwapgrep SwapTotal /proc/meminfo内存 4~16G 时等于内存大于 16G 时给 16G开了 HugePages 要减去分给大页的那部分/dev/shmdf -h /dev/shm、mount | grep shm挂载类型与权限正常软件目录df -h /u01Grid 至少 12G、Oracle 至少 10G实际建议直接给 100G一次性跑完的写法#!/bin/bash # 两个节点各跑一遍输出重定向到 /root/precheck_$(hostname).log echo 内存 ; grep MemTotal /proc/meminfo echo Swap ; grep SwapTotal /proc/meminfo echo 运行级别 ; runlevel echo 内核 ; uname -mr echo 发行版 ; cat /etc/redhat-release echo /tmp ; df -h /tmp echo /dev/shm ; df -h /dev/shm ; mount | grep shm echo u01 ; df -h /u01脚本本身没有技巧价值在于「一次性留档」。Swap 那条规则要特别注意后半句如果规划了 32G 大页给 SGASwap 的计算基数就不再是物理内存而是内存减去大页占用后的剩余部分。这一条在手册里写在表格备注里很容易被当成废话略过但它直接决定后面的vm.nr_hugepages能开多大。2.2 Preinstall RPM 与手工 sysctl 的两条路19c 的内核参数有两条路用预安装包自动配或者全部手工写。两条路的产物是一样的区别在于可控性和可审计性。预安装包这条路最短# 挂上发行版官方的预安装源之后一条命令搞定用户、组、sysctl、limits yum install -y oracle-database-preinstall-19c它替你做的事包括创建oracle用户、创建oinstalloinstall与dbaOSDBA组、写/etc/sysctl.conf相关条目、写用户级 hard/soft 资源限制、设置numaoff。省事但有两个副作用要知道一是它写的 sysctl 落在/etc/sysctl.d/99-*这类文件里优先级很高后面手工加的 drop-in 如果编号更小会被它盖掉二是numaoff是通用建议在 NUMA 拓扑比较规整的新机器上是否关闭建议先跟业务侧确认别默认接受。手工这条路适合要把参数纳入配置管理的场景# 单独一个 drop-in编号 97 是为了让它在 99 之前加载被覆盖时容易发现 cat /etc/sysctl.d/97-oracledatabase-sysctl.conf EOF 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 EOF # 让 drop-in 立即生效不要用 sysctl -p 只读 /etc/sysctl.conf sysctl --system参数里真正需要动脑子的是两个kernel.shmall的单位是页按 4K 页算2097152 页正好是 8G。如果你的 SGA 规划超过 8G这一项必须同步放大否则实例启动会报共享内存分配失败。kernel.shmmax的 4294967295 约等于 4G 减 1 字节是 32 位时代的遗留默认值64 位机器上物理内存大时按「不小于 SGA 大小」重新给通常设成物理内存的一半或更大更稳妥。net.ipv4.ip_local_port_range从默认的 32768 起改成 9000 起是为了给 Oracle 的本地连接留出低位端口段避免和监听、集群心跳抢端口。手册里还额外给了直接写/proc再重启网络的写法那种方式重启即失效只适合临时验证不建议留在脚本里。改完必须验sysctl -a | grep -E shm|sem|aio|file-max2.3 THP 关不掉的根因在 grub2-mkconfig 的路径透明大页是 19c 安装里最经典的玄学问题。先确认状态cat /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/defrag输出形如[always] madvise never方括号落在always上说明开着。两个文件都要看defrag管的是碎片整理只关enabled不关defrag照样会有周期性卡顿。关闭动作本身只有一行内核参数但要落到正确的位置# 先备份出事能回滚 cp /etc/default/grub /etc/default/grub.bak.$(date %F) # 在 GRUB_CMDLINE_LINUX 的引号内最前面插入参数注意保留原有内容和一个空格 sed -i s/^GRUB_CMDLINE_LINUX/GRUB_CMDLINE_LINUXtransparent_hugepagenever / /etc/default/grub grep GRUB_CMDLINE_LINUX /etc/default/grub然后按固件类型重建配置文件这一步选错路径是最常见的失败原因# BIOS 引导 grub2-mkconfig -o /boot/grub2/grub.cfg # UEFI 引导注意目录随发行版不同可能是 redhat / centos / oracle grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg shutdown -r now重启后三重验证少一步都可能骗自己cat /proc/cmdline # 能看到 transparent_hugepagenever cat /sys/kernel/mm/transparent_hugepage/enabled # 应为 [never] cat /sys/kernel/mm/transparent_hugepage/defrag # 应为 [never]sed那一行如果GRUB_CMDLINE_LINUX原本有内容插入后是...never rd.lvm.lv...的形式参数之间靠空格分隔多一个少一个空格都可能让某个参数失效。改完不重启就去看/sys目录是没意义的那些文件反映的是当前内核的运行时状态只有/proc/cmdline才代表下次启动生效的配置。手册里提到可以用 grubby 补充完成剩余步骤grubby --update-kernelALL --argstransparent_hugepagenever是等效做法适合批量脚本。2.4 HugePages 数量与 memlock 的联动算式THP 关掉之后才轮到 HugePages两者是互斥的前者是内核自动合页后者是预分配的固定大页同时开等于白配。数量怎么算手册给的思路是按 SGA 总量反推我把它写成可执行的算式单节点上所有实例的 SGA 之和加上 GIMR 占用的部分。19c 的 Standalone Cluster 安装里 GIMR 已经变成可选项选了就要多算 1GDomain Service Cluster 必须配 GIMR这 1G 一定要计进去。页大小固定 2Mnr_hugepages ceil(SGA_MB / 2) 余量余量一般给 5%~10%。举例每节点一个 RAC 实例 SGA 12G加 GIMR 1G合计 13G13000/2 6500 页加 5% 余量取 6900。# 写入并立即分配 echo vm.nr_hugepages 6900 /etc/sysctl.conf sysctl -p grep -i huge /proc/meminfo紧接着是最容易漏的一环——memlock必须跟上。单位是 KB算式是nr_hugepages * 2048cat /etc/security/limits.conf EOF oracle soft memlock 14131200 oracle hard memlock 14131200 grid soft memlock 14131200 grid hard memlock 14131200 EOFgrid那两行经常被漏掉。19c 里 Grid Infrastructure 的属主是gridASM 实例的 SGA 同样走大页只给oracle配 memlockgridSetup.sh阶段就会因为无法锁定内存而退出。memlock 小于大页总占用时典型报错是ORA-27102: out of memory或启动时提示无法锁定内存看到这两个别去查内存够不够先查这两个数。还有一个顺序问题大页需要在物理内存还比较连续的时候分配。装完一堆东西、跑了一堆进程之后再sysctl分配很可能只拿到一部分。稳妥做法是把vm.nr_hugepages写进配置后重启重启完立刻看HugePages_Total与HugePages_Free是否等于设定值。3. GNS 代管 SCANbind 正反解域与子域委托的四处关键配置网络这一章是整份手册里信息密度最高的部分。固定配置人人会做GNS 托管 VIP 和 SCAN 的配法就不是了——它要求你同时理解 DNS 的区域委托和 19c 集群的地址分配逻辑少一环就是校验不过或者装完地址乱飘。3.1 先定网络模型全固定还是 GNS 加固定手册给了两种模型选之前先把下面这几条硬规则对一遍它们不是建议是安装器的前置断言全 IPv4 或全 IPv6不能混着来。GNS 可以生成 IPv6 地址但集群内部不能一半一半。VIP 要么所有节点都配要么一个都不配。从 18c 起 VIP 对 Clusterware 是可选的但不支持只给部分节点配 VIP。Private 最多四个物理接口做 HAIP超过四个的部分自动变成冗余不做负载。Private 侧可以不配 bond集群自己会做高可用这一点跟很多人的直觉相反。Public、VIP 的名字只能用字母、数字和连字符下划线是不允许的SCAN 名同理。Public、VIP、SCAN VIP 必须在同一个子网段。两种模型的差别可以摊开看项目全固定配置GNS 加固定配置Public各节点网卡固定 IP各节点网卡固定 IPPrivate手工固定可交给 GNS 分配VIP安装器里手工指定GNS 动态分配SCANDNS 三条 A 记录DNS 三条 A 记录同时把子域委托给 GNS适用场景节点少、IP 规划稳定节点多、后续频繁扩缩关键前提在于GNS 要真正「分配」地址背后必须有 DHCP。手册里说得很直白配合 DHCP 才能让 VIP、Private、SCAN 都由 GNS 发地址没有 DHCP 时GNS 只能承担解析职责地址还是得事先规划好。这一点想清楚就会明白为什么大多数两节点实验环境其实用全固定配置更省事GNS 更多是为了验证这条路走得通。3.2 hosts 只写该写的行/etc/hosts里写什么、不写什么是 GNS 场景下第一个坑。原则是交给 GNS 管的地址一行都不要写进 hosts。cat /etc/hosts EOF # public固定配置必须写 192.168.204.11 pub19-node1.rac.example pub19-node1 192.168.204.12 pub19-node2.rac.example pub19-node2 # private走固定配置时写交给 GNS 时删掉 10.10.10.41 priv19-node1.rac.example priv19-node1-priv 10.10.10.42 priv19-node2.rac.example priv19-node2-priv # VIP 与 SCAN交给 DNS/GNS 时不写 EOF短名和长名都写在同一行是因为安装器会用短名做节点间连通性检查用长名做 SCAN 和 VIP 解析少一个都可能在校验阶段报名字解析失败。反过来如果 VIP 也写进 hostsgetent hosts会先命中 hosts 再查 DNSGNS 分配的地址就形同虚设后续排查时表现为 VIP 反复漂移或者 ping 到的地址跟srvctl config vip显示的不一致。3.3 named.conf 的三个 zoneDNS 服务端用 bind装包和启动没什么好说的yum install -y bind chroot systemctl enable --now named配置的重点是三个区域一个正解域两个反解域公网段一个、私网段一个options { directory /var/named; allow-query { any; }; # 测试期放开生产建议限定网段 recursion yes; allow-transfer { none; }; # 禁止区域传送 }; zone rac.example IN { type master; file named.rac.example; }; zone 204.168.192.in-addr.arpa IN { # 192.168.204.0/24 的反解 type master; file named.192.168.204; }; zone 10.10.10.in-addr.arpa IN { # 10.10.10.0/24 的反解 type master; file named.10.10.10; };正解文件里SCAN 要三条 A 记录指向三个不同地址这是 SCAN 能轮询的前提$TTL 600 IN SOA rac.example. admin.rac.example. ( 2024061201 ; serial每次改动必须加一 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS master master IN A 192.168.204.12 pub19-node1 IN A 192.168.204.11 pub19-node2 IN A 192.168.204.12 scan19.vip.rac.example. IN A 192.168.204.162 scan19.vip.rac.example. IN A 192.168.204.163 scan19.vip.rac.example. IN A 192.168.204.164 ; 子域委托vip.rac.example 的解析权交给 GNS vip.rac.example. IN NS gns.rac.example. gns.rac.example. IN A 192.168.204.10反解文件同样不能省CVU 校验会正反双向查询只配正解不配反解典型报错是PRVF-4656或PRVG-1101提示 SCAN 名称解析失败但正解明明是通的人很容易卡在这里$TTL 600 IN SOA rac.example. admin.rac.example. ( 2024061201 1D 1H 1W 3H ) IN NS master.rac.example. 11 IN PTR pub19-node1.rac.example. 12 IN PTR pub19-node2.rac.example. 162 IN PTR scan19.vip.rac.example. 163 IN PTR scan19.vip.rac.example. 164 IN PTR scan19.vip.rac.example. 10 IN PTR gns.rac.example.改完不要急着重启先用语法检查挡住低级错误再验证正反解named-checkconf /etc/named.conf named-checkzone rac.example /var/named/named.rac.example named-checkzone 204.168.192.in-addr.arpa /var/named/named.192.168.204 systemctl restart named # 从集群节点上验证一定要在客户端节点验证本机测试会绕过网络路径 dig short scan19.vip.rac.example A dig short -x 192.168.204.162 getent hosts scan19.vip.rac.examplegetent hosts这一步特别值得单独跑它走的是 glibc 的解析顺序跟 Oracle 实际用的路径一致。dig通而getent不通说明问题在/etc/nsswitch.conf或 hosts 文件不在 DNS。3.4 子域委托与 gridSetup 里的三个填空子域委托的作用是主 DNS 只负责rac.example这一层凡是*.vip.rac.example的查询一律转给 GNS 那个地址去答。这样 GNS 就能在不改动主区域的前提下动态地给 VIP 分配名字。委托要生效需要两处对齐第一处是正解文件里那两行vip.rac.example. IN NS gns.rac.example.声明委托gns.rac.example. IN A 192.168.204.10给出 GNS 的地址。这两行缺任何一行委托链就断了。第二处是gridSetup.sh里的三个填空必须跟 DNS 侧严丝合缝SCAN 名称必须是scan19.vip.rac.example也就是必须落在被委托出去的那个子域之下。写成scan19.rac.example就跑到主区域去了GNS 管不到。GNS VIP192.168.204.10跟正解文件里gns.rac.example的 A 记录一致。GNS 子域vip.rac.example不带末尾的点也不带前面的星号。这三处任何一个写错安装器会在网络校验那一屏卡住报 GNS 相关校验失败但错误信息往往只说「无法验证」不会直接告诉你哪个字段错了。我的做法是先把dig和getent的结果留档再回去比对这三个字段比反复重跑安装器快得多。另外一个容易忽略的细节DNS 和 GNS 所在节点的时间必须跟集群节点一致。时间偏差过大时named的日志里会出现跟签名、缓存相关的告警间接影响解析稳定性。下一章会把时间同步的配法一起讲掉。4. 存储与本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询