
简介这份PDF文档面向数据库管理员、系统运维人员及华为云用户针对去IOE趋势下企业将Oracle RAC迁移上云时遇到的集群报错与网络配置难题提供华为云ECS上部署Oracle RAC 11.2.0.4的完整安装指导。内容涵盖ECS双网卡与VPC网络规划、心跳网络与公网网卡设置、操作系统前期检查RPM包、Swap分区、用户组目录创建、ASM共享存储与图形界面配置、Grid Infrastructure安装、数据库软件部署、DBCA建库及集群验证与性能调优等关键环节并说明华为云如何基于ECSVPC共享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 为什么必须是双网卡 两个 SubnetOracle 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 类型冗余度分配单元用途CRS3G3超高外部1MOCR 和 Voting DiskDATA20G1超高外部1M控制文件、在线日志、数据文件、SPFILEARCH15G1高速外部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)VIPScan IPracdb1172.16.0.112172.16.1.106172.16.0.114172.16.0.120racdb2172.16.0.113172.16.1.107172.16.0.115172.16.0.120Scan 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 bs1M count4096 mkswap /u01/swap1 swapon /u01/swap1dd的bs1M count4096表示创建一个 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、asmoperoracle 用户需要属于 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.confEOF net.core.somaxconn1024 net.ipv4.tcp_max_tw_buckets5000 net.ipv4.tcp_max_syn_backlog1024 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 semmniOracle 对这几个参数有最低要求给少了 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_profileexport ORACLE_SIDASM1 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_LANGAMERICAN_AMERICA.zhs16gbk umask 022 export ORACLE_TERMxterm注意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_profileexport ORACLE_SIDrac1 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_LANGAMERICAN_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里写KERNELsdb, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id -g -u -d /dev/$name, RESULT3600..., SYMLINKasm-crs1, OWNERgrid, GROUPasmadmin, MODE0660RESULT里的值用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 选 Publiceth1 选 PrivateVIP 和 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/alerthostname.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 内存给 10GSGA 和 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是 ONLINEora.dbname.instance.inst在两个节点都是 ONLINEora.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 142ASM 实例内存至少给 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 没漂移成功故障切换时客户端就连不上。从那以后我每次交付前都强制走一遍这个清单再也没出现过“装完能用、一主一备就挂”的情况。希望帮到你。本文还有配套的精品资源点击获取