Oracle 19c RAC集群从零搭建实战:高可用架构与生产环境部署指南
2026/8/5 5:54:11 网站建设 项目流程

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(使用独立的交换机或VLAN)
  • SCAN域名:rac-scan.cluster.local(解析到192.168.1.201,192.168.1.202,192.168.1.203)
  • 节点1:Public IP192.168.1.101, VIP192.168.1.111, Private IP172.16.1.1
  • 节点2:Public IP192.168.1.102, VIP192.168.1.112, Private IP172.16.1.2

2.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=.*/SELINUX=disabled/' /etc/selinux/config
  • 安装依赖包:使用yum安装Oracle预安装包,它会自动解决大部分依赖。
    yum install -y oracle-database-preinstall-19c
    这个包会自动创建oracle用户和dba,oper,asmadmin等组,并设置内核参数、资源限制。

2. 共享存储配置(以ASM为例):假设服务器通过光纤交换机连接了共享磁盘阵列。我们需要在两台服务器上识别并配置这些磁盘。

  • 使用multipath -lllsblk查看所有磁盘,识别出共享磁盘(通常尺寸相同,且在两台机器上看到的设备名如/dev/sdb,/dev/sdc可能不同,但WWID相同)。
  • 使用udev规则或ASMLib为磁盘配置持久化命名。这里使用udev规则更通用。例如,为三块共享磁盘(WWID已知)创建规则文件/etc/udev/rules.d/99-oracle-asmdevices.rules
    KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_WWN}=="<WWID1>", SYMLINK+="oracleasm/ocrvote1", OWNER="oracle", GROUP="asmadmin", MODE="0660" KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_WWN}=="<WWID2>", SYMLINK+="oracleasm/ocrvote2", OWNER="oracle", GROUP="asmadmin", MODE="0660" KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_WWN}=="<WWID3>", SYMLINK+="oracleasm/data1", OWNER="oracle", GROUP="asmadmin", MODE="0660"
    执行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软件

  1. 上传并解压安装包:从Oracle官网下载19c的Grid Infrastructure安装包(LINUX.X64_193000_grid_home.zip),上传到节点1的/u01/app/19.0.0/grid目录下,用oracle用户解压。
  2. 运行集群验证工具(CVU):在安装前,运行cluvfy工具进行全面的系统检查,包括节点连通性、用户等价性、网络、存储等。这是避免安装失败的关键步骤。
    cd /u01/app/19.0.0/grid ./runcluvfy.sh stage -pre crsinst -n rac01,rac02 -fixup -verbose
    根据报告修复所有FAILED的项目(如内核参数、资源限制、包缺失等)。
  3. 配置SSH互信:GI安装程序需要在节点间拷贝文件和执行命令。为oraclegrid用户配置节点间的SSH免密登录。
    # 在节点1上以oracle用户操作 ssh-keygen -t rsa ssh-copy-id oracle@rac01 ssh-copy-id oracle@rac02 # 同样为grid用户操作(如果grid用户已存在)
    使用ssh rac01 datessh rac02 date测试,确保不需要密码即可执行命令。
  4. 启动图形化安装:在节点1上,设置好DISPLAY变量,运行安装程序。
    export DISPLAY=你的本地IP:0.0 cd /u01/app/19.0.0/grid ./gridSetup.sh
  5. 图形界面安装步骤
    • 配置选项:选择“为集群配置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
    • 先决条件检查:安装程序会再次检查。如果仍有警告(如物理内存不足),评估后可以勾选“忽略所有”。
    • 概要:确认信息无误,点击“安装”。
  6. 执行根脚本:安装过程中,在两个节点上依次弹出提示,要求以root身份执行orainstRoot.shroot.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软件

  1. 上传并解压安装包:下载Oracle Database 19c安装包(LINUX.X64_193000_db_home.zip),上传到节点1的/u01/app/oracle/product/19.0.0/dbhome_1目录下解压。
  2. 运行安装程序:以oracle用户身份运行安装程序。这次安装的是“数据库软件”,不是“创建数据库”。
    cd /u01/app/oracle/product/19.0.0/dbhome_1 ./runInstaller
  3. 图形界面安装步骤
    • 配置选项:选择“仅安装数据库软件”。
    • 数据库安装类型:选择“Oracle Real Application Clusters数据库安装”。
    • 节点选择:自动会勾选集群中的所有节点(rac01, rac02)。
    • 产品语言:按需选择。
    • 数据库版本:选择“企业版”。
    • 安装位置ORACLE_BASE=/u01/app/oracle,ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
    • 特权操作系统组:保持默认(dba,oper)。
    • 先决条件检查:处理任何警告。
    • 概要:确认后点击“安装”。
  4. 执行根脚本:同样,在安装结束时需要在所有节点上以root身份执行root.sh脚本。

4.2 使用DBCA创建RAC数据库

数据库软件安装好后,使用Database Configuration Assistant (DBCA) 图形化工具创建数据库。

  1. 启动DBCA:在节点1上以oracle用户运行dbca
  2. 创建步骤
    • 操作:选择“创建数据库”。
    • 创建模式:选择“高级配置”。
    • 数据库类型:选择“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等管理用户设置口令。
    • 创建选项:选择“创建数据库”。建议也勾选“生成数据库创建脚本”,便于日后排查问题或复用。
  3. 等待创建完成:DBCA会开始创建数据库,这个过程会初始化数据文件、创建数据字典、启动实例等,耗时较长。可以在$ORACLE_HOME/cfgtoollogs/dbca/下查看详细日志。
  4. 验证数据库:创建完成后,进行验证。
    # 查看数据库状态 srvctl status database -d racdb # 查看实例状态 srvctl status instance -d racdb -i racdb1 srvctl status instance -d racdb -i racdb2 # 连接到任一实例 sqlplus sys@racdb1 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 核心管理命令

掌握以下srvctlcrsctl命令是管理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 "SPFILE=+DATA/racdb/spfileracdb.ora"
  • 监听器管理
    srvctl status listener srvctl start listener -l LISTENER_SCAN1 srvctl config listener
  • SCAN管理
    srvctl status scan srvctl config scan
  • 集群服务管理
    # 查看所有资源状态(最常用) crsctl stat res -t # 启动/停止集群栈(谨慎操作!) crsctl stop crs crsctl start crs # 查看集群日志 tail -f $GRID_HOME/log/`hostname`/alert`hostname`.log

5.2 连接测试与负载均衡

数据库创建后,测试客户端连接至关重要。

  1. 配置本地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) ) )
  2. 测试连接
    sqlplus system/你的密码@RACDB_SCAN
    多次执行此命令,通过查询v$instance可以看到连接可能会被分配到不同的实例上,这就是SCAN的负载均衡效果。
  3. 测试故障转移:手动停止节点1上的数据库实例(srvctl stop instance -d racdb -i racdb1),然后再次用RACDB_SCAN连接,连接应该会自动转移到节点2的实例上,对应用透明。

5.3 常见问题与排查技巧实录

即使步骤再详细,在实际搭建中还是会遇到各种问题。这里记录几个我们踩过的坑和解决方法。

问题1:GI安装时,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工具)后重新安装。清理前务必做好备份。

问题2:DBCA创建数据库时,进度卡在“创建和启动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),确保nofilenproc足够大。

问题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集群?

  • 标准关闭顺序
    1. 关闭数据库:srvctl stop database -d racdb -o immediate
    2. 关闭ASM实例(实际上,当数据库关闭后,ASM实例通常还会运行以服务其他组件。如果要关闭整个GI):
    3. 停止集群栈:在一个节点上,以root用户执行crsctl stop crs。然后到另一个节点执行同样的命令。或者使用crsctl stop cluster -all(如果配置了集群服务)。
  • 标准启动顺序
    1. 启动集群栈:在第一个节点以root执行crsctl start crs。等待其完全启动(crsctl stat res -t显示所有资源ONLINE)后,再启动第二个节点的crs。
    2. 检查ASM实例:srvctl status asm
    3. 启动数据库:srvctl start database -d racdb

重要提醒:切忌直接使用shutdown abort关闭数据库实例,或在集群服务运行异常时强行重启服务器。这可能导致集群脑裂或数据损坏。始终使用srvctlcrsctl命令进行启停管理。

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 timegc current block receive time。如果平均等待时间(avg_wait_ms)持续较高(例如>10ms),就需要调查私有网络性能。

2. 实例负载均衡情况:查看连接和请求在各个实例上的分布是否均衡。

-- 查看各实例的当前会话数 SELECT inst_id, count(*) as sessions FROM gv$session WHERE type='USER' 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_timewrite_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。

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

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

立即咨询