Oracle 19C RAC 在 Linux 7.9 上的安装部署与排错全指南
2026/9/17 19:25:45 网站建设 项目流程

简介:在Linux 7.9环境下搭建Oracle 19C RAC集群,涉及双节点规划、私有/公共网络分离、共享存储与ASM管理、Grid Infrastructure及数据库实例部署等复杂步骤。围绕这些环节的完整安装部署文档以单个PDF文件提供,包体大小约10.13MB,内容从系统规划与环境配置起步,详细讲解防火墙、内核参数、用户权限、YUM源、NTP时间同步、iSCSI多路径共享磁盘等准备工作,并逐步演示Grid Infrastructure安装、ASM磁盘组创建、Oracle 19C数据库实例配置以及集群健康检查。作者基于VMware Workstation Pro 16.1虚拟化环境完成双节点实操,适合具备一定Linux基础、希望系统掌握RAC部署技能的数据库运维与DBA人员。目前已有599人学习参考,读者可按文档步骤搭建自己的测试集群。

1. 把 Oracle 19C RAC 装到 Linux 7.9 上,先想清楚两段式安装

单机上的 Oracle 实例装得再顺手,RAC 也不是把安装介质在第二台机器上再跑一遍。Oracle 19C RAC 集群安装部署是一条两段式的路子:先装 Grid Infrastructure(GI),用 OCR、表决盘和 ASM 把集群件立起来;再装 19C 数据库软件,用 dbca 建一个真正的集群数据库。两段式意味着要准备两套安装包、两组系统用户和两遍 root 脚本。很多人第一次装 RAC 都栽在同一个地方:runInstaller 界面走完就以为结束了,结果 root.sh 在某个节点上报错,ASM 磁盘组找不到候选盘,两个节点互相驱逐,最后只能清理环境重来。这篇按 Linux 7.9(Oracle Linux 7.9 / RHEL 7 / CentOS 7 均适用)双节点环境,从规划、预配置、GI 安装、dbca 建库到验收排错串成一条能照做的路径,适合 DBA、系统管理员,以及准备把单机数据库迁移到 RAC 的团队。建议提前下载好 19C Database 和 Grid Infrastructure 两套 Linux x86-64 安装介质,别等到装的时候才发现少一个。

2. 安装前先立住规划:ASM 存储、网络三段与 OCR 表决盘

RAC 安装失败的根源,多半不在安装动作本身,而在规划。19C 集群依赖三类共享资源:OCR、表决盘和 ASM 数据盘。OCR 记录集群配置,表决盘参与节点心跳仲裁,数据盘放数据库文件,它们都要落在共享存储上,并且两台节点必须以一致的名字看到同一个 LUN。规划的目的,就是让两个节点看到的磁盘、IP、主机名尽可能整齐划一,后面每一步安装才会有确定性的输入。

2.1 存储决定成败:ASM 磁盘组与多路径

共享存储一般交给 ASM 管理,而不是直接格式化成文件系统。磁盘组按用途拆开比较稳妥,我一般会分成 OCRVOTE、DATA、FRA 三组。OCR 与表决盘写入频率低但强一致要求高,独立成组可以避免被数据库的 IO 挤占;FRA 用于快速恢复区和归档日志,是否单独划分取决于你的备份策略。

磁盘组主要用途external 冗余最少盘数normal 冗余最少盘数生产建议
OCRVOTEOCR、表决盘13独立组,至少 external
DATA数据文件、控制文件、spfile13normal 起步
FRA快速恢复区、归档日志13按备份策略可选

external 意味着 ASM 不做镜像,数据保护完全依赖存储层 RAID;normal 则让 ASM 自动维护两份镜像,至少需要三块盘形成两个 failure group。测试环境用 external 能省盘,生产环境只要盘位够,DATA 组就别用 external。还要注意:两个节点识别同一块 LUN 的设备名可能不同,rac1 上看到 /dev/sdb,rac2 上可能是 /dev/sdc。所以不要按盘符规划,必须用多路径别名或 udev 固定名。如果存储接了多路径软件,先在两台节点分别执行multipath -ll,确认 WWID 和设备名完全一致,这一步不一致,后面 ASM 候选盘列表就会出现一半盘找不到的怪问题。

2.2 网络规划:Public、Private 和 SCAN 三个 IP 段

19C RAC 至少需要三组网络角色:Public 对外提供服务,Private 承载心跳与 ASM 流量,VIP 和 SCAN 负责客户端连接与故障转移。Private 必须和 Public 隔离在不同子网,且不能配网关、不能路由到外部。SCAN 可以配 1 到 3 个 VIP,对应同一个 SCAN 名;没有 DNS 时,把 SCAN 的几条解析全部写进两个节点的 /etc/hosts。

网络类型接口建议地址示例用途
Publiceth0192.168.10.11 / 192.168.10.12对外服务、VIP、SCAN 同网段
Privateeth110.0.0.11 / 10.0.0.12Cache Fusion、心跳、ASM 网络
SCAN / VIP与 Public 同网段192.168.10.101-102、192.168.10.111-113客户端统一入口、故障转移

两个节点的 Public 和 Private 接口名最好保持一致,比如都是 eth0 和 eth1。若两节点的网卡名不同,root.sh 阶段处理 networkInterfaceList 时会报"接口名与子网不匹配"之类的错误。另外,不要把所有 IP 都堆在同一个网段里图省事,Private 网络划分出来后,务必在两节点之间用短包长 ping 测试并通过。

2.3 用 Linux 常用命令核对主机名、DNS 与 /etc/hosts

# 分别在两台节点执行,保证 hostname 与规划一致 hostnamectl set-hostname rac1.localdomain hostnamectl set-hostname rac2.localdomain # 查看完整的 hosts 内容 cat /etc/hosts # 核对网卡绑定的 IP ip -br addr show # 验证 SCAN 名解析结果,两台必须一致 getent hosts rac-scan.localdomain

hostnamectl set-hostname修改的是系统级主机名,改完最好grep HOSTNAME /etc/sysconfig/network确认没有旧值残留。getent hosts能看到解析来源是 /etc/hosts 还是 DNS,如果 DNS 和 hosts 文件冲突,root.sh 阶段会报主机名解析错误。很多安装问题其实都是 hosts 文件漏写了一行:SCAN 三条解析没写全、VIP 段和 Public 段写反、Private 名字和网卡实际 IP 对不上。每一条都要在两台节点上核对一遍,再进入安装阶段。

3. Linux 7.9 系统层的预配置:用户、参数与磁盘权限

安装包解压和图形界面都不是最先要做的事。Linux 7.9 上跑 19C RAC,系统层必须先解决三件事:运行用户与目录权限、内核参数与资源限制、共享磁盘的设备权限。这三件事任何一个不到位,安装过程都能往后走,但最后都会在 root.sh 或 ASM 磁盘组创建时集中爆发。

3.1 用户组和目录权限,先照脚本走一遍

Grid Infrastructure 由 grid 用户运行,数据库实例由 oracle 用户运行,二者不能共用同一个用户。常见做法是创建两组用户、一组共用组,按照下面的脚本在两个节点分别执行:

groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper groupadd -g 54327 asmdba groupadd -g 54328 asmadmin groupadd -g 54329 asmoper useradd -u 54321 -g oinstall -G dba,oper,asmdba,asmadmin oracle useradd -u 54322 -g oinstall -G dba,oper,asmdba,asmadmin grid mkdir -p /u01/app/19.0.0/grid mkdir -p /u01/app/grid mkdir -p /u01/app/oracle chown -R grid:oinstall /u01/app/19.0.0/grid /u01/app/grid chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01

grid 用户必须属于 asmadmin,否则没有权限启动 ASM 实例;oracle 用户必须属于 asmdba,否则无法访问 ASM 磁盘组。目录规划上,grid 的 ORACLE_BASE 与 ORACLE_HOME 不能是同一个目录,我一般把 GI 主目录固定成 /u01/app/19.0.0/grid,BASE 用 /u01/app/grid,路径可以自定义,但提前定好两节点一致。如果下载的 zip 包在 Linux 下解压出现乱码,多半是文件名编码问题,可以用unzip -O GBK重新解压,或者在 Windows 端先解压再上传,这个细节在准备安装介质时经常遇到。

3.2 内核参数与 limits:有多少配多少

19C 对内核参数的检查集中在信号量、文件句柄、端口范围和共享内存上。下面这组在 7.9 上可以稳定通过:

cat >> /etc/sysctl.conf <<'EOF' kernel.sem = 250 32000 100 128 fs.aio-max-nr = 1048576 fs.file-max = 6815744 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 = 4194304 vm.swappiness = 10 EOF sysctl -p
参数建议值作用
kernel.sem250 32000 100 128内核信号量,限制并发进程
fs.aio-max-nr1048576异步 IO 请求上限,Oracle 依赖 AIO
fs.file-max6815744全局文件句柄上限
net.ipv4.ip_local_port_range9000 65500扩大本地可用端口范围
vm.swappiness10降低内存换页倾向

共享内存参数 shmmax 和 shmall 我没有写死,这两项按物理内存算更稳妥:shmmax 不低于物理内存的一半,shmall(页数)不小于物理内存页总数,可以用getconf _PHYS_PAGES拿到页数。之后把下面的内容追加到 /etc/security/limits.conf:

oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft stack 10240 oracle soft memlock unlimited oracle hard memlock unlimited grid soft nofile 1024 grid hard nofile 65536 grid soft nproc 2047 grid hard nproc 16384 grid soft stack 10240 grid soft memlock unlimited grid hard memlock unlimited

如果不打算配 HugePages,memlock 设 unlimited 影响不大;如果后面要上大页,memlock 应改为物理内存的 90% 左右。参数改完后用ulimit -a检查实际值是否生效。另两点经常被漏掉:SELinux 建议设为 permissive,firewalld 建议直接关闭,或者至少放行 1521、1522、5500 这几个端口,否则监听注册和 EM 相关组件会在最后阶段报连接超时。

3.3 给 ASM 磁盘写 udev 规则并验证权限

共享 LUN 在系统里默认以 /dev/sdX 出现,owner 是 root,grid 用户无法操作。常见做法是写 udev 规则,为每个 LUN 创建固定的软链接并赋予 grid:asmadmin 权限。先在两台节点分别查每个磁盘的大小,再按磁盘大小写规则:

lsblk -b /dev/sdb blockdev --getsize64 /dev/sdb

blockdev --getsize64输出的是字节数,而 udev 规则里的ATTR{size}是 512 字节扇区数,所以要把字节数除以 512。例如 20GB 磁盘对应 41943040 个扇区:

cat > /etc/udev/rules.d/99-asm.rules <<'EOF' KERNEL=="sd*", SUBSYSTEM=="block", ATTR{size}=="41943040", SYMLINK+="asm-disk1", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sd*", SUBSYSTEM=="block", ATTR{size}=="83886080", SYMLINK+="asm-disk2", OWNER="grid", GROUP="asmadmin", MODE="0660" EOF udevadm control --reload-rules udevadm trigger ls -l /dev/asm-disk*

规则写好后,两节点都要执行udevadm trigger让软链接立即生成。检查ls -l /dev/asm-disk*时,看到软链接指向正确的 /dev/sdX,owner 是 grid、group 是 asmadmin,才算通过。用ATTR{size}做匹配的优点是两节点看到的大小一定一致,不会因盘符不同而错乱;缺点是一旦存储重新划 LUN,size 可能变化,需要重新生成规则。生产环境更稳妥的做法是使用 scsi_id 或 multipath 的 WWID 来匹配,规则写法一样,只是匹配字段换成磁盘唯一标识。

4. 安装 Grid Infrastructure 时最容易出错的 root.sh

GI 是 RAC 的地基。这一阶段安装完成后,集群件、ASM 实例和监听才会存在。很多人觉得 GI 安装界面点起来很快,真正的分水岭全在 root.sh:第一节点跑完,第二节点跟着跑,中途任何一个资源启动失败,都要回到日志里找原因。

4.1 响应文件与 runInstaller 安装套路

有图形环境时,直接执行 gridSetup.sh 按界面走即可;没有图形环境或需要批量交付时,用静默模式。安装之前先跑一遍预检查,这个动作能省掉后面至少一个小时:

cd /u01/app/19.0.0/grid ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -fixup -method root

-fixup -method root会让 cluvfy 自动生成修复脚本,root 执行后可以把大部分系统参数补上。注意 cluvfy 只能查出已知项,查不出网络规划这类语义问题,所以预检查通过不代表一定没问题。静默安装命令如下:

cd /u01/grid19c ./gridSetup.sh -silent -responseFile /home/grid/my_grid.rsp

响应文件可以从安装介质里的 response 模板复制出来改,核心键值大致如下:

oracle.install.option=CRS_CONFIG ORACLE_BASE=/u01/app/grid ORACLE_HOME=/u01/app/19.0.0/grid oracle.install.asm.OSDBA=asmdba oracle.install.asm.OSASM=asmadmin oracle.install.asm.OSOPER=asmoper oracle.install.crs.config.clusterName=RAC19C oracle.install.crs.config.scanName=rac-scan oracle.install.crs.config.scanPort=1521 oracle.install.crs.config.clusterNodes=rac1.localdomain:rac1-vip.localdomain,rac2.localdomain:rac2-vip.localdomain oracle.install.crs.config.networkInterfaceList=eth0:192.168.10.0/24:1,eth1:10.0.0.0/24:5 oracle.install.asm.diskGroup.name=DATA oracle.install.asm.diskGroup.disks=/dev/asm-disk1,/dev/asm-disk2 oracle.install.asm.diskGroup.diskDiscoveryString=/dev/asm-* oracle.install.asm.diskGroup.redundancy=EXTERNAL

networkInterfaceList的格式是接口名:子网:类型,末尾的 1 代表 public,5 代表 private,两个节点的接口名必须与之一一对应。clusterNodes里写的是节点名和对应 VIP 名,VIP 的短名和全名要严格按 /etc/hosts 来。磁盘组部分这里先建了 DATA,等到安装界面询问时也可以让安装程序顺便把 OCRVOTE 建出来,二选一即可,关键是diskDiscoveryString不能写错,它决定了 ASM 能发现哪些候选盘。

4.2 root.sh 报错的常见原因和处置

安装界面执行完成后,root.sh 是按节点顺序执行的:

# 第一节点执行完毕后,再在第二节点执行 /bin/bash /u01/app/19.0.0/grid/root.sh

一定不要在两台节点上同时跑 root.sh。执行时观察输出,最后几行出现CRS-2673: Attempting to stop 'ora.crsd' on 'rac1'之类反复启动又停止的内容,说明集群资源没有拉起来。此时去看日志:

tail -200 /u01/app/grid/cfgtoollogs/crsconfig/rootcrs_$(hostname -s).log

root.sh 失败的常见原因集中在四类:一是 /etc/hosts 与 response 文件里的节点名不一致,OCR 初始化找不到节点;二是 private 网卡接口名与networkInterfaceList对不上,GPnP 无法互通;三是 SELinux 没有设为 permissive 或 firewalld 仍开着,资源端口被拦截;四是 udev 软链接权限不对,ASM 无法打开候选盘。定位到原因后先修复,再执行crsctl stop crs清理半启动的进程,最后重新执行 root.sh。不要一失败就整个环境重装,大部分 root.sh 问题都是可收敛的配置问题。

4.3 用 asmcmd 和 asmca 确认 ASM 实例状态

root.sh 跑完后,集群件和 ASM 实例应该已经在线。进入 ASM 环境检查磁盘组,是安装后必做的一步:

sqlplus / as sysasm SQL> select name, state from v$asm_diskgroup; asmcmd lsdg

在 Linux 7.9 里,sqlplus / as sysasm使用的操作系统认证组是 asmadmin,grid 用户才能无密码登录。asmcmd lsdg输出的每一行代表一个磁盘组,重点看 State 列是否为 MOUNTED,以及 Free 列是否有可用空间。如果建的是 OCRVOTE 和 DATA 两组,这里应该能看到两组都处于 MOUNTED。还要检查集群资源状态:

crsctl stat res -t | grep -E "ora\.(asm|cluster|cssd)"

看到ora.asmora.cluster_interconnectora.cssd都处于 ONLINE,GI 这一层才算真正完成。此时不要急着建库,先把两个节点分别重启一次再观察 ASM 是否能自动拉起,这个动作能提前暴露很多部署后才会出现的问题。

5. 19C 数据库软件安装与 dbca 建库

GI 层就绪后,数据库安装反而是相对轻松的一段。数据库软件用 runInstaller 装到 /u01/app/oracle/product/19.0.0/dbhome_1,安装结束时按界面提示在每台节点执行 root 脚本。19C 软件安装完成后提示的脚本可能是 root.sh,也可能是 rootdb.sh,以安装界面输出的绝对路径为准,不要凭习惯执行。软件装完后,用 dbca 在一个节点上创建 RAC 数据库,dbca 会自动把实例分布到所有节点。

5.1 dbca 非交互建 RAC 库的参数模板

图形界面建 RAC 库点几下就能完成,但为了可复现,建议把命令固化成脚本。下面是一个在 19C 上常用的静默建库命令:

dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName racdb \ -sid racdb \ -databaseType RAC \ -createAsContainerDatabase true \ -storageType ASM \ -diskGroupName DATA \ -recoveryAreaDestination +FRA \ -recoveryAreaSize 20480 \ -sysPassword Oracle_123 \ -systemPassword Oracle_123 \ -pdbAdminPassword Oracle_123 \ -characterSet AL32UTF8 \ -totalMemory 2048

-databaseType RAC决定创建的是集群数据库,不写这个参数 dbca 会默认按单机方式建库。-sid只需写一个实例名前缀,dbca 会自动在第二个节点创建同名实例。-createAsContainerDatabase true走的是 19C 默认的 CDB 架构,建库后自然生成一个 PDB,这也是 19C 单机与 RAC 共用的创建路径。-diskGroupName DATA对应 ASM 里已有 DATA 磁盘组,-recoveryAreaDestination +FRA把快速恢复区放到 FRA 组,如果之前没有建 FRA 组,可以把这行去掉并缩小 recoveryAreaSize。密码长度和复杂度要满足 Oracle 的密码策略,否则 dbca 会在前几秒就退回。个别 Linux 7.9 环境需要指定节点范围时,先跑一遍dbca -help | grep nodeinfo查看当前版本支持的节点参数写法,不同 19C 小版本对节点列表的接受方式略有差异。

5.2 建库后监听和服务资源的变化

dbca 建库不只是创建数据文件,它还会把数据库注册进集群资源,并启动监听和 SCAN 监听。建库结束后,用下面一组命令确认资源都进入 ONLINE:

srvctl status database -d racdb srvctl status scan srvctl status listener
对象检查命令预期结果
集群数据库srvctl status database -d racdbDatabase is running
实例srvctl status instance -d racdb -i racdb1,racdb2两个节点均 Online
SCANsrvctl status scanSCAN 资源 Online
默认监听srvctl status listenerLISTENER 在节点上运行

srvctl status database -d racdb输出有差异时,优先看是实例级问题还是服务级问题。实例没起来,去echo $ORACLE_BASE/diag/rdbms/racdb/racdb1/trace/alert_racdb1.log看告警日志;服务级问题,则从监听和 VIP 入手。这组命令不仅是验收工具,也是之后日常巡检的主命令。

6. 集群装完怎么验收:crsctl 检查与两个排错技巧

6.1 一条龙检查命令

集群装完,别直接开应用,先在一台节点上顺序跑一遍这条链路:

crsctl check cluster -all crsctl stat res -t | grep -E "ora\.(asm|listener|scan|racdb\.db)" olsnodes -n -s srvctl status database -d racdb srvctl status scan

crsctl check cluster -all检查整集群的 CRS 与 CSS 状态;crsctl stat res -t输出每个资源的 target 和 state,两列都应该是 ONLINE。olsnodes -n -s返回节点编号和状态,两个节点都在线且编号正确。最后用客户端方式验证一下连接:

sqlplus system@racdb

能通过 SCAN 名连上,说明 DNS 和监听链路没有问题。到这里,RAC 的安装部署才算画上句号。

6.2 监听起不来与 ORA-28547

监听服务无法启动,先分清是节点监听还是 SCAN 监听。如果srvctl status listener显示 LISTENER 离线,用srvctl start listener拉起,起不来时检查 $GRID_HOME/network/admin/listener.ora 里 HOST 是否写成了主机名;一旦 /etc/hosts 中主机名与 IP 对应关系改了,监听可能始终绑定到旧地址。SCAN 监听起不来的排查重点是srvctl status scan,SCAN VIP 不在线时 SCAN 监听不会启动。

ORA-28547 是另一个高频报错。出现这个错误时先sqlplus / as sysdba,如果本机连接正常,说明数据库没挂,问题出在客户端与实例之间的 Oracle Net 层。最典型的场景是服务器上残留着旧版本 ORACLE_HOME,PATH 环境变量把旧 sqlplus 排在了 19C 前面。which sqlplusecho $ORACLE_HOME是第一时间要跑的排查命令;两套网络库混用时,把旧版本的 ORACLE_HOME 从 PATH 中移除,或用 19C 的 $ORACLE_HOME/bin/sqlplus 显式指定路径,ORA-28547 通常会随之消失。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询