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 IP
192.168.1.101, VIP192.168.1.111, Private IP172.16.1.1 - 节点2:Public IP
192.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-19coracle用户和dba,oper,asmadmin等组,并设置内核参数、资源限制。
2. 共享存储配置(以ASM为例):假设服务器通过光纤交换机连接了共享磁盘阵列。我们需要在两台服务器上识别并配置这些磁盘。
- 使用
multipath -ll或lsblk查看所有磁盘,识别出共享磁盘(通常尺寸相同,且在两台机器上看到的设备名如/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软件
- 上传并解压安装包:从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 -verboseFAILED的项目(如内核参数、资源限制、包缺失等)。 - 配置SSH互信:GI安装程序需要在节点间拷贝文件和执行命令。为
oracle和grid用户配置节点间的SSH免密登录。
使用# 在节点1上以oracle用户操作 ssh-keygen -t rsa ssh-copy-id oracle@rac01 ssh-copy-id oracle@rac02 # 同样为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 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 核心管理命令
掌握以下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 "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 连接测试与负载均衡
数据库创建后,测试客户端连接至关重要。
- 配置本地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_SCANv$instance可以看到连接可能会被分配到不同的实例上,这就是SCAN的负载均衡效果。 - 测试故障转移:手动停止节点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),确保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
- 启动集群栈:在第一个节点以root执行
重要提醒:切忌直接使用
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 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_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。