Oracle 19c RAC图形化安装这事儿,放在五年前确实是DBA的看家本领,得上过不少生产环境才能撑得起场面。但现在19c的安装框架已经很成熟,只要把前置条件老老实实铺好,再走一遍图形界面流程,新手照样能一次过。这篇文章就是把我实际装过的步骤、踩过的坑、以及那些文档里没写明白的细节全部摊开来讲,照着做就行,不需要你提前懂多少集群原理。
1. 安装前硬核体检:架构设计与环境规划
1.1 RAC到底是什么,为什么需要两个节点
很多刚接触的人会把RAC理解成"两台机器跑同一个数据库",这不算错,但不准确。RAC全称是Real Application Clusters,核心机制是多个实例同时挂载同一个数据库,通过高速私网互联进行缓存融合(Cache Fusion),对外呈现成一个逻辑库。19c时代已经主推Oracle Restart + RAC One Node,但经典的双节点RAC依然是高可用架构里的主力选手。
为什么要两个节点?因为单节点数据库一旦宕机,恢复时间取决于硬件修好和OS启动的速度。RAC的好处是节点级故障时,另外一个节点继续提供服务,应用程序只需要重新连接,不需要等数据库实例重新拉起。对于核心业务系统,这个差异就是"分钟级不可用"和"秒级切换"的区别。
1.2 硬件与操作系统版本核对清单
安装之前我建议先花30分钟把环境清单过一遍,避免装到一半发现某台机器内存不够或者共享盘没挂上,到时候进退两难。
这里有一份我在生产环境下比较常用的最低配置参考:
| 项目 | 建议配置 | 备注 |
|---|---|---|
| 节点数 | 2 | 测试环境可以1节点,但练习RAC必须2节点 |
| CPU | 每节点2核以上 | 19c对CPU要求不高,但编译和建库阶段吃CPU |
| 内存 | 每节点16GB起 | 8GB勉强能跑,但DDL和DBCA容易OOM |
| 系统盘 | 每节点100GB以上 | ORACLE_HOME、GRID_HOME加起来接近30GB |
| 共享磁盘 | 至少3块,每块10GB以上 | OCR、Voting、数据文件都要放共享盘 |
| 私网网卡 | 1000Mbps以上 | 缓存融合通信走这条链路 |
| 公网网卡 | 1张 | 对外提供服务 |
| 操作系统 | RHEL 7.9 / OL 7.9 / 8.x | 19c官方支持7.x和8.x |
版本方面强烈建议选Oracle Linux 7.9,原因很简单:官方认证最全,第三方依赖包仓库配置最省心。RHEL 7.9也没问题,只是有些依赖包要自己去EPEL拉。CentOS 7虽然是社区支持,但官方认证列表里已经不太推荐19c在CentOS上跑了,我踩过坑,建议绕开。
1.3 共享磁盘方案选择:ASM是唯一解
RAC之所以难,很大程度上是因为"共享存储"这个硬性要求。19c RAC的所有数据文件、控制文件、日志文件都必须放在共享磁盘上,而且集群软件本身还需要OCR(Oracle Cluster Registry)和Voting Disk。
共享磁盘可以来自SAN存储、NAS挂载的NFS、或者iSCSI目标。不管底层用什么,到了操作系统层面你必须看到多节点都能访问的同一块磁盘,这是铁律。
ASM(Automatic Storage Management)是Oracle自己的卷管理器,它做的事情就是把裸设备或LUN统一接管,做成ASM磁盘组,然后把文件放在里面。用它有几个明显优势:不用文件系统、支持条带化和冗余、在线扩容。对于RAC来说,ASM不是可选项,是必选项。
ASM磁盘规划这里有个细节:建议至少划分3块独立LUN,其中第1块和第2块用于OCR和Voting Disk的组合(OCR会自动镜像),第3块及以上留给数据磁盘组。如果你只有3块,那DATA组就只有1块盘,没有冗余,测试够了,生产环境务必再加盘。
2. 图形化安装的临门一脚:VNC与系统基础配置
2.1 为什么需要图形界面,VNC搭建实操
19c的Grid Infrastructure安装器(gridSetup.sh)和数据库创建工具(dbca)默认都是图形界面。生产环境经常是Linux服务器,没有显示器可用,所以远程图形界面就是刚需。主流的方案有VNC、X-Manager、X-Forwarding,我个人在安装RAC场景下最推荐VNC。
VNC的搭建不复杂,关键是踩过坑之后我把套路固定下来了:
# 每个节点都要装VNC服务端 yum install -y tigervnc-server # 切换到grid用户可以用的桌面环境 yum install -y xfce4 vnc-server # 如果仓库里有xfce # 为grid用户配置VNC密码 su - grid vncpasswd exit # 启动VNC会话,通常从:1开始,对应5901端口 systemctl start vncserver@:1.service systemctl enable vncserver@:1.service启动VNC之后,务必检查防火墙和SELinux状态。我在一次安装中VNC始终连不上,最后发现是SELinux拦截了端口绑定。
setenforce 0 # 持久化修改,确保重启后依然生效 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config客户端连接用TightVNC Viewer或者VNCViewer都可以,注意输入IP后面要带端口号格式,比如192.168.10.11:1。不要写5901,很多新人在这一步纠结半天,其实:1就代表5901。
2.2 操作系统参数、依赖包、用户组设置
RAC安装对操作系统的参数要求非常细,少一项都会导致集群软件检测阶段报错。我建议直接用官方preinstall包,少走很多弯路:
yum install -y oracle-database-preinstall-19c这个包会自动处理依赖包、内核参数、用户和组的创建,非常省心。但要注意一点,它创建的grid用户默认组不一定完全符合你的规划,我习惯自己先定好用户体系:
groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper groupadd -g 54324 asmadmin groupadd -g 54325 asmdba groupadd -g 54326 asmoper useradd -u 54321 -g oinstall -G dba,asmadmin,asmdba grid useradd -u 54322 -g oinstall -G dba,oper griddb # 如果系统里没有Oracle用户,另建一个oracle用户然后需要把内核参数里面的几个关键点拿出来核一下,重点检查kernel.sem、shmmax、shmmni。有时preinstall脚本给的参数偏保守,特别是在内存很大的机器上,比如512G内存的机器shmmax默认还是4G,这时候需要手动调大:
cat >> /etc/sysctl.conf <<EOF kernel.sem = 250 32000 100 128 kernel.shmmax = 274877906944 # 根据实际内存调整 kernel.shmall = 4294967296 EOF sysctl -p依赖包方面,preinstall基本覆盖了90%,但有几家机器上还会缺compat-libcap1和compat-libstdc++。如果安装器在检测阶段提示缺包,先不要慌,直接:
yum install -y compat-libcap1 compat-libstdc++-33再重新跑检测脚本。
2.3 网络配置与hosts解析,公私网IP千万别搞混
RAC需要两套网络:一套公网PUBLIC(对外提供业务访问),一套私网PRIVATE(节点间缓存融合通信)。这个设计很多新手不理解,简单说就是公网流量大、吞吐高,私网要求低延迟、高稳定。如果业务流量和集群心跳混在一起,一旦大流量就可能导致节点间心跳超时,触发误判重启实例,生产上这是很严重的事故。
Hosts文件是所有网络通信的基础,必须每个节点的hosts内容完整一致。这里有个关键技巧:私网IP不要加域名后缀,公网IP加域名,c##开头的用户命名规则也要提前想好。实际使用中,我习惯把scan地址的域名和管理用的主机名都写在hosts里:
cat /etc/hosts 192.168.10.11 racmain01.pub.example.com racmain01 192.168.10.12 racmain02.pub.example.com racmain02 192.168.20.11 racmain01-priv 192.168.20.12 racmain02-priv 192.168.10.13 racscan.pub.example.com racscan注意公网和私网不要共用网卡,哪怕你只有一台物理机做测试,也要用VMware或者VirtualBox虚拟出两张网卡。
3. Grid Infrastructure图形化安装全流程
3.1 安装界面第一步:配置选项选择
环境准备好之后,用grid用户登录VNC图形界面,进入安装包解压目录:
cd /soft/db_home/grid ./gridSetup.sh等安装器的欢迎界面出来后,第一个关键的选项就是配置类型。这里会遇到三种选择:
- 配置新版集群(Standalone Cluster)
- 添加节点到现有集群
- 配置对软件安装再配置(对已有集群进行软件升级或扩展)
选择Create and Configure a new Cluster,集群类型选Standalone Cluster。
别急着点下一步,先把SSH互信这块讲清楚,因为到这一步很多新手卡住了。
安装器会提示你填写节点信息,点击SSH Connectivity会尝试在根用户下做互信配置。这里必须在root用户下配置互信,否则检测根用户权限会失败。有两种方式:
一是提前手动配好SSH密钥,让两个节点能免密互登。操作方式在所有节点执行:
ssh-keygen -t rsa -N "" -b 2048 -f /root/.ssh/id_rsa cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys ssh-copy-id -i /root/.ssh/id_rsa.pub racmain02二是依赖安装器自动配置,但你这个用户(一般就是grid用户)必须具备sudo权限。我更喜欢手动配好,提前消除一个也许可避开的失败点。
3.2 告知ASM磁盘组与密码
下一步进入ASM配置界面,这里是最容易混淆的地方。19c的Grid Infrastructure里面内置了ASM实例,需要你指定下面几个要素:
- 磁盘发现路径(Disk Discovery Path)
- 磁盘组名称
- 冗余级别
- ASM密码
磁盘发现路径需要和你在/etc/oracle/ocr.loc里配置的udev规则匹配。我习惯使用/dev/asm*作为Udev设备路径,这样规则清晰:
# 在每台机器上都要执行 cat > /etc/udev/rules.d/99-asm.rules <<EOF KERNEL=="sdb1", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sdc1", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sdd1", OWNER="grid", GROUP="asmadmin", MODE="0660" EOF udevadm control --reload-rules配置好Udev后,在安装器里点"Change Discovery Path",填入/dev/asm*,安装器会重新扫描磁盘。如果没有CD-ROM空间的设备被扫描出来,也可以直接输入/dev/mapper/*来匹配多路径设备。
磁盘组命名规则用大写字母,通常起名OCR_VOTE和DATA。第一个磁盘组用于存放OCR和Voting Disk,冗余级别建议选择Normal,意思是需要3块盘。如果只有2块或1块,可以选择External(没有冗余),但这在生产环境我不推荐。
ASM密码复杂度有要求,要同时包含大小写字母和数字,最少8位。这里建议单独设置ASM sysasm密码,不要和数据库sys密码一样,方便后续单独维护。
3.3 网络配置:私网网卡与SCAN IP的关键操作
到了网络配置界面,安装器会自动识别网卡,然后把每张网卡分类为Public或者Private。实际操作中常遇到的问题是:安装器把两块网卡都识别成了Public,说明它没判断出哪块是私网,因为私网网卡的名称和IP段都比较特殊。
你需要手动指定其中一个网卡为Private,然后填写私网IP对应的子网掩码。私网网段通常不对外,安装器会要求你指定Private Interface。这里有两个细节要注意:
- 私网网卡的子网掩码要和IP匹配,比如
192.168.20.0/24对应的掩码是255.255.255.0 - Private网卡在后面会用于ASM实例通信,不需要有默认路由
SCAN IP是集群对外服务的虚拟地址,可以理解成一个"入口"。客户端连接数据库时用SCAN IP+端口,即使某个节点挂了,SCAN会自动把连接指向存活节点。
配置SCAN IP时要注意它不能和公网IP在同一网段的冲突IP,也不能被DHCP分配。如果没需求使用单独DNS,就在hosts文件里写入SCAN解析记录,但生产环境还是建议用DNS的Round-Robin或GNS来解析SCAN。
3.4 root脚本的执行顺序与常见卡点
检查无误后,安装器会执行可选的runInstaller脚本,然后提示需要在所有节点以root用户执行两个脚本。这一步是整个安装过程中最出名的"劝退点"。
第一个脚本是orainstRoot.sh,在/u01/app/oraInventory目录。它创建oinstall组的inventory目录,同时写入权限。这个脚本执行很顺利,通常几秒钟就结束。
第二个脚本是/u01/app/19.0.0/grid/root.sh,这才是真正配置集群的脚本。它做的事情包括:启动ohasd、创建集群注册表、配置CRS、启动集群服务。在生产环境我见过这个脚本卡在某个环节超过15分钟的。
root.sh执行时必须按节点顺序执行,先在第一个节点执行完,等脚本返回后再到第二个节点执行。如果两个节点同时执行,会出现chlock争用、集群资源冲突的问题。
执行root.sh时输出中如果出现CRS-4114错误或者权限不足报错,通常是因为/u01目录的属主不对。正确做法是:chown -R grid:oinstall /u01/app/grid /u01/app/oraInventory,把grid相关目录分配给grid。
3.5 验证集群状态与ASM实例
root.sh在最后一个节点执行完成后,拿grid用户验证集群状态:
crsctl stat res -t crsctl status resource -w "TYPE = ora.cluster.type"正常情况下应该看到cluster_resources那一列都是STATE=ONLINE的状态。常见的异常是ohasd没有起来,原因是hangcheck-timer模块未加载或节点间私网不通。可以检查:
crsctl check crs ps -ef | grep ohasd如果ohasd没起来,检查/var/log/oracle.log,看是不是/dev/asm设备权限不对,或OCR磁盘组无法挂载。
ASM实例的验证方式是用asmcmd进入:
su - grid asmcmd ls能列出磁盘组名称,说明ASM基础健康。再用crsctl stat res t看各节点的ora.asm资源是否都处于ONLINE。
4. DBCA创建RAC数据库实例
4.1 选择RAC数据库类型,而不是Single Instance
Grid Infrastructure装好之后,只是集群层面就绪,还没有真正的数据库实例。创建数据库有两种方式:一种是用dbca图形界面化创建,另一种是用asmca先建磁盘组,然后再dbca。作为保姆级教程,我用的是dbca一步到位的方式。
先用oracle用户启动dbca:
su - oracle dbca界面语言默认英文,但步骤逻辑很清晰。第一步选数据库类型时要多加小心,因为它提供了:
- Oracle Single Instance Database
- Oracle RAC Database
必须选择Oracle RAC Database,不然创建的实例只会在一节点上运行,无法利用集群优势。
接着选择管理类型:
- 使用ASM(推荐,与集群集成度最高)
- 使用文件系统
- 使用Oracle Managed Files
选ASM即可。
4.2 磁盘组与数据对象配置
DBCA会让你选择要把数据库的数据文件放在哪个ASM磁盘组。这里有个很容易忽略的地方:如果你在安装Grid时建的DATA磁盘组只包含了3块盘,没有额外空间,dbca建库时会提示磁盘组空间不足。
建议提前用asmca把数据磁盘组扩一下,或者直接在Grid安装阶段就把DATA磁盘组建为3块盘。我的习惯是安装Grid时建两个组:OCR_VOTE(3块)和DATA(2到3块),这样dbca建库的时候直接选DATA组就行。
数据对象这块,19c的seed模板已经包含System、Sysaux、Undo、Temp四个表空间,字符集建议选AL32UTF8,这已经是业界标准,别再用WE8ISO8859P1之类的老编码了,省得后面应用要存中文时抓瞎。
4.3 生产级参数建议与建库过程注意事项
dbca到第四步会让你填实例名称和参数文件位置。网格范围内默认的是racdb,你可以自定义,但实例名前缀不要用ASM保留字。内存管理建议选"自动内存管理",同时给大页设置留出余量。
有一个值得关注的参数是processes和sessions。dbca默认的processes=300,sessions=600,对生产系统来说偏小,起码要调到1000/1500。你可以等建库完成后再alter system调整,但我建议在建库界面里的Advanced Parameters里直接改掉,省一次重启。
执行建库过程中,dbca会在所有节点上并行创建的实例。一般在第一个节点完成create database之后,第二个节点会自动被配置为备用节点。整个流程顺利的话大约20到40分钟,主要瓶颈在磁盘I/O。
建库完成后,用sqlplus验证实例状态:
export ORACLE_SID=racdb1 sqlplus / as sysdba SQL> select instance_name,status from gv$instance; INSTANCE_NAME STATUS --------------- ------------ racdb1 OPEN racdb2 OPEN SQL> select name,open_mode from v$database; NAME OPEN_MODE --------- ---------- RACDB READ WRITE看到两个实例都显示OPEN,RAC数据库核心创建完成。接着可以用crsctl stat res -t再看一遍集群资源,会发现多了ora.racdb.db、ora.racdb.inst1、ora.racdb.inst2几个资源,全部处于ONLINE状态,这才算真正装完了。
5. 新手最容易踩的坑与排查手册
5.1 VNC黑屏、连接后无桌面
我遇到的VNC最大坑就是只装了tigervnc但是没装桌面环境。很多优化最少的Linux系统只有命令行,启动VNC后进去是黑屏。解决方式:
yum groupinstall "X Windows System" "GNOME Desktop" systemctl set-default graphical.target装桌面需要几分钟,等待屏幕出来后再重启VNC:systemctl restart vncserver@:1.service。如果仍然黑屏,用vncserver -kill :1再vncserver -geometry 1280x1024手动启动。注意不要用root开VNC跑安装器,用grid用户。
5.2 SSH互信配置失败导致安装器终止
安装器在集群节点校验环节会强制检查SSH互信。如果提示"SSH connectivity verification failed",顺着这三个方向排查:一是root的密钥是否正确分发到所有节点;二是/root/.ssh权限是否700,authorized_keys权限是否600;三是每台机器hosts里节点名解析能否到正确IP。
这里有个小技巧,可以在安装器执行SSH检查之前手动在节点上跑一遍命令,确认互信状态:
ssh racmain02 date ssh racmain01 date两个节点都能无密码返回时间就说明互信没问题。
5.3 磁盘权限与Udev规则导致ASM无法发现磁盘
ASM磁盘没被识别,往往不是你磁盘没挂好,而是设备权限没给对。装完Oracle后网格用户如果没有/dev/asm*读权限,ASM实例起来就发现不了任何磁盘。
排查流程:先用root执行ls -l /dev/asmpart看属主,确认归属grid和asmadmin组;再在grid用户下执行asmcmd -p,如果报错ORA-15032说明ASM实例起不来或磁盘没被发现。最终的稳妥方案是走Udev规则,不要直接用/etc/fstab自动挂载和chmod,重启后会失效。
5.4 root.sh执行到一半卡住或CRS资源未启动
root.sh卡住的场景以Wait for cvd to start和Configuring Cluster Synchronization Services居多。这两个阶段都是等集群服务拉起来,如果节点间私网不通,卡半个小时也是正常的。
先在私网分别ping对端:ping racmain02-priv,如果延迟高或不通,看防火墙。RAC的私网通信尤其是缓存融合走的是特定的协议,如果你firewalld没关,就可能导致节点间通信中断。生产环境建议私网网卡不加入防火墙配置,或者专门放行集群相关服务。
如果ping通但root.sh依然卡着,看看tail -f /u01/app/19.0.0/grid/log/目录的日志,特别是$ORACLE_HOME/log/racmain01/agent/crsd下的日志,能定位到具体是哪张网卡或哪个socket没有释放。
5.5 数据库连接报ORA-12518监听无法分发
很多新手建库完成后,用PL/SQL或JDBC连接数据库时遇到了ora-12518这个错误,错误信息写着"监听程序无法分发客户机连接"。这个原因非常多,我们项目里出现过不下5种,最典型的是以下三个:
一是实例还在启动中,但监听已经注册了service。用lsnrctl services查看监听是否已经把RACDB的service注册上去,如果只是DEDICATED而没有GLOBAL,说明实例尚未open完成,等几秒再试。
二是监听配了静态监听且动态注册被禁用。19c默认动态注册,你如果用netca把监听改成静态注册,实例起来后不一定能自动注册,需要在listener.ora里添加SID_LIST_LISTENER,或者在sqlplus里手动执行alter system register。
三是防火墙里没放行1521端口。firewall-cmd --list-ports看看1521是否放行,如果没有,firewall-cmd --permanent --add-port=1521/tcp && firewall-cmd --reload。
另外还有一个比较隐蔽的原因:local_listener参数指向的IP不对。在RAC环境里每个节点的local_listener应该指自己的VIP地址,如果指成了其他节点的VIP,注册会出现错乱,导致分发失败。用show parameter listener查看并修正。
5.6 一些建议在安装前就确认的习惯
回顾每一次安装,有些操作是一开始就注定能否成功的,不只是运气:
- 时间同步:所有节点务必用NTPS同一步调。如果节点间时间偏差超过几百毫秒,集群心跳就可能失效,出现节点被其他节点"踢出"的奇怪现象。
- 备份习惯:跑root.sh之前,如果你对现有环境不放心,可以
tar -czf /root/backup.tar.gz /etc/hosts /etc/sysctl.conf /etc/security/limits.conf。这个习惯帮我快速恢复过环境。 - 日志留存:安装期间安装器的
$ORACLE_HOME/cfgtoollogs/dbca目录下日志非常有用,以后排查问题可以往回翻。
结尾收尾
老实说,RAC安装最大的难点不是安装器本身,而是前期的环境规划和耐心的排查。19c的安装体验已经比11g时代顺畅太多——不需要手动一个个跑脚本,不需要在root下做那么多复杂的tar包解压,图形界面的引导逻辑也很清晰。我实际在虚拟机里反复试过五六次,从第一次的慌慌张张到后来的半小时内完成标准双节点RAC搭建,中间积累的经验全在文章里了。
最后再补一句,如果你在安装过程中卡住了,不要急着删环境重新来。多看日志,多查/var/log/messages、$ORACLE_HOME/log下面的记录,99%的失败都有迹可循。安装RAC是理解Oracle高可用最好的实习课,虽然过程有点繁琐,但搞通一次之后,再看其他集群组件会豁然开朗。祝你们一次通过。