1. 项目概述与核心价值最近在整理团队的基础设施文档发现不少项目还在用着单实例的Oracle数据库一旦主机出点问题业务就得停摆DBA半夜被叫起来救火是常事。为了提升核心系统的可用性和性能我们决定将几个关键业务库迁移到Oracle RAC 19c环境。RAC也就是Real Application Clusters是Oracle实现高可用和横向扩展的“王牌”技术它允许一个数据库运行在多台服务器上实现故障自动转移和负载均衡。19c作为长期支持版本稳定性和新特性都很有保障。这个搭建过程说复杂也复杂涉及操作系统、存储、网络、软件安装配置等多个层面说简单也简单只要思路清晰、步骤严谨按部就班就能搞定。今天我就把这次从零开始搭建一套两节点Oracle 19c RAC的完整过程、踩过的坑以及核心注意事项梳理出来目标就是让你看这一篇就能自己动手搭出一套生产可用的环境。无论是为了应对等保测评中对高可用的要求还是为未来的系统扩容做准备掌握RAC搭建都是一项硬核技能。2. 环境规划与前期准备搭建RAC不是简单的软件安装它是一套系统工程。前期规划做得好后期运维没烦恼。盲目开干大概率会在各种诡异报错中反复折腾。2.1 硬件与存储架构设计我们的目标是搭建一个两节点的RAC集群。硬件上需要两台配置完全相同的服务器Node1和Node2以及一套共享存储。存储是RAC的“心脏”所有节点的数据库实例都要能同时读写同一份数据文件。1. 共享存储方案选型ASM自动存储管理这是Oracle官方强烈推荐也是我们最终采用的方案。ASM是一个专为Oracle数据库设计的卷管理器和文件系统它屏蔽了底层物理磁盘的复杂性提供条带化、镜像等能力性能和管理性都极佳。我们需要为ASM准备独立的磁盘组例如OCR_VOTE磁盘组用于存放集群注册表OCR和表决盘Voting Disk。这是集群的“大脑”必须高可用建议使用外部冗余至少3块盘或高冗余。DATA磁盘组用于存放数据库数据文件、控制文件、重做日志等。根据性能和数据重要性选择冗余方式。共享文件系统如NFS、OCFS2也可以使用但在性能、管理集成度上通常不如ASM。对于入门实验或特定约束环境可以考虑。2. 网络规划RAC对网络要求苛刻至少需要3张网卡或3个IP地址段Public IP对外提供服务的IP业务应用通过这个IP连接数据库。Private IP用于节点间私有通信如缓存融合Cache Fusion数据块传递、心跳检测。此网络必须低延迟、高带宽、且与其他网络隔离通常使用万兆交换机直连。Virtual IP (VIP)由Oracle Clusterware管理的高可用IP。当某个节点故障时其VIP会漂移到存活节点使客户端连接能快速重定向实现透明故障转移。SCAN IP单客户端访问名称。这是一个域名解析到3个IP地址推荐客户端通过SCAN连接集群由集群负载均衡到最合适的节点。这简化了客户端的连接配置。在我们的规划中公共网络192.168.1.0/24私有网络172.16.1.0/24使用独立的交换机或VLANSCAN域名rac-scan.cluster.local(解析到192.168.1.201,192.168.1.202,192.168.1.203)节点1Public IP192.168.1.101, VIP192.168.1.111, Private IP172.16.1.1节点2Public IP192.168.1.102, VIP192.168.1.112, Private IP172.16.1.22.2 操作系统与软件准备我们选择Oracle Linux 7.9作为操作系统它与Oracle数据库的兼容性最好。以下是关键准备工作1. 操作系统安装与基础配置在两台服务器上安装最小化安装的Oracle Linux 7.9。安装完成后进行如下配置主机名与Hosts文件设置永久主机名如rac01,rac02并编辑/etc/hosts文件将前面规划的所有IP和主机名对应关系写进去。注意私有IP的解析必须放在/etc/hosts里且确保所有节点完全一致。公共IP和VIP可以依赖DNS但初期测试也建议写入hosts。# /etc/hosts 在两台节点上保持一致 192.168.1.101 rac01 192.168.1.111 rac01-vip 192.168.1.102 rac02 192.168.1.112 rac02-vip 172.16.1.1 rac01-priv 172.16.1.2 rac02-priv 192.168.1.201 rac-scan.cluster.local 192.168.1.202 rac-scan.cluster.local 192.168.1.203 rac-scan.cluster.local关闭防火墙与SELinux在实验或受保护的内网环境中为避免网络通信问题通常先关闭。生产环境需按安全策略开放特定端口。systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config安装依赖包使用yum安装Oracle预安装包它会自动解决大部分依赖。yum install -y oracle-database-preinstall-19c这个包会自动创建oracle用户和dba,oper,asmadmin等组并设置内核参数、资源限制。2. 共享存储配置以ASM为例假设服务器通过光纤交换机连接了共享磁盘阵列。我们需要在两台服务器上识别并配置这些磁盘。使用multipath -ll或lsblk查看所有磁盘识别出共享磁盘通常尺寸相同且在两台机器上看到的设备名如/dev/sdb,/dev/sdc可能不同但WWID相同。使用udev规则或ASMLib为磁盘配置持久化命名。这里使用udev规则更通用。例如为三块共享磁盘WWID已知创建规则文件/etc/udev/rules.d/99-oracle-asmdevices.rulesKERNELsd*, ENV{DEVTYPE}disk, ENV{ID_WWN}WWID1, SYMLINKoracleasm/ocrvote1, OWNERoracle, GROUPasmadmin, MODE0660 KERNELsd*, ENV{DEVTYPE}disk, ENV{ID_WWN}WWID2, SYMLINKoracleasm/ocrvote2, OWNERoracle, GROUPasmadmin, MODE0660 KERNELsd*, ENV{DEVTYPE}disk, ENV{ID_WWN}WWID3, SYMLINKoracleasm/data1, OWNERoracle, GROUPasmadmin, MODE0660执行udevadm trigger重新加载规则。之后会在/dev/oracleasm/下看到符号链接。注意共享磁盘的权限和所有者至关重要。必须确保oracle用户和asmadmin组可以读写。在多路径环境下要针对多路径虚拟设备如/dev/mapper/mpatha配置规则而不是底层物理设备。3. 用户环境与目录准备以root用户创建必要的目录并设置权限。mkdir -p /u01/app/{19.0.0/grid, oracle/product/19.0.0/dbhome_1} chown -R oracle:oinstall /u01 chmod -R 775 /u01设置oracle用户的环境变量编辑~oracle/.bash_profile包括ORACLE_BASE,ORACLE_HOME(数据库软件),GRID_HOME(网格基础设施软件)以及PATH。3. Grid Infrastructure 安装与配置Grid Infrastructure (GI) 是RAC的基石它包含了集群管理软件Clusterware和ASM。必须先安装GI再安装数据库软件。3.1 安装Grid Infrastructure软件上传并解压安装包从Oracle官网下载19c的Grid Infrastructure安装包LINUX.X64_193000_grid_home.zip上传到节点1的/u01/app/19.0.0/grid目录下用oracle用户解压。运行集群验证工具CVU在安装前运行cluvfy工具进行全面的系统检查包括节点连通性、用户等价性、网络、存储等。这是避免安装失败的关键步骤。cd /u01/app/19.0.0/grid ./runcluvfy.sh stage -pre crsinst -n rac01,rac02 -fixup -verbose根据报告修复所有FAILED的项目如内核参数、资源限制、包缺失等。配置SSH互信GI安装程序需要在节点间拷贝文件和执行命令。为oracle和grid用户配置节点间的SSH免密登录。# 在节点1上以oracle用户操作 ssh-keygen -t rsa ssh-copy-id oraclerac01 ssh-copy-id oraclerac02 # 同样为grid用户操作如果grid用户已存在使用ssh rac01 date和ssh rac02 date测试确保不需要密码即可执行命令。启动图形化安装在节点1上设置好DISPLAY变量运行安装程序。export DISPLAY你的本地IP:0.0 cd /u01/app/19.0.0/grid ./gridSetup.sh图形界面安装步骤配置选项选择“为集群配置Oracle Grid Infrastructure”。安装类型选择“配置标准集群”。产品语言按需选择。集群类型选择“Oracle集群”。节点列表添加节点2的主机名。网络接口这里是关键为“专用”网络选择eth1对应私有IP网卡为“公用”网络选择eth0。务必不要选反。存储选项选择“使用ASM的集群文件系统”。创建ASM磁盘组磁盘组名称OCR_VOTE冗余选择“外部”如果只有三块盘生产环境建议“正常”冗余需要更多磁盘。候选磁盘勾选之前通过udev规则配置好的/dev/oracleasm/ocrvote1和/dev/oracleasm/ocrvote2等磁盘。ASM密码为ASMSNMP用户设置密码。管理选项按需配置EM。特权操作系统组保持默认asmadmin,asmdba,asmoper。安装位置ORACLE_BASE/u01/app/grid,GRID_HOME/u01/app/19.0.0/grid。先决条件检查安装程序会再次检查。如果仍有警告如物理内存不足评估后可以勾选“忽略所有”。概要确认信息无误点击“安装”。执行根脚本安装过程中在两个节点上依次弹出提示要求以root身份执行orainstRoot.sh和root.sh脚本。必须严格按照提示的顺序执行先节点1等节点1的root.sh执行完毕后再去节点2执行。root.sh脚本会配置集群服务耗时较长期间会有大量输出需耐心等待直至出现“Successfully ...”字样。实操心得执行root.sh是最容易出错的环节。务必在一个节点的root.sh完全成功后再执行另一个节点。如果失败仔细查看日志$GRID_HOME/cfgtoollogs/crsconfig/目录下。常见的失败原因包括主机名解析错误、共享磁盘权限问题、网络心跳超时等。保持终端窗口打开不要中断脚本。3.2 验证Grid Infrastructure安装安装完成后使用以下命令验证集群状态# 以grid用户执行 crsctl stat res -t这个命令会列出所有集群资源的状态你应该看到ora.asm,ora.cssd,ora.diskmon等资源都是ONLINE状态。# 检查集群节点成员 olsnodes -n # 检查SCAN监听器 srvctl status scan_listener # 检查ASM实例状态 srvctl status asm -n rac01 srvctl status asm -n rac02如果所有服务状态正常说明GI安装成功。4. Oracle Database软件安装与数据库创建GI搭建好后就可以安装数据库软件并创建RAC数据库了。4.1 安装Oracle Database软件上传并解压安装包下载Oracle Database 19c安装包LINUX.X64_193000_db_home.zip上传到节点1的/u01/app/oracle/product/19.0.0/dbhome_1目录下解压。运行安装程序以oracle用户身份运行安装程序。这次安装的是“数据库软件”不是“创建数据库”。cd /u01/app/oracle/product/19.0.0/dbhome_1 ./runInstaller图形界面安装步骤配置选项选择“仅安装数据库软件”。数据库安装类型选择“Oracle Real Application Clusters数据库安装”。节点选择自动会勾选集群中的所有节点rac01, rac02。产品语言按需选择。数据库版本选择“企业版”。安装位置ORACLE_BASE/u01/app/oracle,ORACLE_HOME/u01/app/oracle/product/19.0.0/dbhome_1。特权操作系统组保持默认dba,oper。先决条件检查处理任何警告。概要确认后点击“安装”。执行根脚本同样在安装结束时需要在所有节点上以root身份执行root.sh脚本。4.2 使用DBCA创建RAC数据库数据库软件安装好后使用Database Configuration Assistant (DBCA) 图形化工具创建数据库。启动DBCA在节点1上以oracle用户运行dbca。创建步骤操作选择“创建数据库”。创建模式选择“高级配置”。数据库类型选择“Oracle Real Application Clusters数据库”。节点选择勾选所有要加入集群的节点。配置类型选择“管理员管理的”。数据库标识输入全局数据库名如racdb.cluster.local和SID前缀如racdb。注意全局数据库名通常包含域名。存储选项选择“自动存储管理(ASM)”。点击“浏览”会连接到ASM实例然后“创建”一个新的磁盘组例如命名为DATA选择冗余级别并勾选准备好的数据磁盘如/dev/oracleasm/data1。快速恢复区同样选择ASM可以指定一个大小用于存放归档日志和备份。数据库选项按需选择组件如Oracle Label Security, Oracle Text等。配置选项字符集根据应用需求选择常用AL32UTF8。连接模式选择“专用服务器模式”。内存启用自动内存管理AMM设置总内存大小。样本方案如果需要可以勾选“创建具有样本方案的数据库”。管理选项配置数据库管理如EM Express。用户口令为SYS,SYSTEM等管理用户设置口令。创建选项选择“创建数据库”。建议也勾选“生成数据库创建脚本”便于日后排查问题或复用。等待创建完成DBCA会开始创建数据库这个过程会初始化数据文件、创建数据字典、启动实例等耗时较长。可以在$ORACLE_HOME/cfgtoollogs/dbca/下查看详细日志。验证数据库创建完成后进行验证。# 查看数据库状态 srvctl status database -d racdb # 查看实例状态 srvctl status instance -d racdb -i racdb1 srvctl status instance -d racdb -i racdb2 # 连接到任一实例 sqlplus sysracdb1 as sysdba SQL select instance_name, status from v$instance; SQL select name, open_mode from v$database;注意事项在DBCA创建过程中如果遇到“ORA-12547: TNS:lost contact”或类似错误通常是因为环境变量特别是ORACLE_HOME,PATH,LD_LIBRARY_PATH设置不正确或者oracle用户的$ORACLE_HOME/bin/oracle二进制文件权限有问题。确保在所有节点上oracle用户的环境变量设置一致且正确并且oracle二进制文件对oracle用户可执行。5. 集群管理与日常运维要点RAC搭建成功只是第一步日常的管理和故障排查能力更重要。5.1 核心管理命令掌握以下srvctl和crsctl命令是管理RAC的基础数据库与实例管理# 启动/停止/查看数据库 srvctl start database -d racdb srvctl stop database -d racdb -o immediate srvctl status database -d racdb # 启动/停止/查看特定实例 srvctl start instance -d racdb -i racdb1 srvctl status instance -d racdb -i racdb1 # 修改数据库配置如启动策略 srvctl modify database -d racdb -p SPFILEDATA/racdb/spfileracdb.ora监听器管理srvctl status listener srvctl start listener -l LISTENER_SCAN1 srvctl config listenerSCAN管理srvctl status scan srvctl config scan集群服务管理# 查看所有资源状态最常用 crsctl stat res -t # 启动/停止集群栈谨慎操作 crsctl stop crs crsctl start crs # 查看集群日志 tail -f $GRID_HOME/log/hostname/alerthostname.log5.2 连接测试与负载均衡数据库创建后测试客户端连接至关重要。配置本地Net服务名在客户端或数据库服务器本身的$ORACLE_HOME/network/admin/tnsnames.ora文件中配置连接描述符。# 连接到SCAN实现负载均衡和故障转移 RACDB_SCAN (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST rac-scan.cluster.local)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME racdb.cluster.local) # 使用数据库服务名 ) ) # 连接到特定实例 RACDB1 (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.101)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME racdb.cluster.local) (INSTANCE_NAME racdb1) ) )测试连接sqlplus system/你的密码RACDB_SCAN多次执行此命令通过查询v$instance可以看到连接可能会被分配到不同的实例上这就是SCAN的负载均衡效果。测试故障转移手动停止节点1上的数据库实例srvctl stop instance -d racdb -i racdb1然后再次用RACDB_SCAN连接连接应该会自动转移到节点2的实例上对应用透明。5.3 常见问题与排查技巧实录即使步骤再详细在实际搭建中还是会遇到各种问题。这里记录几个我们踩过的坑和解决方法。问题1GI安装时root.sh在第二个节点执行失败报错“CRS-2674: Start of ‘ora.cssd’ on ‘rac02’ failed”或“PRVF-4657 : 节点间的时钟同步不符合要求”。排查思路首先检查两个节点的系统时间是否同步。RAC要求节点间时间差不能超过一定范围通常1秒内。使用date命令对比。其次检查私有网络心跳是否通畅。使用ping命令测试私有IP并检查/etc/hosts中私有IP的配置是否正确无误。最后检查grid用户的环境变量$GRID_HOME是否设置正确。解决方案时钟同步配置NTP或Chrony服务确保所有节点与同一时间源同步。# 安装chrony yum install -y chrony systemctl start chronyd systemctl enable chronyd chronyc sources -v网络检查使用oifcfg查看集群网络配置是否正确。$GRID_HOME/bin/oifcfg getif清理重装如果问题复杂可能需要清理环境使用deinstall工具后重新安装。清理前务必做好备份。问题2DBCA创建数据库时进度卡在“创建和启动Oracle实例”阶段日志报“ORA-01034: ORACLE not available”或“ORA-27125: unable to create shared memory segment”。排查思路这通常是操作系统参数设置不当特别是共享内存SHMMAX, SHMALL和信号量SEMMSL, SEMMNS参数。虽然预安装包设置了这些参数但可能因为系统内存调整或配置未生效导致。解决方案检查当前内核参数sysctl -a | grep -E shm|sem。与Oracle推荐值对比参考$GRID_HOME/install/下的.rsp文件或官方文档。编辑/etc/sysctl.conf确保参数足够大例如kernel.shmall 4294967296 kernel.shmmax 68719476736 kernel.shmmni 4096 kernel.sem 250 32000 100 128 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 1048576执行sysctl -p使配置生效。检查oracle用户的资源限制/etc/security/limits.conf确保nofile和nproc足够大。问题3数据库创建成功后应用通过SCAN连接时断时续或报“ORA-12545: Connect failed because target host or object does not exist”。排查思路这通常是网络或名称解析问题。SCAN域名解析不正确或者监听器未在所有SCAN IP上正确注册。解决方案在客户端和服务器端都使用nslookup rac-scan.cluster.local检查SCAN域名是否解析到3个IP。检查SCAN监听器状态srvctl status scan_listener。检查各节点的本地监听器状态srvctl status listener。检查监听器是否注册了数据库服务在任意节点执行lsnrctl status查看“Services Summary”部分是否有你的数据库服务名如racdb.cluster.local。如果使用/etc/hosts文件解析确保所有相关节点和客户端的hosts文件内容一致且正确。问题4如何安全地关闭和启动整个RAC集群标准关闭顺序关闭数据库srvctl stop database -d racdb -o immediate关闭ASM实例实际上当数据库关闭后ASM实例通常还会运行以服务其他组件。如果要关闭整个GI停止集群栈在一个节点上以root用户执行crsctl stop crs。然后到另一个节点执行同样的命令。或者使用crsctl stop cluster -all如果配置了集群服务。标准启动顺序启动集群栈在第一个节点以root执行crsctl start crs。等待其完全启动crsctl stat res -t显示所有资源ONLINE后再启动第二个节点的crs。检查ASM实例srvctl status asm启动数据库srvctl start database -d racdb重要提醒切忌直接使用shutdown abort关闭数据库实例或在集群服务运行异常时强行重启服务器。这可能导致集群脑裂或数据损坏。始终使用srvctl和crsctl命令进行启停管理。6. 性能监控与优化初探RAC环境搭建完毕并稳定运行后关注点就要转向性能和稳定性监控。这里分享几个入门级的监控命令和优化思路帮你快速了解集群的运行状况。1. 缓存融合Cache Fusion监控缓存融合是RAC的核心技术节点间通过私有网络传输数据块。如果私有网络延迟高或带宽不足会严重影响性能。-- 查看全局缓存等待事件 SELECT event, total_waits, time_waited_micro/1000000 as time_waited_secs, average_wait_micro/1000 as avg_wait_ms FROM gv$system_event WHERE event LIKE gc% AND wait_class Idle ORDER BY time_waited_micro DESC;重点关注gc cr block receive time和gc current block receive time。如果平均等待时间avg_wait_ms持续较高例如10ms就需要调查私有网络性能。2. 实例负载均衡情况查看连接和请求在各个实例上的分布是否均衡。-- 查看各实例的当前会话数 SELECT inst_id, count(*) as sessions FROM gv$session WHERE typeUSER GROUP BY inst_id; -- 查看各实例的全局缓存块获取次数 SELECT inst_id, sum(gc blocks received) as blocks_received FROM gv$sysstat WHERE name LIKE %gc%received% GROUP BY inst_id;如果分布严重不均可能需要调整服务的负载均衡策略通过srvctl modify service设置-r和-a参数或者检查应用连接字符串的配置。3. ASM磁盘组性能与空间ASM的性能直接关系到数据库IO。-- 连接到ASM实例以grid用户 sqlplus / as sysasm -- 查看磁盘组空间使用情况 SELECT name, total_mb, free_mb, (free_mb/total_mb)*100 as pct_free FROM v$asm_diskgroup; -- 查看磁盘IO情况 SELECT group_number, disk_number, reads, writes, read_time, write_time FROM v$asm_disk_stat;确保DATA等关键磁盘组的剩余空间充足例如20%并关注read_time和write_time是否在正常范围内。4. 集群心跳与网络定期检查集群的心跳网络是否健康。# 查看集群网络心跳的统计信息在grid用户下 crsctl stat res -t -init # 查看具体的网络心跳统计需要更高级的诊断通常由Oracle支持协助 $GRID_HOME/bin/ocrcheck -local $GRID_HOME/bin/cluvfy comp healthcheck日常运维中可以编写简单的Shell脚本定期收集上述关键指标并设置阈值告警。例如当ASM磁盘组空间低于10%或全局缓存平均等待时间超过20ms时发送邮件或短信通知DBA。