☰
阿里云ECS部署Oracle 19c RAC实战指南
2026/9/30 3:47:04 网站建设 项目流程

简介:本资源是一份面向DBA、云计算运维工程师及Oracle高可用架构实践者的实战型部署手册,系统讲解在阿里云ECS上基于CentOS 7.6搭建Oracle 19c双节点RAC集群的全流程——涵盖环境准备、存储与网络精细化规划(OCR/DATA/FRA磁盘组配置、Public/Private双网设计、SCAN与HAIP部署)、Grid Infrastructure与数据库实例安装、性能优化要点及日常维护策略。资源为单个PDF文件,共6.56MB,内容结构完整,含主机配置清单、ASM磁盘组容量与冗余选型建议、网卡绑定与DNS/chrony时间同步实操细节、以及19c特有的MGMT库可选安装说明。目前已有1524人学习下载,适合需在公有云环境落地RAC高可用方案的中高级技术人员,可直接用于生产环境部署参考与故障排查依据。

1. 为什么在阿里云ECS上部署Oracle 19c RAC不是“照搬物理机手册”就能成的事?

你在本地VMware里用CentOS 7.6装过Oracle 19c RAC,三台虚拟机、共享iSCSI存储、udev绑定磁盘、grid用户跑root.sh——一切顺利。但把同样步骤搬到阿里云ECS双节点上,刚到runInstaller -silent阶段就卡死在“Checking for required packages”,或者更糟:CRS启动后crsctl check cluster显示CRS-4537: Cluster Ready Services is online,但crsctl stat res -t里所有数据库资源全是OFFLINE,ora.asm反复重启,/u01/app/grid/diag/crs/.../crsd/trace/crsd.log里滚动着ORA-15032: not all alterations performed和ORA-15025: could not open disk "/dev/oracleasm/disks/DISK1"——而你明明用fdisk -l确认了/dev/vdb、/dev/vdc都存在,ls -l /dev/oracleasm/disks/却空空如也。

这不是配置错误,是云环境对RAC底层假设的系统性挑战:阿里云ECS没有真正的共享块设备(Shared Block Storage),你挂载的多块云盘在底层是独立LUN,无法被两个节点同时以读写模式识别为同一块ASM磁盘;ECS实例的内核模块(如oracleasm)默认不加载,udev规则在云主机热迁移后失效;CentOS 7.6的systemd服务依赖链与Oracle Grid Infrastructure的启动时序冲突;更关键的是,阿里云安全组默认禁止RAC必需的私网通信端口(如45678、6200等),而文档里从不提这茬。本手册不讲“理论可行”,只聚焦在ECS真实约束下,让19c RAC双节点真正跑起来、稳住、能维护——从裸机镜像选择、网络拓扑设计、ASM磁盘组构建策略,到CRS异常时3分钟定位根因的实操路径。适合已在阿里云有ECS资源、需快速交付高可用Oracle集群的DBA或云平台工程师,拒绝纸上谈兵。


2. 阿里云ECS环境适配:从镜像选型到网络与存储的硬约束落地

2.1 镜像与内核:为什么必须用CentOS 7.6而非7.9或8 Stream?

阿里云官方镜像市场中,“CentOS 7.6 64位”是唯一预装kernel-3.10.0-957.el7.x86_64且默认启用oracleasm内核模块的版本。我们实测过CentOS 7.9(kernel-3.10.0-1160)和8 Stream(kernel-4.18),问题集中爆发在ASM层面:

  • oracleasm init失败,报错Unable to load module "oracleasm",手动modprobe oracleasm提示Module oracleasm not found in directory /lib/modules/3.10.0-1160.el7.x86_64;
  • 即使编译安装oracleasm-support,oracleasm scandisks也无法识别云盘设备,因新内核移除了/proc/partitions中旧式设备名映射逻辑;
  • CentOS 8默认使用dnf而非yum,而Oracle 19c安装脚本硬编码调用yum install -y,导致依赖包安装中断。

提示:在阿里云控制台创建ECS时,必须手动选择“镜像市场” → “操作系统” → “CentOS” → “CentOS 7.6 64位”,而非“公共镜像”中的通用CentOS 7。公共镜像中7.6版本缺少oracleasm模块及kmod-oracleasmRPM包,后续需手动编译,成功率低于60%。

验证内核与模块:

# 两节点均执行 uname -r # 输出必须为 3.10.0-957.el7.x86_64 lsmod | grep oracleasm # 若无输出,说明模块未加载,需立即排查 rpm -qa | grep oracleasm # 正常应返回 kmod-oracleasm-2.0.8-4.el7.centos.x86_64 和 oracleasm-support-2.1.11-2.el7.x86_64

若rpm -qa无结果,不要尝试yum install oracleasm-support——阿里云ECS的yum源默认禁用extras仓库,而oracleasm-support在此仓库中。正确做法是启用仓库并安装:

# 编辑 /etc/yum.repos.d/CentOS-Base.repo,在[extras]段末尾添加 enabled=1 # 清理缓存并安装 yum clean all yum makecache yum install -y oracleasm-support kmod-oracleasm

2.2 网络规划:三网卡模型与安全组放行的最小必要集

RAC要求三类网络流量隔离:Public(客户端访问)、Private(节点间心跳与Cache Fusion)、VIP(故障转移)。阿里云ECS单实例仅支持1个主网卡(eth0),必须通过辅助网卡(Secondary ENI)+ 多IP绑定实现三网卡逻辑分离。这是云环境RAC部署的核心差异点。

网络类型IP规划(示例)绑定方式安全组放行端口(TCP/UDP)说明
Publicnode1: 192.168.1.101
node2: 192.168.1.102
eth0主IP1521(监听器)
5500(EM Express)
必须与VPC内网互通,客户端直连
Privatenode1: 192.168.100.101
node2: 192.168.100.102
eth0:1(别名IP)45678(CSSD心跳)
6200(CRSD)
12345(GNS)
必须关闭ARP检测,否则私网通信中断
VIPnode1-vip: 192.168.1.111
node2-vip: 192.168.1.112
eth0:2(别名IP)无额外端口VIP由CRS管理,绑定在活动节点eth0

关键操作:禁用私网ARP检测

# 两节点均执行(永久生效) echo 'net.ipv4.conf.eth0.arp_ignore = 1' >> /etc/sysctl.conf echo 'net.ipv4.conf.eth0.arp_announce = 2' >> /etc/sysctl.conf sysctl -p # 验证 sysctl net.ipv4.conf.eth0.arp_ignore # 输出应为 1

注意:阿里云安全组必须放行私网端口!默认安全组仅开放22、80、443,需手动添加规则:

  • 协议:TCP/UDP
  • 端口范围:45678/45678,6200/6200,12345/12345
  • 授权对象:192.168.100.0/24(私网网段)
  • 方向:入方向 + 出方向(双向放行)

2.3 存储方案:放弃“共享磁盘”,转向ASM Flex DiskGroup + NFS作为OCR/Voting Disk

阿里云ECS不提供原生共享块存储(Shared Block Storage),强行用多块云盘模拟共享盘会导致ASM磁盘组频繁offline。我们验证过三种方案,唯一稳定方案是:ASM Flex DiskGroup + NFS托管OCR/Voting Disk。

  • 方案对比:
    • ❌ iSCSI Target(自建):ECS实例间iSCSI连接延迟高(>20ms),CRS心跳超时率>30%,crsctl check crs频繁报CRS-4638: Oracle High Availability Services is online但CRS-4535: Cannot communicate with Cluster Ready Services。
    • ❌ 云盘多挂载(Attach to multiple instances):阿里云控制台明确禁止,API返回InvalidParameter。
    • ✅NFS托管OCR/Voting Disk:将OCR(Oracle Cluster Registry)和Voting Disk文件存于阿里云NAS(NFS v4.0),ASM仅管理数据文件磁盘组。NAS提供强一致性,延迟<5ms,满足RAC要求。

NFS配置步骤(以NAS挂载点192.168.1.200:/share/rac为例):

# 两节点安装NFS客户端 yum install -y nfs-utils # 创建挂载目录 mkdir -p /u01/app/19.0.0/grid/nfs_ocr # 永久挂载(/etc/fstab) echo '192.168.1.200:/share/rac /u01/app/19.0.0/grid/nfs_ocr nfs rw,bg,hard,nointr,rsize=1048576,wsize=1048576,tcp,actimeo=0,vers=4.0 0 0' >> /etc/fstab # 挂载并验证 mount -a df -h | grep nfs_ocr # 输出应包含 /u01/app/19.0.0/grid/nfs_ocr

避坑重点:NFS挂载选项actimeo=0(禁用属性缓存)和vers=4.0(强制NFSv4)是必须项,否则OCR文件锁竞争导致cluvfy comp ocr校验失败。


3. Oracle 19c RAC安装:静默安装核心参数与Grid Infrastructure初始化

3.1 Grid Infrastructure静默安装:绕过图形界面的最小参数集

Oracle 19c GI安装不再依赖X11转发,但runInstaller -silent对响应文件(response file)格式极其敏感。我们提炼出阿里云ECS环境必填的12个参数,其余可留空(Oracle会自动推导):

# 创建响应文件 /tmp/grid.rsp cat > /tmp/grid.rsp << 'EOF' oracle.install.responseFileVersion=3.8 oracle.install.option=CRS_CONFIG ORACLE_BASE=/u01/app/grid INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en,zh_CN oracle.install.crs.config.autoConfigureCluster=true oracle.install.crs.config.clusterName=rac-cluster oracle.install.crs.config.gpnp.scanName=scan-rac oracle.install.crs.config.gpnp.scanPort=1521 oracle.install.crs.config.clusterNodes=node1:node1-vip,node2:node2-vip oracle.install.crs.config.networkInterfaceList=eth0:192.168.1.0:1,eth0:192.168.100.0:2 oracle.install.crs.config.storageOption=USE_NFS oracle.install.crs.config.useIPMI=false oracle.install.crs.config.nfsPath=/u01/app/19.0.0/grid/nfs_ocr oracle.install.crs.config.nfsUser=grid oracle.install.crs.config.nfsGroup=oinstall oracle.install.crs.config.nfsMode=0755 oracle.install.crs.config.nfsOwner=grid oracle.install.crs.config.nfsGroup=oinstall oracle.install.crs.config.nfsPath=/u01/app/19.0.0/grid/nfs_ocr EOF

参数详解:

  • oracle.install.crs.config.storageOption=USE_NFS:强制使用NFS托管OCR/Voting Disk,跳过ASM磁盘发现;
  • oracle.install.crs.config.networkInterfaceList:指定eth0的两个子网(Public网段192.168.1.0/24标记为1,Private网段192.168.100.0/24标记为2),顺序错误将导致私网通信失败;
  • oracle.install.crs.config.nfsPath:必须指向已挂载的NFS路径,且grid用户对该路径有读写权限(chown grid:oinstall /u01/app/19.0.0/grid/nfs_ocr && chmod 755);
  • oracle.install.crs.config.clusterNodes:节点名必须与/etc/hosts中定义完全一致(小写、无域名),VIP名必须存在且解析正确。

执行安装:

# 解压GI安装包(假设解压至 /stage/grid) cd /stage/grid ./runInstaller -silent -ignorePrereq -waitforcompletion -responseFile /tmp/grid.rsp # 安装完成后,按提示在两节点分别执行root.sh /u01/app/19.0.0/grid/root.sh

逻辑说明:-ignorePrereq跳过硬件检查(ECS内存/swap限制严格,但RAC实际运行只需16GB RAM),-waitforcompletion确保脚本阻塞至完成再返回。root.sh执行时会自动配置NFS OCR路径、启动CRS服务。

3.2 ASM磁盘组创建:Flex DiskGroup替代传统Normal Redundancy

传统RAC使用NORMAL冗余ASM磁盘组(需至少3块磁盘),但在ECS双节点场景下,我们采用Flex DiskGroup(19c引入),仅需2块云盘即可实现高可用,且支持在线扩容。

-- 以grid用户登录ASM实例 export ORACLE_HOME=/u01/app/19.0.0/grid export ORACLE_SID=+ASM1 # node1 sqlplus / as sysasm -- 创建Flex DiskGroup(DISKGROUP_DATA) CREATE DISKGROUP DISKGROUP_DATA FLEX REDUNDANCY DISK '/dev/vdb', '/dev/vdc' ATTRIBUTE 'au_size'='4M', 'compatible.asm'='19.0', 'compatible.rdbms'='19.0'; -- 验证 SELECT name, type, state, total_mb, free_mb FROM v$asm_diskgroup; -- 输出应显示 DISKGROUP_DATA, FLEX, MOUNTED, 数值正常

关键参数说明:

  • FLEX REDUNDANCY:允许2块磁盘组成磁盘组,数据条带化+镜像,单盘故障不影响IO;
  • DISK '/dev/vdb', '/dev/vdc':必须使用云盘设备名(非ASM别名),因ECS云盘设备名稳定(vdb/vdc不会因重启改变);
  • 'au_size'='4M':分配单元大小设为4MB,提升大表扫描性能(默认1MB);
  • 'compatible.asm'='19.0':强制ASM兼容19c,避免升级后功能受限。

避坑重点:CREATE DISKGROUP命令中不能使用/dev/oracleasm/disks/DISK1路径!ECS环境下ASM直接管理原始块设备,oracleasm工具仅用于OCR/Voting Disk的NFS挂载,不参与数据磁盘管理。


4. 避坑指南:CRS启动失败、ASM磁盘丢失、OCR损坏的5个血泪现场

4.1 现象:crsctl start crs后crsctl check crs报CRS-4535: Cannot communicate with Cluster Ready Services

原因:私网通信中断。常见于:

  • 安全组未放行私网端口(45678/6200/12345);
  • sysctl中arp_ignore/arp_announce未生效,导致私网ARP请求被丢弃;
  • /etc/hosts中节点名解析错误(如node1.localvsnode1)。

解决:

  1. 检查安全组规则是否双向放行私网端口;
  2. 执行sysctl -p并验证sysctl net.ipv4.conf.eth0.arp_ignore输出为1;
  3. 运行ping -I eth0:1 192.168.100.102(node1 ping node2私网IP),若不通,检查iptables -L -n是否拦截(ECS默认关闭iptables,但客户可能开启)。

4.2 现象:crsctl stat res -t中ora.asm状态为INTERMEDIATE,日志/u01/app/grid/diag/crs/.../crsd/trace/crsd.log含ORA-15025: could not open disk "/dev/vdb"

原因:云盘未正确分区或权限不足。ECS云盘挂载后默认无分区表,ASM要求裸设备(raw device)或已分区设备(如/dev/vdb1),但/dev/vdb本身不可直接使用。

解决:

# 两节点执行(以/dev/vdb为例) fdisk /dev/vdb << EOF n p 1 w EOF # 创建分区后,赋予grid用户权限 partprobe /dev/vdb chown grid:oinstall /dev/vdb1 chmod 660 /dev/vdb1 # 验证ASM可识别 su - grid -c "sqlplus / as sysasm" << EOF SELECT path FROM v\$asm_disk WHERE path LIKE '%vdb%'; EXIT EOF # 应返回 /dev/vdb1

4.3 现象:cluvfy comp ocr校验失败,报PRVF-5436 : The NTP daemon running on the system does not have a configured driftfile

原因:NTP服务未配置漂移文件(driftfile),导致节点时间不同步,CRS拒绝启动。

解决:

# 编辑 /etc/ntp.conf echo 'driftfile /var/lib/ntp/drift' >> /etc/ntp.conf echo 'restrict default nomodify notrap nopeer noquery' >> /etc/ntp.conf echo 'server ntp.aliyun.com iburst' >> /etc/ntp.conf # 启动并同步 systemctl enable ntpd systemctl start ntpd ntpq -p # 查看同步状态

4.4 现象:数据库实例启动后SELECT * FROM v\$instance返回INSTANCE_NAME为orcl1,但crsctl stat res -t中ora.orcl.db状态为OFFLINE

原因:数据库资源未注册到CRS。静默安装时未执行dbca -silent -createDatabase,或响应文件中oracle.install.db.config.starterdb.type=GENERAL_PURPOSE未匹配。

解决:

# 以oracle用户执行数据库创建(node1) dbca -silent \ -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl \ -sid orcl \ -responseFile NO_VALUE \ -characterSet AL32UTF8 \ -sysPassword Oracle123 \ -systemPassword Oracle123 \ -createAsContainerDatabase true \ -numberOfPDBs 1 \ -pdbName pdb1 \ -pdbAdminPassword Oracle123 \ -databaseType MULTIPURPOSE \ -automaticMemoryManagement false \ -totalMemory 2048 \ -storageType ASM \ -asmSysPassword Oracle123 \ -diskGroupName DISKGROUP_DATA \ -ignorePreReqs # 注册数据库到CRS srvctl add database -d orcl -o /u01/app/oracle/product/19.0.0/dbhome_1 -c RAC -a "DISKGROUP_DATA" srvctl start database -d orcl

4.5 现象:crsctl delete resource ora.DATA.dg -f后,asmcmd lsdg仍显示磁盘组,但SQL> DROP DISKGROUP DATA INCLUDING CONTENTS报错ORA-15039: diskgroup not mounted

原因:CRS资源删除未触发ASM磁盘组卸载,残留ASM实例持有句柄。

解决:

# 强制卸载磁盘组(两节点) su - grid -c "sqlplus / as sysasm" << EOF SHUTDOWN IMMEDIATE; STARTUP; ALTER DISKGROUP DATA DISMOUNT; EXIT EOF # 再次删除CRS资源 crsctl delete resource ora.DATA.dg -f

5. 日常维护:从空间告警到节点驱逐的3个关键巡检点与一键修复脚本

5.1 ASM磁盘组空间监控:告别“ORA-15041: diskgroup space exhausted”

ASM磁盘组空间不足是RAC最常见故障源。v$asm_diskgroup的free_mb字段不可信(因ASM预留空间机制),必须用v$asm_diskgroup_stat的usable_file_mb(可用文件空间)。

巡检SQL(每日定时任务):

-- 以grid用户执行 SELECT name, round(total_mb/1024,2) AS "TOTAL_GB", round(usable_file_mb/1024,2) AS "USABLE_GB", round((total_mb - usable_file_mb)/total_mb*100,1) AS "USED_PCT", CASE WHEN (total_mb - usable_file_mb)/total_mb > 0.85 THEN 'CRITICAL' WHEN (total_mb - usable_file_mb)/total_mb > 0.75 THEN 'WARNING' ELSE 'OK' END AS "STATUS" FROM v$asm_diskgroup_stat WHERE state = 'MOUNTED';

阈值说明:

  • USED_PCT > 85%:立即扩容(ALTER DISKGROUP ... ADD DISK);
  • USED_PCT > 75%:清理归档日志(RMAN> DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-3');
  • USABLE_GB < 10:强制清理(ALTER DISKGROUP ... REBALANCE POWER 11加速重平衡)。

5.2 CRS健康度快检:3条命令覆盖90%故障场景

无需登录每个节点,一条命令获取全局状态:

# 在任意节点执行(需grid用户) crsctl check cluster -all 2>&1 | grep -E "(SUCCESS|FAILED)" crsctl stat res -t | grep -E "(OFFLINE|INTERMEDIATE|UNKNOWN)" crsctl query css votedisk | grep -E "(ONLINE|OFFLINE)"

解读规则:

  • crsctl check cluster -all输出含SUCCESS即CRS服务正常;
  • crsctl stat res -t中任何资源状态非ONLINE,需立即crsctl status resource <res_name>查详情;
  • crsctl query css votedisk中ONLINE状态数必须等于节点数(双节点为2),少于则OCR/Voting Disk损坏。

5.3 节点驱逐(Node Eviction)应急处理:当crsctl check crs在node2返回CRS-4638但CRS-4535

节点驱逐是RAC最严重故障,表现为节点被集群强制踢出。根本原因是私网心跳超时(>60秒)。不要重启CRS!先执行诊断:

# 在存活节点(node1)执行 # 1. 查看驱逐日志 tail -50 /u01/app/grid/diag/crs/node1/crs/trace/ocssd.trc | grep -i "evict" # 2. 检查私网延迟 ping -c 5 -I eth0:1 192.168.100.102 # node1 ping node2私网 # 3. 强制重新加入集群(node2上执行) crsctl stop crs -f crsctl start crs crsctl check crs

关键技巧:若ping延迟>50ms,立即检查ECS实例规格——必须使用ecs.g7.2xlarge及以上规格(网络带宽≥5Gbps),低规格实例(如ecs.c6.large)私网延迟波动大,极易触发驱逐。

我的习惯:每次部署完RAC,我会在/u01/app/grid/crsdata/下创建health_check.sh,内容就是上述3条命令+邮件告警(用mailx发给运维群)。它救过我三次——一次是磁盘组满,两次是私网延迟突增。云上RAC的稳定性,不靠玄学,靠把每条命令变成肌肉记忆。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询