简介:这份PDF文档面向数据库管理员、系统运维人员及华为云用户,针对去IOE趋势下企业将Oracle RAC迁移上云时遇到的集群报错与网络配置难题,提供华为云ECS上部署Oracle RAC 11.2.0.4的完整安装指导。内容涵盖ECS双网卡与VPC网络规划、心跳网络与公网网卡设置、操作系统前期检查(RPM包、Swap分区、用户组目录创建)、ASM共享存储与图形界面配置、Grid Infrastructure安装、数据库软件部署、DBCA建库及集群验证与性能调优等关键环节,并说明华为云如何基于ECS+VPC+共享EVS支持Oracle RAC架构。资源包为1个PDF文件,大小约2.25MB,结构清晰、步骤详尽,便于按章节查阅。目前已有1136人学习,适合需要快速在云环境搭建高可用Oracle集群的运维与DBA人员参考。
1. 华为云 ECS 上跑 Oracle RAC 11.2.0.4:为什么有人一次装通,有人卡在 CRS
去年帮一个做 ERP 的团队在华为云上搭 Oracle RAC 11.2.0.4,两台 ECS 加共享 EVS,硬件资源全按官方推荐配的,结果 Grid 装到 78% 直接卡死,crsctl stat res -t查出来 Voting Disk 一块都认不到。排查了整整一个下午,最后发现是第二块网卡没绑私网 IP,心跳网络根本没通。这个场景在云上部署 RAC 时太常见了——本地机房那套经验搬到云上,网络模型和存储模型全变了,踩坑几乎是必然的。
这份《华为云 ECS ORACLE RAC 11.2.0.4 的安装指导》就是针对这个场景写的。它不讲 Oracle RAC 的原理,而是把华为云 ECS + VPC + 共享 EVS 这套 IAAS 组合下,从买机器、配网卡、绑 VIP、装 Grid 到建库的完整链路拆成了可执行的步骤。适合两类人:一是手上已经有华为云账号、准备把 Oracle RAC 迁上来的 DBA;二是运维团队里需要快速复现一套测试环境、验证应用兼容性的工程师。文档基于 CentOS 6.x 环境编写,11.2.0.4 这个版本本身在云上就有不少玄学问题,后面会逐个拆。
2. 部署方案拆解:双网卡、共享 EVS 和 ASM 磁盘组怎么规划
2.1 为什么必须是双网卡 + 两个 Subnet
Oracle RAC 对网络的要求和单实例完全不是一个量级。集群内部需要心跳通信来维持节点状态,这个流量不能和客户端访问混在一起,否则一个大批量查询就能把心跳包延迟拉高,触发节点驱逐。华为云 ECS 默认只给一块网卡,必须手动加第二块。
文档里的做法是:第一块网卡(eth0)作为 public 网卡,承载 Public IP、Virtual IP 和 Scan IP;第二块网卡(eth1)作为 private 网卡,只跑 Private IP,专门用于 RAC 内部元数据通信和集群检测。两块网卡分属同一个 VPC 的不同 Subnet,这样二层网络隔离,心跳流量不会串到业务网段。
具体操作路径是:控制台 → 弹性云服务器 ECS → 点击 ECS 名称 → 网卡 → 添加网卡。选安全组和子网时注意,私网子网必须和 public 子网不在同一网段。私有 IP 可以手动指定,也可以让系统分配,但建议手动指定,方便后面写/etc/hosts。
注意:VIP 必须提前绑定到两台 ECS 的 public 网卡上,Private IP 绑定到第二块网卡。绑定顺序错了,后面 Grid 安装时 VIP 校验会直接报
PRVF-10037。
2.2 存储规划:CRS、DATA、ARCH 三个磁盘组怎么分
文档给的存储规划很清晰,直接抄:
| 磁盘组 | EVS 大小 | EVS 个数 | EVS 类型 | 冗余度 | 分配单元 | 用途 |
|---|---|---|---|---|---|---|
| CRS | 3G | 3 | 超高 | 外部 | 1M | OCR 和 Voting Disk |
| DATA | 20G | 1 | 超高 | 外部 | 1M | 控制文件、在线日志、数据文件、SPFILE |
| ARCH | 15G | 1 | 高速 | 外部 | 1M | 归档日志、快速恢复区 |
这里有几个点值得展开。CRS 磁盘组用 3 块 3G 的 EVS 做外部冗余,是因为 Voting Disk 需要奇数个才能保证仲裁,3 块是最小可用配置。DATA 和 ARCH 各用 1 块盘,冗余度选外部,意味着依赖 EVS 自身的可靠性,不额外做 ASM 镜像。这种配置在测试环境够用,生产环境建议 DATA 至少两块盘做 normal 冗余。
EVS 类型选超高(Ultra-high)还是高速(High),主要看 IOPS 需求。CRS 盘虽然小,但 OCR 读写频繁,用超高 IO 能减少集群心跳超时的概率。ARCH 盘写归档日志是顺序写,高速 IO 足够。
2.3 网络绑定和/etc/hosts的对应关系
文档里给了一张网络规划表,我把它整理成更直观的对应关系:
| 主机名 | eth0 (Public) | eth1 (Private) | VIP | Scan IP |
|---|---|---|---|---|
| racdb1 | 172.16.0.112 | 172.16.1.106 | 172.16.0.114 | 172.16.0.120 |
| racdb2 | 172.16.0.113 | 172.16.1.107 | 172.16.0.115 | 172.16.0.120 |
Scan IP 只有一个,两个节点共用,这是 11.2 之后的标准做法。VIP 每个节点一个,故障时漂移到另一个节点。Private IP 只在集群内部使用,不对外暴露。
写/etc/hosts的时候,文档里的脚本是直接追加,但有个细节:它把127.0.0.1映射到了db2-chengxinga,这个主机名和 RAC 节点名不一致。如果后面 Grid 安装时主机名校验不过,需要把这一行改成实际的主机名,或者直接删掉。我一般会先hostname确认当前主机名,再决定/etc/hosts里怎么写。
3. 操作系统前期配置:从 RPM 包到内核参数的完整脚本
3.1 RPM 包安装和 Swap 分区设置
CentOS 7 以上自带 yum 源,直接yum install就行。CentOS 6.x 需要先换 Vault 源,文档里给了命令:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo-backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://file.kangle.odata.cc/repo/Centos-6.repo wget -O /etc/yum.repos.d/epel.repo http://file.kangle.odata.cc/repo/epel-6.repo yum clean all yum makecache换完源之后,用rpm -q批量检查依赖包。文档列了一长串包名,包括binutils、compat-libstdc++-33、pdksh、gcc、glibc、libaio、sysstat、compat-libcap1等。这里有个坑:pdksh在 CentOS 6 的默认源里可能没有,需要从 EPEL 或者第三方源找。如果rpm -q报package pdksh is not installed,先别急着跳过,Grid 安装时会对这个包做校验,缺了会报PRVF-7532。
Swap 分区这块,文档说 ECS 装完默认 swap 是 0,需要手动创建。命令是:
dd if=/dev/zero of=/u01/swap1 bs=1M count=4096 mkswap /u01/swap1 swapon /u01/swap1dd的bs=1M count=4096表示创建一个 4G 的文件。mkswap把它格式化成 swap 类型,swapon立即启用。最后写/etc/fstab实现开机自动挂载:
/u01/swap1 swap swap defaults 0 0注意文档里写的是defaluts,这是个拼写错误,正确写法是defaults。写错了开机时 swap 不会自动挂载,free -m查出来还是 0。
3.2 用户组、目录和内核参数的一键脚本
文档给了一个完整的 bash 脚本,从创建用户组到修改内核参数全包了。我把它拆成几个关键步骤说明。
创建用户组和用户:
groupadd -g 210 oinstall groupadd -g 230 dba groupadd -g 231 oper groupadd -g 301 grid groupadd -g 302 oracle groupadd -g 220 asmadmin groupadd -g 221 asmdba groupadd -g 222 asmoper useradd -u 302 -g oinstall -G oinstall,dba,oper,asmdba oracle useradd -u 301 -g oinstall -G oinstall,dba,oper,asmadmin,asmdba,asmoper gridoinstall是 Oracle 清单目录的属组,dba是数据库管理组,asmadmin、asmdba、asmoper是 ASM 相关的组。grid 用户需要同时属于 asmadmin、asmdba、asmoper,oracle 用户需要属于 asmdba。UID 和 GID 建议按文档里的固定值来,多节点保持一致,否则后面 SSH 互信和集群配置会出问题。
创建目录:
mkdir -p /u01/app/grid mkdir -p /u01/app/oracle mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1 mkdir -p /u01/app/grid/11.2.0/gridhome_1 mkdir /dbbak chown -R grid:oinstall /u01 chown oracle:oinstall /u01/app/oracle chown oracle:oinstall /dbbak chmod -R 775 /u01/app/oracle注意/u01整体给了 grid:oinstall,但/u01/app/oracle单独给了 oracle:oinstall。这是因为 Grid 安装时需要写/u01/app/grid和/u01/app/11.2.0/grid,而 Oracle 数据库软件装在/u01/app/oracle/product/11.2.0/dbhome_1。权限给错了,安装时会报INS-32025之类的目录不可写错误。
内核参数修改:
cat >>/etc/sysctl.conf<<EOF net.core.somaxconn=1024 net.ipv4.tcp_max_tw_buckets=5000 net.ipv4.tcp_max_syn_backlog=1024 fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmmni = 4096 kernel.sem = 256 32000 100 142 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 = 1048586 EOF sysctl -pkernel.sem的四个值分别是semmsl semmns semopm semmni,Oracle 对这几个参数有最低要求,给少了 Grid 安装时校验不过。fs.aio-max-nr设成 1048576 是为了支持 ASM 的异步 IO。net.ipv4.ip_local_port_range从 9000 开始,避开 Oracle 常用端口。
用户资源限制:
cat >> /etc/security/limits.conf <<EOF grid soft nproc 65536 grid hard nproc 65536 grid soft nofile 65536 grid hard nofile 65536 oracle soft nproc 65536 oracle hard nproc 65536 oracle soft nofile 65536 oracle hard nofile 65536 oracle soft memlock unlimited oracle hard memlock unlimited EOFmemlock unlimited这一条很关键,11.2.0.4 的 Grid 安装会检查这个,没设的话报PRVF-7530。nproc和nofile给 65536 是文档里的值,实际生产环境可以按需调大。
3.3 环境变量和 SSH 互信
grid 用户的.bash_profile:
export ORACLE_SID=+ASM1 export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/11.2.0/grid export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:$ORACLE_HOME/rdbms/lib export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/network/jlib:$ORACLE_HOME/rdbms/jlib export NLS_LANG=AMERICAN_AMERICA.zhs16gbk umask 022 export ORACLE_TERM=xterm注意ORACLE_SID是+ASM1,节点 2 要改成+ASM2。ORACLE_HOME指向/u01/app/11.2.0/grid,但文档前面创建的目录是/u01/app/grid/11.2.0/gridhome_1,这两个路径不一致。实际安装时,Grid 的 ORACLE_HOME 应该和安装时选的路径一致,建议统一成/u01/app/11.2.0/grid,或者把目录创建改成/u01/app/11.2.0/grid。
oracle 用户的.bash_profile:
export ORACLE_SID=rac1 export ORACLE_BASE=/u01/app/oracle export GRID_HOME=/u01/app/11.2.0/gridhome_1 export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH:$ORACLE_HOME/OPatch export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:/lib:/usr/lib export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib export NLS_LANG=AMERICAN_AMERICA.zhs16gbk umask 022ORACLE_SID在节点 2 要改成rac2。GRID_HOME和 grid 用户的ORACLE_HOME指向同一个路径,这里文档写的是/u01/app/11.2.0/gridhome_1,和 grid 用户的/u01/app/11.2.0/grid又不一致。建议统一成/u01/app/11.2.0/grid,避免后面crsctl找不到 Grid 的 ORACLE_HOME。
SSH 互信是 Grid 安装的前置条件。文档里没展开,但标准做法是:
su - grid ssh-keygen -t rsa ssh-copy-id rac1 ssh-copy-id rac2两个节点都要做,确保ssh rac1 date和ssh rac2 date都不需要密码。oracle 用户也要做一遍。这一步不做,Grid 安装到 SSH 校验时会直接卡住。
4. ASM 共享存储和 Grid 安装:从 udev 绑定到 CRS 启动
4.1 ASM 软件包安装和 udev 绑定
文档提到可以用 udev 或者 oracleasmlib 来管理 ASM 磁盘。oracleasmlib 的安装方式是:
rpm -ivh oracleasmlib-*.rpm rpm -ivh oracleasm-support-*.rpm rpm -ivh oracleasm-*.rpm service oracleasm configureservice oracleasm configure会交互式问几个问题:默认用户填grid,默认组填asmadmin,开机自启选y,扫描磁盘选y。配置完之后:
service oracleasm init service oracleasm createdisk CRS1 /dev/sdb1 service oracleasm createdisk CRS2 /dev/sdc1 service oracleasm createdisk CRS3 /dev/sdd1 service oracleasm createdisk DATA1 /dev/sde1 service oracleasm createdisk ARCH1 /dev/sdf1createdisk的盘符需要根据实际 EVS 挂载情况来。华为云 EVS 挂载到 ECS 后,lsblk能看到对应的设备名。如果 EVS 是整盘挂载,直接写/dev/sdb就行,不需要分区。
udev 方式更灵活,适合不想装 oracleasmlib 的场景。在/etc/udev/rules.d/99-oracle-asmdevices.rules里写:
KERNEL=="sdb", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="3600...", SYMLINK+="asm-crs1", OWNER="grid", GROUP="asmadmin", MODE="0660"RESULT里的值用scsi_id命令查出来。每个盘写一条规则,然后udevadm control --reload-rules && udevadm trigger生效。ls -l /dev/asm-*能看到软链接就说明绑定成功。
注意:华为云 EVS 的 SCSI ID 在重启后可能变化,udev 规则里最好用
scsi_id查出来的稳定标识,不要用/dev/sdX这种可能漂移的设备名。
4.2 Grid Infrastructure 安装的关键节点
Grid 安装是图形化的,runInstaller启动后按向导走。几个关键选择:
第一,安装选项选“Install and Configure Oracle Grid Infrastructure for a Cluster”,不要选“Upgrade”。第二,集群类型选“Configure a Standard Cluster”,不是“Oracle Flex Cluster”。第三,节点信息里把 rac1 和 rac2 都加进去,SSH 连通性测试必须通过。第四,网络接口配置里,eth0 选 Public,eth1 选 Private,VIP 和 Scan IP 按规划填。
安装到“Specify Storage Option”时选“Oracle Automatic Storage Management”,然后“Create a New ASM Disk Group”。CRS 磁盘组选 External 冗余,把三块 CRS 盘加进去。DATA 和 ARCH 磁盘组可以在 Grid 装完之后用 ASMCA 创建,也可以在安装时一起建。
安装过程中会弹出一个窗口让在两个节点分别执行orainstRoot.sh和root.sh。orainstRoot.sh先执行,两个节点都跑完再跑root.sh。root.sh在第一个节点执行完会提示在第二个节点执行,顺序不能乱。
root.sh执行完,用crsctl check crs检查:
crsctl check crs CRS-4638: Oracle High Availability Services is online CRS-4537: Cluster Ready Services is online CRS-4529: Cluster Synchronization Services is online CRS-4533: Event Manager is online四个服务都 online 才算 Grid 装好了。如果 CRS 起不来,先看/u01/app/11.2.0/grid/log/<hostname>/alert<hostname>.log,常见原因是 Voting Disk 不可访问或者网络心跳不通。
4.3 用 ASMCA 创建 DATA 和 ARCH 磁盘组
Grid 装完后,以 grid 用户执行asmca,图形界面里点“Create”创建 DATA 和 ARCH 磁盘组。DATA 盘选 External 冗余,分配单元 1M。ARCH 盘同样。创建完用asmcmd lsdg确认:
asmcmd lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name MOUNTED EXTERN N 512 4096 1048576 20480 20380 0 20380 0 N DATA/ MOUNTED EXTERN N 512 4096 1048576 15360 15280 0 15280 0 N ARCH/ MOUNTED EXTERN N 512 4096 1048576 9216 9100 0 9100 0 Y CRS/Voting_files列在 CRS 磁盘组显示Y,说明 Voting Disk 已经放上去了。DATA 和 ARCH 显示N是正常的。
5. 数据库软件安装和建库:从 DBCA 到集群验证
5.1 数据库软件安装的选项差异
以 oracle 用户执行runInstaller,安装选项选“Install database software only”,不要选“Create and configure a database”。因为 RAC 环境下建库要用 DBCA 单独做,安装向导里直接建库容易出问题。
安装类型选“Oracle Real Application Clusters database installation”,节点列表里两个节点都勾上。安装路径用/u01/app/oracle/product/11.2.0/dbhome_1,和前面环境变量里设的一致。安装过程中同样会提示执行root.sh,这次是在 Oracle 数据库的 ORACLE_HOME 下执行,两个节点都要跑。
装完之后用$ORACLE_HOME/OPatch/opatch lsinventory确认补丁情况。文档说“不涉及任何 PSU”,所以lsinventory里应该只有基础版本,没有补丁记录。
5.2 DBCA 建库的参数选择
以 oracle 用户执行dbca,选择“Oracle Real Application Clusters (RAC) database”。数据库名和实例名按规划填,实例名节点 1 是rac1,节点 2 是rac2。存储类型选“Automatic Storage Management (ASM)”,然后选 DATA 磁盘组。
关键参数:
| 参数 | 建议值 | 说明 |
|---|---|---|
| 字符集 | AL32UTF8 | 文档里 NLS_LANG 设的是 zhs16gbk,但建库时建议用 AL32UTF8,避免中文乱码 |
| 内存 | 按 ECS 规格的 60% | 比如 16G 内存给 10G,SGA 和 PGA 自动分配 |
| 归档模式 | 开启 | ARCH 磁盘组就是为归档准备的 |
| 闪回恢复区 | +ARCH | 大小按 ARCH 磁盘组容量设 |
| 样本 schema | 不勾 | 生产环境不需要 |
建库过程大概 20 到 40 分钟,取决于 EVS 的 IO 性能。建完之后用srvctl status database -d <dbname>检查:
srvctl status database -d racdb Instance racdb1 is running on node racdb1 Instance racdb2 is running on node racdb2两个实例都 running 才算建库成功。
5.3 集群验证和常见状态检查
建完库之后,跑几个命令确认集群状态:
crsctl stat res -t这个命令输出所有集群资源的状态,重点看ora.<dbname>.db是 ONLINE,ora.<dbname>.<instance>.inst在两个节点都是 ONLINE,ora.LISTENER_SCAN1.lsnr是 ONLINE。如果有 OFFLINE 的资源,用crsctl stat res <resource_name> -p看详细状态,再查对应的日志。
olsnodes -n输出两个节点的主机名和节点号,确认节点列表正确。
srvctl config scan确认 Scan IP 和 Scan 监听配置正确。11.2.0.4 默认只配一个 Scan IP,如果客户端连接报ORA-12537,先检查 Scan 监听是不是在跑。
6. 云上 RAC 的避坑清单和几个验证技巧
6.1 五个血泪踩坑记录
现象:Grid 安装到 SSH 校验时报PRVF-5113 : Unable to find the hostname原因:/etc/hosts里主机名和hostname命令输出不一致,或者127.0.0.1映射到了错误的主机名。 解决:hostname确认当前主机名,确保/etc/hosts里有一行<public_ip> <hostname>,且127.0.0.1只映射 localhost。
现象:crsctl check crs显示 CRS 离线,日志报Voting disk not found原因:ASM 磁盘组没挂载,或者 udev 规则没生效,Grid 找不到 Voting Disk。 解决:ls -l /dev/asm-*确认软链接存在,asmcmd lsdg确认 CRS 磁盘组 MOUNTED。如果 udev 规则没生效,udevadm trigger重新触发。
现象:DBCA 建库到 45% 报ORA-15064: communication failure with ASM instance原因:ASM 实例的memory_target设太小,或者kernel.sem参数不够。 解决:检查/etc/sysctl.conf里kernel.sem是不是256 32000 100 142,ASM 实例内存至少给 1G。
现象:客户端连 Scan IP 报ORA-12537: TNS:connection closed原因:Scan 监听没起来,或者安全组没放行 Scan IP 的端口。 解决:srvctl status scan_listener确认监听状态,华为云安全组里放行 1521 端口,源地址填客户端网段。
现象:节点 2 的root.sh执行完,crsctl stat res -t里节点 2 的资源全是 OFFLINE原因:节点 2 的私网不通,或者时间不同步。 解决:ping <节点1私网IP>确认私网连通,ntpdate同步两个节点的时间。RAC 对时间偏差很敏感,超过 30 秒就会出问题。
6.2 一个验证集群健康度的习惯
我每次装完 RAC,不管多顺利,都会强制走一遍这个检查清单:
# 1. 集群服务状态 crsctl check crs # 2. 资源状态 crsctl stat res -t # 3. 节点列表 olsnodes -n # 4. ASM 磁盘组 asmcmd lsdg # 5. 数据库实例 srvctl status database -d <dbname> # 6. Scan 监听 srvctl status scan_listener # 7. VIP 状态 srvctl status vip -n <node1> srvctl status vip -n <node2>七条命令全过,才算这套 RAC 真的能交付。少一条都可能埋雷,比如 VIP 没漂移成功,故障切换时客户端就连不上。从那以后我每次交付前都强制走一遍这个清单,再也没出现过“装完能用、一主一备就挂”的情况。希望帮到你。
本文还有配套的精品资源,点击获取