系列Oracle 数据库全栈运维实战系列VMware 版· 高可用篇核心篇版本Oracle Grid Infrastructure 19.3 Oracle Database 19.3RHEL/Oracle Linux 7.9环境VMware Workstation 16/17 双节点虚拟机共享 VMDK 实现共享存储一、为什么在 VMware 上装 RAC生产环境 RAC 通常跑在物理机 专有存储SAN/iSCSI上门槛高。而VMware 虚拟化可以把共享存储“模拟”出来——两台虚拟机挂载同一块 VMDK即可让 Oracle 集群软件Grid Infrastructure感知到真实共享盘从而跑起完整、真实的双节点 RAC 集群真实集群组件CRS / CSS / EVM / ASM / SCAN 全部可用可验证 Cache Fusion、DLM分布式锁管理、GV$ 视图等 RAC 核心机制单台物理机即可模拟两节点适合学习、开发、测试与灾备演练注意容器化Docker方案只能“近似”模拟VMware 方案与生产环境完全同构迁移到物理机/云上的 RAC 几乎无差异。二、环境规划2.1 硬件与软件项配置宿主机物理机内存 ≥ 16G推荐 32G磁盘 ≥ 200G虚拟化VMware Workstation 16/17 Pro节点rac1 / rac2各分配4 vCPU / 8GB 内存 / 80G 系统盘Oracle Linux 7.9共享盘独立 VMDK 文件两节点同时挂载数据库Oracle Grid 19.3 Oracle DB 19.3linuxx64_193000ASMCRSDG3×2G放 OCR/Voting DATADG数据盘 20G2.2 网络规划每节点 2 张网卡用途网段rac1rac2Public业务192.168.10.0/24192.168.10.173192.168.10.174Private心跳172.16.0.0/24172.16.0.158172.16.0.159VIP192.168.10.0/24192.168.10.175192.168.10.176SCAN192.168.10.0/24192.168.10.177~1793 个地址—VMware 中Public 网卡用 NAT/桥接Private 网卡用“仅主机模式Host-Only”确保两节点心跳互通且独立。三、第一步创建共享磁盘3.1 用 vmware-vdiskmanager 预创建共享 VMDK在宿主机上VMware 安装目录Windows执行set pa th%path%;C:\Program Files (x86)\VMware\VMware Workstation vmware-vdiskmanager.exe -c -s 2g -a lsilogic -t 4 D:\VMS\Storages ac-crs1.vmdk vmware-vdiskmanager.exe -c -s 2g -a lsilogic -t 4 D:\VMS\Storages ac-crs2.vmdk vmware-vdiskmanager.exe -c -s 2g -a lsilogic -t 4 D:\VMS\Storages ac-crs3.vmdk vmware-vdiskmanager.exe -c -s 20g -a lsilogic -t 4 D:\VMS\Storages ac-data.vmdk-t 4 预分配EagerZeroedThick共享盘必须预分配-a lsilogic指定控制器类型与后续 vmx 一致。3.2 在两台虚拟机 vmx 中挂载共享盘编辑rac1.vmx 和 rac2.vmx两个文件都要加指向同一 VMDK# 共享磁盘段两节点必须一致 disk.locking false diskLib.dataCacheMaxSize 0 diskLib.dataCacheMaxReadAheadSize 0 diskLib.dataCacheMinReadAheadSize 0 diskLib.dataCachePageSize 4096 diskLib.maxUnsyncedWrites 0 scsi1.present TRUE scsi1.virtualDev lsilogic scsi1.sharedBus virtual scsi1:0.present TRUE scsi1:0.fileName D:\VMS\Storages ac-crs1.vmdk scsi1:0.mode independent-persistent scsi1:0.redo scsi1:1.present TRUE scsi1:1.fileName D:\VMS\Storages ac-crs2.vmdk scsi1:1.mode independent-persistent scsi1:1.redo scsi1:2.present TRUE scsi1:2.fileName D:\VMS\Storages ac-crs3.vmdk scsi1:2.mode independent-persistent scsi1:2.redo scsi1:3.present TRUE scsi1:3.fileName D:\VMS\Storages ac-data.vmdk scsi1:3.mode independent-persistent scsi1:3.redo 关键点disk.locking false允许两虚拟机并发写同一 VMDKscsi1.sharedBus virtual共享 SCSI 总线mode independent-persistent共享盘不能用快照模式VMware Workstation GUI 里“硬盘 → 高级 → SCSI 控制器共享”选择“虚拟”也可配置直接改 vmx 更可靠。四、第二步系统基础配置两节点相同4.1 /etc/hostsPublic Private VIP SCAN127.0.0.1 localhost localhost.localdomain # Public 192.168.10.173 rac1.example.com rac1 192.168.10.174 rac2.example.com rac2 # Private心跳 172.16.0.158 rac1-priv.example.com rac1-priv 172.16.0.159 rac2-priv.example.com rac2-priv # VIP 192.168.10.175 rac1-vip.example.com rac1-vip 192.168.10.176 rac2-vip.example.com rac2-vip # SCAN 192.168.10.177 rac-scan.example.com rac-scan 192.168.10.178 rac-scan.example.com rac-scan 192.168.10.179 rac-scan.example.com rac-scan若用 DNS 解析 SCAN可只写一条测试环境直接写 hosts 最省事3 个地址都指向同一域名做轮询。4.2 关闭 SELinux / 防火墙 / NetworkManager 干扰sed-is/^SELINUX.*/SELINUXdisabled//etc/selinux/config systemctl stop firewalldsystemctl disable firewalld systemctl disable NetworkManager# 用 network 脚本管理可选仅测试环境reboot4.3 内核参数/etc/sysctl.d/97-oracle.confcat/etc/sysctl.d/97-oracle.confEOF fs.aio-max-nr 3145728 fs.file-max 6815744 kernel.shmmax 68719476736 # 按内存调整8G 内存可设 64G 上限 kernel.shmall 16777216 kernel.shmmni 4096 kernel.sem 250 32000 100 128 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 net.ipv4.tcp_rmem 4096 87380 4194304 net.ipv4.tcp_wmem 4096 16384 4194304 kernel.panic_on_oops 1 vm.min_free_kbytes 524288 EOFsysctl--system4.4 资源限制/etc/security/limits.d/99-grid-oracle.confcat/etc/security/limits.d/99-grid-oracle.confEOF oracle soft nproc 16384 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 oracle hard memlock 68719476736 grid soft nproc 16384 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 grid soft stack 10240 grid hard stack 32768 grid hard memlock 68719476736 EOF4.5 关闭透明大页 扩大 /dev/shm# 修改 /etc/default/grub在 GRUB_CMDLINE_LINUX 加# numaoff transparent_hugepagenevergrub2-mkconfig-o/boot/grub2/grub.cfg# /dev/shm 扩到 2Gechotmpfs /dev/shm tmpfs defaults,rw,exec,size2G 0 0/etc/fstabmount-oremount,size2G /dev/shm4.6 创建用户、组与目录groupadd-g54321oinstallgroupadd-g54322dbagroupadd-g54323opergroupadd-g54324backupdbagroupadd-g54325dgdbagroupadd-g54326kmdbagroupadd-g54327asmdbagroupadd-g54328asmopergroupadd-g54329asmadminuseradd-u1100-goinstall-Gdba,oper,backupdba,dgdba,kmdba griduseradd-u1101-goi nstall-Gdba,oper,backupdba,dgdba,kmdba,asmdba oraclemkdir-p/u01/app/19.0.0/gridmkdir-p/u01/app/oraclemkdir-p/u01/app/gridchown-Rgrid:oinstall /u01/app/19.0.0 /u01/app/gridchown-Roracle:oinstall /u01/app/oraclechmod-R775/u014.7 SSH 双机互信# 在 rac1 上执行grid 与 oracle 用户都要配su- grid ssh-keygen-trsa-P-f~/.ssh/id_rsacat~/.ssh/id_rsa.pub~/.ssh/authorized_keysssh-oStrictHostKeyCheckingno rac2cat ~/.ssh/id_rsa.pub~/.ssh/authorized_keys# 互相验证两边都要能免密sshrac2date五、第三步磁盘分区与 udev 固定设备名5.1 分区两节点共享盘同样可见只在 rac1 分区即可2 节点重扫echo-en\np\n1\n\n\nw|fdisk/dev/sdbecho-en\np\n1\n\n\nw|fdisk/dev/sdcecho-en\np\n1\n\n\nw|fdisk/dev/sddecho-en\np\n1\n\n\nw|fdisk/dev/sde partprobe5.2 udev 规则把磁盘固化为 asm 设备名先获取每块盘 WWID/usr/lib/udev/scsi_id--whitelisted--replace-whitespace--device/dev/sdb1再把结果写入/etc/udev/rules.d/99-oracle-asmdevices.rulesKERNELsd*, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device/dev/$name, RESULTsdb1的WWID, SYMLINKoracleasm/asm-crs1, OWNERgrid, GROUPasmadmin, MODE0660 KERNELsd*, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device/dev/$name, RESULTsdc1的WWID, SYMLINKoracleasm/asm-crs2, OWNERgrid, GROUPasmadmin , MODE0660 KERNELsd*, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device/dev/$name, RESULTsdd1的WWID, SYMLINKoracleasm/asm-crs3, OWNERgrid, GROUPasmadmin, MODE0660 KERNELsd*, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device/dev/$name, RESULTsde1的WWID, SYMLINKoracleasm/asm-data, OWNERgrid, GROUPasmadmin, MODE0660加载规则并验证udevadm control --reload-rules udevadm trigger--typedevices--actionchangels-l/dev/oracleasm/# 应看到 asm-crs1/2/3、asm-data 4 个符号链接属主 grid:asmadmin六、第四步安装 Grid InfrastructureCluster 软件6.1 解压软件并装 cvuqdiskunzip-qoLINUX.X64_193000_grid_home.zip-d/u01/app/19.0.0/gridchown-Rgrid:oinstall /u01/app/19.0.0/gridcd/u01/app/19.0.0/grid/cv/rpmrpm-ivhcvuqdisk-1.0.10-1.rpm6.2 预检查可选但推荐su- grid /u01/app/19.0.0/grid/runcluvfy.sh stage-precrsinst-nrac1,rac2-fixup-verbose6.3 静默安装 GI响应文件 gridsetup.rspsu- gridcat/home/grid/gridsetup.rspEOF oracle.install.responseFileVersion/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0 oracle.install.optionCRS_CONFIG oracle.install.asm.OSDBAasmdba oracle.install.asm.OSOPERasmoper oracle.install.asm.OSASMasmadmin oracle.install.crs.config.scanTypeLOCAL_SCAN oracle.install. crs.config.gpnp.scanNamerac-scan oracle.install.crs.config.gpnp.scanPort1521 oracle.install.crs.config.ClusterConfigurationSTANDALONE oracle.install.crs.config.configureAsExtendedClusterfalse oracle.install.crs.config.clusterNamerac-cluster oracle.install.crs.config.gpnp.configureGNSfalse oracle.install.crs.config.autoConfigureClusterNodeVIPfalse oracle.install.crs.config.clusterNodesrac1:rac1-vip:HUB,rac2:rac2-vip:HUB oracle.install.crs.config.networkInterfaceListens33:192.168.10.0:1,ens37:172.16.0.0:5 oracle.install.crs.configureGIMRfalse oracle.install.asm.diskGroup.nameCRSDG oracle.install.asm.diskGroup.redundancyNORMAL oracle.install.asm.diskGroup.AUSize4 oracle.install.asm.diskGroup.disks/dev/oracleasm/asm-crs1,/dev/oracleasm/asm-crs2,/dev/oracleasm/asm-crs3 oracle.install.asm.diskGroup.diskDiscoveryString/dev/oracleasm/* oracle.install.asm.SYSASMPasswordYour_ASM_Password oracle.install.asm.monitorPasswordYour_ASM_Password EOF/u01/app/19.0.0/grid/gridSetup.sh-silent-responseFile/home/grid/gridsetup.rsp-ignorePrereqnetworkInterfaceList 中网卡名ens33/ens37按实际环境调整-ignorePrereq用于跳过不影响核心的预检告警测试环境。6.4 执行 root 脚本关键步骤安装接近完成时按提示在两个节点分别以 root 执行# rac1/u01/app/19.0.0/grid/root.sh# rac2rac1 执行完后再执行/u01/app/19.0.0/grid/root.sh6.5 验证集群su- grid crsctlstatres-t# 预期ora.cssd / ora.diskmon / ora.asm / ora.crsd 等均为 ONLINE crsctl check cluster-allcrsctl check crs七、第五步安装数据库软件 DBCA 建 RAC 库7.1 安装 Database 软件unzip-qoLINUX.X64_193000_db_home.zip-d/u01/app/oracle/product/19.0.0/dbhome_1chown-Roracle:oinstall /u01/app/oraclesu- oraclecd/u01/app/oracle/product/19.0.0/dbhome_1 ./runInstaller-silent-responseFiledb_install.rsporacle.install.optionINSTALL_DB_SWONLYUNIX_GROUP_NAMEoinstallINVENTORY_LOCATION/u01/app/oraInventoryORACLE_HOME/u01/app/oracle/product/19.0.0/dbhome_1ORACLE_BASE/u01/app/oracleoracle.install.db.InstallEditionEEoracle.install.db.OSDBA_GROUPdbaoracle.install.db.OSOPER_GROUPoperoracle.install.db.OSBACKUPDBA_GROUPbackupdbaoracle.install.db.OSDGDBA_GROUPdgdbaoracle.install.db.OSKMDBA_GROUPkmdbaoracle.install.db.OSRACDBA_GROUPdbaoracle.install.db.CLUSTER_NODESrac1,rac2oracle.install.db.config.starterdb.typeGENERAL_PURPOSEoracle.install.db.config.starterdb.globalDBNameorcloracle.install.db.config.starterdb.SIDorcloracle.install.db.config.starterdb.characterSetAL32UTF8oracle.install.db.config.starterdb.memoryOptionfalseoracle.install.db.config.starterdb.storageTypeASM_STORAGE# 两节点执行 root 脚本/u01/app/oracle/product/19.0.0/dbhome_1/root.sh# rac1 与 rac2 各执行一次7.2 DBCA 创建 RAC 数据库su- oracle dbca-silent-createDatabase-templateName General_Purpose.dbc-gdbnameorcl-sidorcl-characterSetAL32UTF8-sysPasswordYour_DB_Password-systemPasswordYour_DB_Password-storageTypeASM-diskGroupNameDATADG-datafileDestinationDATADG-recoveryAreaDestinationDATADG-totalMemory4096-nodeinforac1,rac2若尚未创建 DATADG可先在 ASM 里补建asmca图形界面或asmcmd/SQL 创建。八、第六步验证 RAC 集群-- 1. 集群资源crsctl stat res-t-- 2. 实例状态两实例都应为 OPENsrvctlstatusdatabase-d orcl-- 3. GV$ 视图验证RAC 专属SQLSELECTinst_id,instance_name,statusFROMgv$instance;-- 4. Cache Fusion 相关等待事件RAC 特有SQLSELECTevent,total_waitsFROMgv$system_eventWHEREeventLIKEgc%ANDrownum10;-- 5. SCAN 连接验证负载均衡sqlplus system/xxxrac-scan:1521/orcl-- 反复连接观察实例轮换SELECT inst_id FROM gv$instance验证通过标准crsctl stat res -t全部 ONLINEgv$instance返回 2 行两实例SCAN 连接自动在两节点间负载均衡九、踩坑记录重点收藏#坑现象解决1共享盘未预分配GI 预检报共享存储权限/一致性错误vmdk 用-t 4预分配两节点 vmx 配置完全一致2忘记disk.lockingfalse第二节点看不到共享盘/IO 错误vmx 加共享段配置重启虚拟机3hosts 有误集群节点间通信失败cssd 起不来VIP/SCAN 地址不能与 Public 重复私网名后缀 -priv4透明大页未关GI 预检 WARN/性能异常grub 加transparent_hugepagenever并重建引导5/dev/shm 过小共享内存不足报错fstab 扩到 2G 并 remount6udev WWID 不一致两节点看到的盘名不同共享盘两节点 WWID 必须一致同一 VMDK分别核对7root.sh 顺序rac2 root.sh 报错必须 rac1 先执行成功后再执行 rac28心跳网卡选错集群误把 Public 当心跳networkInterfaceList 里 Private 网卡类型填 5cluster_interconnect9SCAN 解析失败客户端连不上 SCANhosts 里 SCAN 域名 3 个地址都写或配 DNS 轮询10内存不足root.sh/GI 安装 OOM每节点至少 8G 内存别同时跑太多进程十、结语在 VMware 上部署 RAC与生产环境物理机 SAN流程完全一致共享存储 → 系统加固 → GI → DB → DBCA → 验证。这套环境的每个组件都是真实的后续可以继续做Data Guard在 RAC 基础上搭建容灾系列第 14 篇监控Prometheus/Grafana 采集 GV$ 指标系列第 17 篇故障演练模拟节点宕机验证 Failover系列第 20 篇本文章属于《Oracle 数据库全栈运维实战系列VMware 版》高可用篇。系列规划见专栏总纲欢迎收藏、交流。