Oracle 19c RAC 安装实战:从架构规划到避坑指南
1. 别急着点安装包19c RAC的架构决定成败先说结论Oracle 19c RAC不是“装一个数据库”而是“在共享存储上搭一套集群再把数据库跑进去”。很多第一次接触RAC的人上来就下载Oracle Database 19c的安装包结果装到一半发现缺GIGrid Infrastructure、缺ASM、缺共享磁盘整个流程直接卡死。我见过太多连“RAC到底需要几台机器”都没搞清楚的同行所以我决定把这篇博客的重点放在“怎么装”之前——“怎么想清楚再装”。RACReal Application Clusters的核心价值用一句话说就是在多台服务器上运行同一个数据库实例这些实例通过共享存储访问同一份数据文件当一个节点宕机另一个节点能继续提供服务业务几乎无感知。而支撑这个架构的底座就是Oracle 19c时代的标准集群软件——Grid InfrastructureGI它包含了Clusterware节点通信、资源管理、ASM自动存储管理、ACFS集群文件系统等一系列核心组件。先装GI、再装数据库软件、最后用DBCA建库这个顺序不能乱。这篇文章主要写给两类人一类是第一次在Linux上搭19c RAC的DBA希望少走弯路另一类是平时只玩单机Oracle突然要接手RAC环境的运维。我会从环境规划开始一路讲到GI安装、数据库建库和常见问题排查全程用我自己实际操作的细节来铺开没有一句是官方网站文档的翻译腔。动手之前先盘一盘整个安装过程中最容易被低估的三件事服务器配置、共享存储和网络规划。这三件事没想明白后面每一步都在给自己挖坑。1.1 19c RAC的架构到底“大”在哪里很多人以为RAC就是把Oracle装两遍其实不是。RAC里有两层核心代码第一层叫Clusterware负责管理节点成员关系、锁、心跳、资源调度第二层叫ASM负责管理磁盘你在Linux上看到的裸设备、分区、多路径盘最终都要被ASM接管。GI这一层装好后系统里会多出一堆进程比如crsd.bin、ocssd.bin、evmd.bin、cssdagent它们分别负责集群资源、节点心跳、事件通知任何一个挂掉集群都可能出问题。所以在规划阶段你就要清楚这台服务器不是简单地装上Oracle 19c就完事它至少要跑两套“操作系统级的守护进程体系”——一个是Linux自己的systemd另一个是Oracle GI的crs体系。这两个体系还会互相影响比如Linux防火墙没关、SELinux没关、NTP没配好都会导致GI起不来或者节点被踢出集群。架构上的另一个关键点是SCANSingle Client Access Name。RAC时代的客户端连接方式和单机完全不一样单机连一个IPRAC则建议配一个SCAN域名由DNS解析出三个VIP客户端只需要连SCAN集群内部自动分发到具体节点。如果你没配DNS也可以用hosts文件硬解析但要提前规划好IP。这里面的坑我后面会详细讲第一次弄RAC的人最容易在IP规划上翻车。1.2 安装之前必须想清楚的选型问题版本选型这件事很多人的做法是“去官网下载最新的19c”但19c也分小版本而且有时候补丁版本太新反而和Linux内核存在兼容性问题。我在生产环境用的组合是Oracle Linux 7.9或RHEL 7.9 19.3.0.0基础版 最新的RURelease Update补丁。19.3是19c的初始版本必须至少要打到19.10以上才建议上生产因为早期的19.3存在不少已知Bug比如ASM磁盘组兼容性、Clusterware滚动补丁失败等问题。如果你是测试环境装个19.3直接用也行但生产环境一定要规划补丁。另外一个容易忽略的点是/etc/hosts里的主机名解析顺序RAC要求节点名、VIP名、SCAN名、GNS名如果你用GNS都能被正确解析。很多安装失败的案例最后查来查去都是hosts文件写错了。还有一个选型问题是“用不用DNS”。说实话我建议测试环境直接用hosts文件生产环境用DNS 固定IP SCAN。GNSGrid Naming Service虽然能自动分配VIP和SCAN但依赖DNS动态更新很多企业内部DNS团队配合度不高反而给自己找麻烦。所以我在生产环境几乎不用GNS全部固定IPSCAN域名也手动写在DNS里。1.3 一次失败装机的预算清单我自己第一次装19c RAC的时候整整折腾了一个多星期最后才发现问题是共享磁盘的udev权限没配对——两个节点的ASM盘属主和权限不一致导致第二个节点挂载磁盘组失败。那次经历让我养成一个习惯在装GI之前把所有的环境检查项列成一个清单逐项打勾缺一项就停下来先解决。这个清单包括两台服务器的主机名、公网IP、私有IP、VIP、SCAN IP是否规划完毕系统版本、内核参数、依赖包是否全部准备好共享存储是否已从存储侧映射到两台服务器LUN是否一致ASM盘是否已用multipath或udev绑定属主是否为grid:asmadmin、权限是否为660SSH互信是否配置成功Linux防火墙、SELinux是否关闭NTP时间同步是否生效/etc/hosts解析是否正常两个节点的hostname是否不重复这些检查项每一个背后都有一段“血泪史”。接下来我按实操顺序从最底层的Linux系统配置开始一直到建库完成逐项展开。你可以直接把这篇文章当一份checklist用装到哪一步就翻到哪一节。2. 从裸服务器到可安装环境Linux基础配置很多初学者以为RAC的安装难点在Oracle软件本身其实前期的Linux系统配置才是决定成败的关键。这里没有巧劲只有细节——你配置错了任何一个系统参数后面GI安装检测的那一步就会直接告诉你不通过然后你只能一层一层往回找原因。2.1 基础环境一台“配得恰到好处”的Linux先说系统版本。我推荐的操作系统是Oracle Linux 7.9或RHEL 7.9内核版本3.10。19c官方要求的最低内核版本是3.10.0-327.el7但新一点的补丁版本对内核也有要求所以建议装系统时直接选7.9避免以后打补丁还要升级内核惹麻烦。系统装好之后第一件事不是安装Oracle而是做几项“纪律性”配置关闭防火墙systemctl stop firewalld systemctl disable firewalld关闭SELinux修改/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled配置hosts文件把节点名、VIP、SCAN全部写进去配置时间同步用chrony或NTP保证两个节点时间差不能超过阈值默认是30秒但建议相差不超过1秒为什么关防火墙因为RAC集群内部通信需要大量端口比如1521、1522、5500等如果防火墙策略没放行节点之间通信异常集群就会出现“脑裂”甚至节点被驱逐。测试环境直接关掉最省心生产环境则要按端口清单逐一放行。SELinux同理Oracle官方虽然给过SELinux的布尔值设置方法但绝大多数情况下你很难精确匹配所有进程的上下文关掉是最稳的选择。hosts文件的写法是个技术活。假设我有两个节点主机名分别是rac1和rac2它们的公网IP是192.168.1.101/102私有IP是10.0.0.101/102VIP是192.168.1.111/112SCAN IP是192.168.1.121。那么/etc/hosts应该这样写192.168.1.101 rac1.localdomain rac1 192.168.1.102 rac2.localdomain rac2 10.0.0.101 rac1-priv.localdomain rac1-priv 10.0.0.102 rac2-priv.localdomain rac2-priv 192.168.1.111 rac1-vip.localdomain rac1-vip 192.168.1.112 rac2-vip.localdomain rac2-vip 192.168.1.121 rac-scan.localdomain rac-scan注意这里是三个IP段公网IP用于业务流量私有IP用于集群内部的cache fusion和心跳VIP是节点漂移地址。很多新手只用两个IP把私有IP省略了结果安装时crsctl检查直接报错连crsctl start crs都起不来。私有IP网络在RAC里是“生命线”cache fusion的块传输都走这个网卡如果延迟太高或丢包整个集群的性能都会崩。时间同步这一项我用的是chrony因为RHEL 7内置chrony比NTP更好用。重点是永远不要把两个节点互相当成时间源必须指向同一个外部时钟源。我第一次装的时候把节点1设为节点2的时间源结果发现两台机器时间一直有偏差后来改成都指向公司内部的NTP服务器才稳定。2.2 共享存储与ASM磁盘组规划接下来是重头戏共享存储。RAC要求所有节点都能访问同一份数据文件所以你必须有一台共享存储设备比如SAN存储、磁盘阵列、或者测试环境用iSCSI。在测试环境里最常见的共享存储方案是Openfiler、FreeNAS或者直接用VMware的共享虚拟磁盘但在生产环境用的都是企业级存储 光纤通道 multipath多路径。我在测试环境里用的方案是iSCSI Linux multipath存储侧把LUN映射给两个节点然后在Linux上用multipath -ll确认多路径盘符。一个关键点两个节点上看到的多路径设备名必须一致比如都叫/dev/mapper/data01否则ASM磁盘组在另一个节点上无法识别。共享磁盘规划的核心指标是磁盘大小和磁盘数量。ASM磁盘组可以有三种冗余级别External Redundancy外部冗余不冗余依赖存储自身RAID。适合测试环境。Normal Redundancy正常冗余一份数据存两份至少需要两个failure group磁盘数量要够。High Redundancy高冗余一份数据存三份至少需要三个failure group。我建议生产环境用NormalASM磁盘组至少配置两个failgroup每个failgroup至少2块盘这样任意一块盘坏掉都不会导致数据丢失。测试环境可以先External少占空间但生产千万别这么做。另外磁盘组的命名建议用简短的英文别名比如DATA、FRA不要用系统自动生成的DATA_0000这种名字去手动管理磁盘那样太乱。磁盘大小的计算可以按这个思路来假设数据库的数据文件是500GB归档日志放在FRA里FRA一般建议是数据文件大小的2倍也就是1TB。那么测试环境至少需要500GB的DATA磁盘组和1TB的FRA磁盘组Normal冗余下总量就要翻倍。先把这些数字定下来再去存储侧划LUN省得到时候折腾半天发现磁盘不够。设备绑定这块我强烈建议用udev而不是ASMLIB。ASMLIB早就被Oracle放弃支持了在Oracle Linux 7上去装ASMLIB纯属给自己添堵。udev的配置方法是写一个/etc/udev/rules.d/96-oracle.rules文件把每个ASM盘的/dev/mapper/xxx固定映射成/dev/asm-disk1这种名称并设置属主和权限。举个例子KERNELdm-*, PROGRAM/sbin/scsi_id -g -u -d /dev/$name, RESULT3600c0ff000d1234567890abcdef, SYMLINKasm-disk1, OWNERgrid, GROUPasmadmin, MODE0660写完规则后执行udevadm control --reload udevadm trigger然后确认/dev/asm-disk1出现并且属主是grid:asmadmin。这一步是最容易被忽略也是最容易出问题的环节两个节点的设备名不一致、权限不一致、UUID写错都会导致GI安装时ASM磁盘发现失败。2.3 用户、组和目录规划在Linux上安装Oracle需要创建两个专用用户grid用户用于安装GI和ASM和oracle用户用于安装数据库软件。同时需要创建以下Linux用户组oinstallOracle软件所有者组dba数据库管理员组oper数据库操作员组可选asmadminASM管理员组把grid用户加入该组asmdbaASM和数据库管理员组把oracle用户和grid用户都加入该组asmoperASM操作员组可选我的习惯是groupadd oinstall groupadd dba groupadd oper groupadd asmadmin groupadd asmdba groupadd asmoper useradd -g oinstall -G dba,asmadmin,asmdba,asmoper grid useradd -g oinstall -G dba,asmdba,oper oracle然后创建Oracle安装目录并设置属主mkdir -p /u01/app/19c/grid mkdir -p /u01/app/oracle mkdir -p /u01/app/oraInventory chown -R grid:oinstall /u01/app/19c chown -R oracle:oinstall /u01/app/oracle chown -R grid:oinstall /u01/app/oraInventory chmod -R 775 /u01/app目录结构的使用方式特别需要注意oraInventory在GI安装时必须和数据库软件的安装目录分开否则后面会遇到“inventory指针指向错误”的问题。很多老手在这个环节都有过惨痛教训因为图省事把所有目录全给了oracle用户结果GI安装时orainstRoot.sh脚本执行权限不对导致整个安装失败。环境变量的配置也是必须做在前面的事。grid用户的环境变量和生产数据库的oracle用户环境变量不同我的配置方式是用一个独立的grid.env文件方便切换。比如grid用户export ORACLE_BASE/u01/app/grid export ORACLE_HOME/u01/app/19c/grid export ORACLE_SIDASM1 export PATH$ORACLE_HOME/bin:$PATH注意ORACLE_SID在GI安装前不要设置得和后面安装完一样否则可能导致一些命令连接进错误的ASM实例。我通常先把注释掉装完GI后再补上避免灰头土脸找半天原因。2.4 系统内核参数与依赖包内核参数配置是一个容易让人选择困难的地方。好在Oracle官方提供了一键配置工具——oracle-database-preinstall包安装后会自动配置所有内核参数、依赖包甚至一些辅助工具。但有些环境里装不了这个包这就得手动设置。最关键的几个内核参数kernel.shmall共享内存页数建议设为物理内存的75%除以页大小kernel.shmmax单个共享内存段的最大大小建议设成物理内存的一半但不要超过15GBkernel.shmmni共享内存段数量4096足够vm.swappiness建议设为10避免Linux过多使用swap导致性能下降fs.aio-max-nr建议设成1048576保证异步I/O够用fs.file-max建议设成6815744这些参数都写在/etc/sysctl.conf里然后执行sysctl -p生效。除了内核参数还有一系列依赖包binutils、compat-libcap1、gcc、gcc-c、glibc、glibc-devel、ksh、libaio、libaio-devel、libgcc、libstdc、libstdc-devel、libXext、libXtst、libX11、libXau、libXi、make、sysstat、unixODBC、unixODBC-devel等。你当然可以一个个手动yum但更省事的是先装oracle-database-preinstall这个RPM包能省掉一大堆排查依赖的时间。在Oracle Linux 7上执行yum install -y oracle-database-preinstall-19c这个包会自动把上面的依赖包全部装好还会创建oracle用户和组。如果你用的不是Oracle Linux而是RHEL 7可能没有这个RPM包那就只能用本地光盘或yum仓库手工安装了。3. 安装GI最容易被“卡脖子”的一步GI安装是整个19c RAC流程中最容易出错、也最考验耐心的环节。很多人卡在这一步好几天不是因为在安装界面里选错了选项而是因为前期Linux环境、共享磁盘权限、以及系统依赖包没搞干净。如果你前面的基础环境配置全部检查通过了到这一步应该会顺利很多但仍然有些细节值得单独拎出来讲。3.1 安装前的cvuqdisk和依赖包检查GI安装包解压之后在/u01/app/19c/grid下会有很多RPM包和脚本。安装之前需要先手动安装cvuqdisk它的作用是让Oracle的集群验证工具CVU能识别到你的共享磁盘。这个包在安装介质里的GridSetup的rpm目录下文件名叫cvuqdisk-1.0.10-1.rpm或类似。执行安装cd /u01/app/19c/grid/rpm rpm -ivh cvuqdisk-1.0.10-1.rpm如果在安装时提示libcap.so.1: cannot open shared object file这种错误说明缺compat-libcap1包装一下gcc相关依赖就行。解决依赖问题后还要设置一个环境变量让CVU能找到磁盘export CVUQDISK_GRPoinstall如果你忘了装cvuqdisk就直接安装GI会在“Run as root”这个环节被srvctl或root.sh卡住所以别跳过这一步。3.2 安装介质与gridSetup.sh把GI的安装包下载解压后在/u01/app/19c/grid目录下以grid用户执行cd /u01/app/19c/grid ./gridSetup.sh启动后是图形界面。如果你在远程服务器上没有图形界面需要先配置X11转发或者使用VNC。但我觉得大多数生产环境根本不会开图形界面所以更推荐用命令行模式安装虽然交互步骤多一点但更可控。实际生产我更喜欢“图形静默”结合先把配置写在响应文件里再用./gridSetup.sh -silent -responseFile /path/to/grid.rsp这种方式。不过对于第一次尝试的人图形向导反而更直观能帮你理解每一步是干什么的。图形向导里的关键选项是选择“Configure Oracle Grid Infrastructure for a New Cluster”填写Cluster Name集群名比如rac-cluster选择“Configure a Standard Cluster”添加两个节点的主机名和VIP地址SCAN和GNS部分我前面提过生产环境推荐用DNS做SCAN解析。在这个界面里选“Use DNS for SCAN”并填写SCAN名称比如rac-scan.example.com。如果你没DNS选“Use GNS”则需要在DNS里配置GNS区域口味比较重测试环境可以直接选“Configure SCAN using a manually configured SCAN listener”这种变通方案把SCAN IP写在hosts里也可以。接下来会进入SSH互信配置的步骤。这一步会检测两个节点之间的SSH连通性你需要先手动配置好grid用户的SSH公钥互信。具体操作是分别在两个节点上执行ssh-keygen生成密钥然后把~/.ssh/id_rsa.pub追加到对方的~/.ssh/authorized_keys里。配置完后用ssh rac1 date、ssh rac2 date测试一下确保不输密码能连通。界面里点的“Test”按钮本质上就是测试这个互信。3.3 OCR与Voting Disk的存放位置GI安装需要两个关键元数据OCROracle Cluster Registry和Voting Disk它们都必须存放在共享存储上RAC才能保证集群状态的一致性。在安装向导中ASM磁盘组部分会要求你选择用于存放OCR和Voting Disk的磁盘组。我的习惯是单独建一个小的ASM磁盘组比如叫SYSTEM大小20GB即可专门用来放OCR和Voting Disk。这个磁盘组我设置Normal冗余两块盘各10GB如果测试环境可以直接External一块盘20GB。注意千万不要把OCR/Voting Disk和数据库文件放到同一个磁盘组里否则查询性能和数据安全边界都会受影响。接下来ASM磁盘组配置有一个选择是否启用“ASM Filter Driver”。这个技术其实就是用一个内核模块直接过滤IO请求避免某些节点错误地写入磁盘组。默认推荐启用但我建议测试环境可以先不启用因为启用后需要额外配置内核模块和系统启动项对新手不友好。生产环境建议启用详见Oracle官方文档。配置完磁盘组之后安装程序会跑一个“Run as root”的脚本步骤要求你在两个节点上分别执行orainstRoot.sh在/u01/app/oraInventory目录下和root.sh在$GRID_HOME目录下。这一步一定要按顺序来先在节点1执行orainstRoot.sh再在节点2执行然后节点1执行root.sh节点2执行root.sh。root.sh执行过程中会向hosts文件和OCR写入关键配置如果在两个节点同时执行会造成锁等待甚至导致OCR写入失败。3.4 root.sh的“通病”与ASMCA验证root.sh执行中经常遇到的坑我举一个最常见的例子执行到一半报错说“The number of votes needed for a quorum is equal to the number of votes in the configuration”。这个报错一般是因为Voting Disk磁盘的发现权限或者ASM磁盘组权限有问题尤其常见于udev配置错误的情况。解决方法是先检查ll /dev/asm-disk*确认属主都是grid:asmadmin、权限是660两个节点一致然后再重新执行一次root.sh。另一个很常见的问题是DNS解析。root.sh在执行时会尝试用SCAN名字解析VIP如果你没有配置DNS仅靠hosts文件那么一定要确保/etc/hosts里的SCAN域名不是注释状态。有些安装文档建议在生产环境使用DNS但如果你因为测试环境跳过DNS务必确认SCAN解析出的IP是三个固定的VIP或者一个固定的虚拟IP不要解析到节点自身的公网IP否则会导致SCAN监听器注册失败。GI装完以后用crsctl stat res -t检查一下集群资源状态你会看到一排资源都是ONLINE状态其中ora.asm、ora.cssd、ora.crsd必须是ONLINE。然后执行asmca打开ASM配置助手确认ASM实例运行正常并且SYSTEM、DATA、FRA这些磁盘组都是MOUNTED状态。另外还能用asmcmd lsdg查看磁盘组的使用情况顺便验证一下两个节点的ASM实例是否都正常。4. 数据库软件安装与DBCA建库GI安装完毕后集群的底层已经具备跑RAC的条件了接下来安装数据库软件和创建数据库就相对顺畅很多。但这里的“顺畅”是相对的——如果GI环节没整利索数据库软件安装时依然会提示各种问题。这一节我接着讲数据库软件安装的过程然后到DBCA建库为止。4.1 数据库软件安装oracle用户的“主场”数据库软件安装必须以oracle用户执行中间会用到oracle用户和oracle组。解压数据库安装包到/u01/app/oracle/product/19c/dbhome_1目录或者任何你规划的ORACLE_HOME然后执行cd /u01/app/oracle/product/19c/dbhome_1 ./runInstaller安装类型选择“Set Up Software Only”这一步我是推荐选择“software only”而不是直接“Create and configure a database”因为RAC环境下用DBCA建库会更灵活。后面建库时再通过DBCA把数据库注册到集群里方便指定字符集、内存分配、磁盘组等参数。在“Cluster Installation”界面要勾选“Cluster Installation”并加入两个节点这样数据库软件才会被安装到两个节点上。如果你这里漏选了只在当前节点装了数据库软件后面DBCA建库时另一个节点会找不到ORACLE_HOME报错“ORA-12547: TNS lost contact”。软件安装完成后会要求你在两个节点以root执行root.sh脚本。这个脚本会在两个节点上完成数据库软件目录权限设置、环境变量注入、网络配置等。执行顺序同样是节点1先、节点2后确保不会出现文件竞争。4.2 DBCA建库关键参数与注意事项执行dbca图形(命令行)创建数据库。其中比较关键的几个参数Global Database Name全局数据库名比如orcl.example.comSID前缀orcl存储类型选择“Oracle Automatic Storage Management (ASM)”磁盘组选择DATA作为数据文件存放位置FRA作为快速恢复区字符集生产环境推荐AL32UTF8除非业务有历史兼容性限制否则别用ZHS16GBK了跨字符集的问题迟早会找上你内存管理选择“自动内存管理AMM”测试环境给2GB即可生产环境按物理内存的40%~50%分配数据库选项建议全部取消勾选“Oracle Text”“OLAP”等不用的组件减少后续维护成本DBCA在RAC环境下会通过srvctl把数据库注册到集群创建完成后可以用crsctl stat res -t看到ora.orcl.db资源已ONLINE两个实例orcl1、orcl2分别在两个节点上运行。你还可以用srvctl status database -d orcl来查看两个实例的运行状态。建库过程中有一个细节很多人忽略redo日志组的大小和数量。默认的redo日志组会比较小200MB左右在高并发写入场景下会导致频繁日志切换。建议直接把redo调成2GB一组、每个节点至少2组或者3组。另一个是UNDO表空间RAC的每个实例要有独立的UNDO表空间DBCA默认会为实例1和实例2各创建一个UNDO表空间这个保持默认即可不要手动把两个实例的UNDO指到同一个表空间。数据库创建完成后lsnrctl status检查一下监听是否正常。在RAC环境里监听器的管理应该用srvctl而不是直接lsnrctl start因为srvctl会把监听器作为集群资源来管理节点重启后能自动拉起来。如果你只用lsnrctl start则监听器不会随集群自动启动以后会出现“数据库在线但客户端连不上”的情况。5. 避坑指南常见问题与排查记录这部分我拿自己的实战经验当例子列一下19c RAC安装过程中最高频的问题以及我对应的排查思路和解决方案。这些问题有一半以上会在你第一次安装时遇到所以建议收藏。5.1 常见问题速查表问题现象可能原因排查路径与解决方案gridSetup.sh报SSH配置失败SSH互信没配好或者防火墙拦截了22端口检查~/.ssh/authorized_keys、~/.ssh/known_hosts手动ssh rac1 date验证关闭防火墙或放行22端口root.sh执行报“voting disk not found”ASM盘权限不对或udev设备名不一致ll /dev/asm-disk*确认属主为grid:asmadmin、权限为660两个节点设备名一致必要时重跑udev规则GI安装时PRVF-0002报错hosts文件解析有问题或DNS配置错误检查/etc/hosts、/etc/resolv.conf确认SCAN IP、VIP、主机名均能正确解析crsctl stat res -t中ora.cssd状态异常Linux防火墙/SELinux未关闭或者时间未同步关闭firewalld和SELinux使用chrony统一时间源重启GIcrsctl stop crs crsctl start crs节点被集群驱逐Node Eviction私有网卡心跳丢包或延迟过高检查私有IP网卡的MTU是否一致用ping -s 65000测试大包确认私有网络没有经过不稳定的交换机dbca创建数据库时报ORA-15032/ORA-15063ASM磁盘组空间不足或ASM实例未启动asmcmd lsdg查看磁盘组剩余空间crsctl stat res -t确认ora.asm资源ONLINE并用sqlplus / as sysasm检查ASM实例状态客户端无法通过SCAN连接数据库SCAN监听器未启动或SCAN解析错误srvctl status scan、srvctl status scan_listener检查SCAN IP是否被正确解析到三个VIP地址节点重启后数据库不会自动启动srvctl注册的资源未开启自动启动执行srvctl enable database -d orcl、srvctl enable service -d orcl -s 服务名同理检查监听器资源ASM磁盘组无法mount磁盘组内有节点未能发现磁盘或磁盘损坏kfod命令查看ASM磁盘发现情况查看/var/log/messages和ASM警报日志确认设备是否在另一个节点正常出现5.2 踩过的坑一次由“多路径盘符混乱”导致的装机会话这里分享一个我印象特别深的排障过程。有一次在测试环境部署19c RAC一切配置都正常gridSetup.sh也已经顺利执行到root.sh结果在节点2执行root.sh时报错ORA-15032: not all alterations performed后来跟着是ORA-15063: ASM discovered an insufficient number of disks for disk group DATA。我当时第一反应是ASM磁盘组在节点2上未能发现。检查了一遍nil发现节点1的/dev/mapper/data01在节点2上变成了/dev/mapper/data02——原来存储侧LUN映射给两个节点时scsi_id的优先级顺序不同导致multipath生成的设备名在不同节点上不一致。这样ASM通过磁盘名去识别盘就完全对不上号。解决方法是改用udev绑定固定的设备名不依赖multipath生成的自动名称。也就是我前面讲的在96-oracle.rules里用RESULT匹配scsi_id得到的UUID再强制生成/dev/asm-disk1这个符号链接。这样无论multipath怎么映射始终以asm-disk1作为ASM盘的唯一入口问题就解决了。类似的还有一次两个节点的/dev/asm-disk*设备名一致了但权限一个是oracle:dba另一个是grid:asmadmin安装时也报权限错误。后来又回头专门统一了udev规则才把问题彻底根治。所以这里再强调一遍ASM盘的属主、权限、设备名在各自节点上必须完全一致。这是GI安装和RAC运行最基础也最容易出错的条件没有之一。5.3 关于“异机安装”与“无图形化安装”的经验生产环境很多时候没有图形界面可用或者远程服务器网络延迟太高X11转发卡得让人崩溃。这时候第一个选项就是静默安装也就是用响应文件。把gridSetup.sh -silent -responseFile执行成功之后还需要在高阶配置里指定GIMRGrid Infrastructure Management Repository的磁盘组一般建议单独一个20GB的磁盘组存放。这部分在响应文件里对应oracle.install.crs.gimrDGName参数如果没配安装程序会去自动创建可能占用你预留的DATA空间。响应文件里另一个容易踩坑的地方是集群节点列表的写法——节点名和VIP必须和hosts文件里完全对应一个字母差都会导致集群验证失败。我建议每次用响应文件安装之前先跑一遍cluvfy stage -pre crsinst -n rac1,rac2把预检查结果看完再继续。CVU工具的好处就是能在你真正安装前把所有潜在问题暴露出来省去后面反复重启GI的麻烦。无图形化安装的另一个选择是开一个VNC会话但VNC需要额外安装桌面环境占用资源不说配置也比较繁琐。我个人的经验是会玩响应文件之后基本上不再需要图形界面了。对于重复部署响应文件复用的效率也更高——改改主机名、IP然后跑一遍就可以。5.4 RAC安装完成后匹配运维习惯的一些必要操作要说装完RAC就算完事其实还太早。装完之后还要做一些日常运维的习惯性配套动作才能让这套集群真正“好用、好管、好排查”。首先把oracle用户和grid用户的基础环境变量里加上umask 022确保日志和trace文件的权限不会因为默认umask不对导致其他节点无法读取。其次配置oracle用户的tnsnames.ora把orcl的负载均衡和故障转移都设置好让客户端能体验到真正的RAC优势。例如ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST rac-scan)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )同时启用SQLNET.ORA里的SQLNET.OUTBOUND_CONNECT_TIMEOUT10和SQLNET.INBOUND_CONNECT_TIMEOUT10防止连接卡死。接着打开归档模式生产环境必须执行srvctl stop database -d orcl sqlplus / as sysdba ALTER SYSTEM SET db_recovery_file_dest_size1T; ALTER SYSTEM SET db_recovery_file_destFRA; SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; srvctl start database -d orcl这里注意RAC环境不建议直接shutdown而是用srvctl stop database -d orcl来停掉整个数据库因为srvctl会同时处理两个实例和集群资源的状态比你一个一个实例去操作要安全得多。最后建议安装完成后把crsctl config scan、crsctl config vip和crsctl status resource -t的输出保存到部署文档中备份后续做变更或扩容时用得上。6. 后记关于19c RAC部署我最想跟你说的三句话第一句话不要试图跳过“环境准备”。所有RAC安装失败的案例几乎都是因为Linux基础配置、共享存储权限、网络规划这三个环节里有一个没做扎实。你把环境准备好了后面的Oracle安装反而像走流程一样顺畅。第二句话共享磁盘的“一致性”比磁盘本身的性能更致命。两个节点上的设备名、属主、权限、UUID必须一模一样否则ASM会认为磁盘组缺盘进而导致集群无法启动。我见过太多生产环境因为多路径设备名不统一而引发的灾难这句话怎么强调都不为过。第三句话认真理解每个脚本和每个资源的作用而不是盲目复制命令。比如root.sh执行时做了什么crsctl和srvctl到底是什么关系asmca和asmcmd有什么区别这些问题你花几天时间彻底搞明白后面运维RAC时会比别人轻松十倍。我在实际安装19c RAC的过程中最喜欢做的一件事就是把每步报错信息、crsctl stat res -t的输出、asmcmd lsdg的结果源源不断记录下来整理成一个故障排查笔记。下次再有人遇到“Voting Disk找不到”“OCR自动备份失败”“节点被驱逐”之类的问题直接翻笔记就能给出答案不用从头开始排除。最后再分享一个小技巧安装完成后立刻做一次重启测试——重启节点1确认集群、数据库、监听自动拉起再重启节点2确认两个实例都恢复ONLINE。这个测试虽然简单但能帮你提前暴露出很多“安装时没暴露、运行一阵子才暴露”的问题尤其是那些没有正确启用srvctl自动启动的资源。趁热打铁做一遍比等上线之后半夜接电话强得多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →