简介这份PDF文档面向需要在Linux平台搭建Oracle高可用集群的DBA与运维工程师系统讲解Oracle Linux 7.9环境下Oracle 19C RAC集群的完整部署流程。内容涵盖系统规划、主机与网络规划、虚拟机创建、操作系统安装、防火墙与网络配置、limits.conf与sysctl.conf内核参数调优、用户与目录权限、YUM源与软件包安装、NTP时间同步、ISCSI服务器配置以及Grid Infrastructure与数据库实例安装、OCR与Voting Disk配置、集群健康检查与日常维护等关键环节并说明RAC通过ASM管理共享磁盘、由Linux存储管理软件提供共享存储的实现方式。资源包共1个PDF文件约10.13MB结构按章节组织便于按步骤对照操作。目前已有600余人学习适合希望掌握Oracle 19C RAC集群部署与排错思路的中高级读者参考。1. 在 CentOS 7.9 上装 Oracle 19C RAC为什么这份“文档”值得你花一个周末如果你手上只有两台物理服务器、一个共享存储或者更常见的——一台高配宿主机想用 VMware 虚拟出整套 RAC 环境那么“在 Linux 7.9 环境下部署 Oracle 19C RAC 集群”这件事大概率是你今年绕不过去的一道坎。CentOS 7.9 虽然已经进入维护末期但大量存量生产环境、银行保险的测试区、以及各类教学实验平台仍然跑在这个版本上Oracle 19C 又是目前长期支持版本里最稳的一个两者组合出来的 RAC 集群是很多 DBA 面试和真实割接场景里的硬指标。这份安装部署文档要解决的不是“Oracle 是什么”而是把 Grid Infrastructure 和 Database 两套软件在双节点上真正跑起来让 crsctl stat res -t 里所有资源都变成 ONLINE让 VIP 能漂、ASM 能挂、实例能互相拉起。适合谁看适合已经会装单实例、但第一次碰 RAC 的运维适合被 OCR 磁盘组和网络规划卡住、反复重装的中级工程师也适合想用虚拟机先跑通全流程再上生产的老手。下面我按自己踩过坑的顺序把这份文档拆成能照着敲的步骤。2. 装之前先把账算清节点、网络、存储三张规划表RAC 安装失败十有八九不是命令敲错而是规划阶段就埋了雷。我见过太多人上来就挂 ISO 装系统结果到 gridSetup.sh 那一步才发现网卡名对不上、SCAN IP 和 VIP 不在同一网段、ASM 磁盘权限是 root:root。所以这一章先把三张表定死后面所有操作都围绕它们展开。2.1 节点与操作系统基线CentOS 7.9 最小化安装后必须补的包两台节点我一般命名为 rac1 和 rac2内存不低于 8G虚拟机建议 12G 起否则 GI 安装时内存检查会告警系统盘 100G另外每台挂两块网卡。CentOS 7.9 用最小化安装装完先做基线配置。下面这段是所有节点都要执行的我把它写成一个脚本避免两台机器手抖敲出差异。# 关闭防火墙和 SELinuxRAC 环境里这两个是头号玄学来源 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config # 安装 GI 和 DB 依赖包缺一个后面都会报 ins-13001 yum install -y bc binutils compat-libcap1 compat-libstdc-33 \ elfutils-libelf-devel fontconfig-devel glibc-devel glibc-devel.i686 \ ksh libaio libaio-devel libX11 libXau libXi libXtst libXrender \ libXrender-devel libgcc libstdc libstdc-devel make net-tools \ nfs-utils python python-configshell python-rtslib python-six \ smartmontools sysstat unzip xorg-x11-utils xorg-x11-xauth # 关闭透明大页和 NUMA 平衡这两个不关后面实例会莫名卡顿 echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag逻辑说明防火墙和 SELinux 在 RAC 里会拦截 CSSD 心跳和 ASM 通信必须关。依赖包列表是 Oracle 19C 官方要求的合集compat-libstdc-33 在 CentOS 7.9 的 base 源里可能没有需要挂本地 ISO 或配置 vault 源。透明大页THP会导致 Oracle 出现“幽灵延迟”NUMA 平衡在双节点虚拟化环境里容易让 GI 心跳超时所以一并处理。参数上如果你用的是 VMware还要在虚拟机高级设置里加vmxnet3网卡并关闭内存气球驱动否则网络抖动会让 CRS 频繁重启。2.2 网络规划public、private、VIP、SCAN 四类地址怎么分RAC 的网络是新手最容易翻车的地方。我一般用两张网卡ens33 做 publicens34 做 private。地址规划如下表你照着填自己的网段即可。用途节点 rac1节点 rac2说明public IP192.168.56.11192.168.56.12对外服务和 VIP 同网段private IP10.10.10.1110.10.10.12心跳专用不要和 public 混用VIP192.168.56.101192.168.56.102故障时漂移必须未被占用SCAN IP192.168.56.200同一地址单 SCAN 即可多 SCAN 需 DNSSCAN 端口15211521默认即可配置 hosts 文件时两台机器必须完全一致包括顺序。我习惯把 public、private、VIP、SCAN 全部写进去并在 rac1 上额外加一行192.168.56.11 rac1的本地解析。private 网卡建议用独立交换机或 VMware 的“仅主机”模式不要走 NAT否则心跳延迟会触发CRS-1614告警。另外/etc/resolv.conf里如果配了不可达的 DNSGI 安装时会卡在“检查 DNS”很久建议先注释掉装完再恢复。2.3 共享存储ASM 磁盘用 udev 绑定还是 ASMLibOracle 19C 在 CentOS 7.9 上我强烈建议用 udev 绑定ASMLib 在 7.9 上已经不太维护而且多一层依赖就多一个故障点。共享存储可以是 iSCSI、NFS 或者 VMware 的共享磁盘。以 VMware 为例给两台虚拟机各加一块 20G 的共享磁盘SCSI 控制器选“物理”模式磁盘模式选“独立-持久”。然后在系统里用lsblk看到类似 sdb 的设备。# 获取磁盘 WWID两台机器必须一致 /usr/lib/udev/scsi_id -g -u -d /dev/sdb # 编辑 udev 规则绑定为 asm-ocr 和 asm-data cat /etc/udev/rules.d/99-oracle-asmdevices.rules EOF KERNELsd*, SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id -g -u -d /dev/\$name, RESULT36000c29a1b3c4d5e6f7a8b9c0d1e2f3a, SYMLINKasm-ocr, OWNERgrid, GROUPasmadmin, MODE0660 EOF # 重新加载并验证 udevadm control --reload-rules udevadm trigger --typedevices --actionchange ls -l /dev/asm-ocr逻辑说明scsi_id取到的 WWID 是磁盘唯一标识两台节点必须相同否则 udev 规则不生效。RESULT里填你实际取到的值SYMLINK是给 ASM 用的稳定路径。OWNER 和 GROUP 要等 grid 用户和 asmadmin 组创建后再改这里先写占位。参数上MODE 必须是 0660否则 ASM 实例启动时会报权限不足。如果你用 NFS则跳过 udev直接在 GI 安装时选 NFS 路径但 NFS 的mount选项要加rw,bg,hard,nointr,rsize1048576,wsize1048576,tcp,actimeo0否则 ASM 会认为磁盘不可靠。3. 用户、内核参数与 GI 安装从 gridSetup.sh 到 root.sh 跑完规划做完这一章进入真正的安装动作。RAC 安装分两大步先装 Grid InfrastructureGI再装 Database 软件。GI 装完集群就起来了数据库软件只是挂上去。很多人卡在 root.sh 报错其实前面用户和内核参数配好后面就顺了。3.1 创建 grid 和 oracle 用户组关系与资源限制用户和组的创建顺序有讲究grid 用户要属于 asmadmin、asmoper、asmdba 组oracle 用户要属于 asmdba、dba、oper 组。两台节点都要执行且 UID/GID 必须一致。# 创建组GID 自定义但两台必须相同 groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper groupadd -g 54324 asmadmin groupadd -g 54325 asmoper groupadd -g 54326 asmdba # 创建 grid 用户 useradd -u 54321 -g oinstall -G asmadmin,asmdba,asmoper,dba grid # 创建 oracle 用户 useradd -u 54322 -g oinstall -G dba,asmdba,oper oracle # 设置密码两台保持一致 echo grid | passwd --stdin grid echo oracle | passwd --stdin oracle逻辑说明oinstall 是 Oracle 清单组dba 是数据库管理组asmadmin 是 ASM 管理员组。grid 用户必须属于 asmadmin 才能管理 ASM 磁盘。UID/GID 两台一致是为了 NFS 和共享存储权限不混乱。密码用--stdin设置是为了脚本化生产环境请用强密码。接下来配置资源限制编辑/etc/security/limits.conf追加以下内容两台都要。cat /etc/security/limits.conf EOF grid soft nofile 1024 grid hard nofile 65536 grid soft nproc 2047 grid hard nproc 16384 grid soft stack 10240 grid hard stack 32768 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 EOF参数说明nofile 是打开文件数RAC 里 ASM 和 CSSD 会开大量文件句柄65536 是底线。nproc 是进程数16384 够用。stack 是栈大小10240 起步。改完用ulimit -a验证注意要重新登录才生效。另外/etc/pam.d/login里要加session required pam_limits.so否则 limits.conf 不生效这是 CentOS 7.9 的一个常见坑。3.2 内核参数与 ASM 设备权限sysctl 配置和 udev 收尾内核参数直接决定 GI 能不能启动。编辑/etc/sysctl.conf追加以下内容两台执行后sysctl -p生效。cat /etc/sysctl.conf EOF fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 2097152 kernel.shmmax 4294967295 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 EOF sysctl -p逻辑说明kernel.shmmax要大于物理内存的一半4294967295 是 4G 减 1适合 8G 内存的虚拟机。kernel.sem四个值分别是 SEMMSL、SEMMNS、SEMOPM、SEMMNIRAC 里信号量不够会导致ORA-27300。fs.aio-max-nr是异步 IO 请求数ASM 依赖它。改完内核参数后回到 2.3 节的 udev 规则把 OWNER 和 GROUP 改成 grid:asmadmin然后重新触发 udev确认/dev/asm-ocr的属主是 grid:asmadmin 且权限 0660。3.3 解压 GI 并运行 gridSetup.sh响应文件与 root.sh 执行顺序把 LINUX.X64_193000_grid_home.zip 上传到 rac1 的/u01/app/19.3.0/grid解压后以 grid 用户运行gridSetup.sh。我一般用静默模式因为图形界面在虚拟机里容易卡。先生成响应文件再执行安装。# 以 grid 用户解压 mkdir -p /u01/app/19.3.0/grid chown -R grid:oinstall /u01/app cd /u01/app/19.3.0/grid unzip -q LINUX.X64_193000_grid_home.zip # 生成响应文件模板 ./gridSetup.sh -record -destinationFile /tmp/grid_install.rsp然后编辑/tmp/grid_install.rsp关键参数如下表。参数值说明oracle.install.optionCRS_CONFIG安装集群ORACLE_BASE/u01/app/gridgrid 的 baseoracle.install.asm.OSDBAasmdbaASM 管理组oracle.install.asm.OSASMasmadminASM 管理员组oracle.install.asm.diskGroup.nameOCR第一个磁盘组oracle.install.asm.diskGroup.disks/dev/asm-ocrudev 路径oracle.install.asm.diskGroup.redundancyEXTERNAL虚拟机环境用外部冗余oracle.install.crs.config.clusterNodesrac1:rac1-vip:HUB,rac2:rac2-vip:HUB节点和 VIPoracle.install.crs.config.networkInterfaceListens33:192.168.56.0:1,ens34:10.10.10.0:5public 和 privateoracle.install.crs.config.scanTypeLOCAL_SCAN单 SCANoracle.install.crs.config.SCANAddresses192.168.56.200SCAN IP执行静默安装./gridSetup.sh -silent -responseFile /tmp/grid_install.rsp -waitforcompletion逻辑说明-waitforcompletion让安装进程前台等待方便看日志。安装到 80% 左右会提示在两个节点分别以 root 执行/u01/app/19.3.0/grid/root.sh。注意顺序先在 rac1 执行等它跑完再在 rac2 执行不要同时跑。root.sh 会配置 CSSD、启动 OHASD、注册 ASM。如果卡在CRS-2674或CRS-2800多半是 private 网卡不通或 udev 权限不对。跑完后用crsctl stat res -t检查所有资源应该是 ONLINE。4. 数据库软件安装与建库dbca 静默建 RAC 实例GI 跑起来后数据库软件安装就简单很多。这一章把 db 软件装到/u01/app/oracle/product/19.3.0/dbhome_1然后用 dbca 建一个 RAC 数据库。我习惯用静默方式因为响应文件可以复用。4.1 安装 Database 软件响应文件里的三个易错项以 oracle 用户解压 LINUX.X64_193000_db_home.zip 到 dbhome_1然后运行runInstaller。mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1 chown -R oracle:oinstall /u01/app/oracle cd /u01/app/oracle/product/19.3.0/dbhome_1 unzip -q LINUX.X64_193000_db_home.zip # 生成响应文件 ./runInstaller -record -destinationFile /tmp/db_install.rsp编辑响应文件三个易错项oracle.install.option要选INSTALL_DB_SWONLYoracle.install.db.InstallEdition选EEoracle.install.db.CLUSTER_NODES填rac1,rac2。另外oracle.install.db.isRACOneInstall选 false。执行./runInstaller -silent -responseFile /tmp/db_install.rsp -waitforcompletion装完同样在两个节点执行root.sh这次是/u01/app/oracle/product/19.3.0/dbhome_1/root.sh。顺序还是先 rac1 后 rac2。跑完后用sqlplus / as sysdba能进空闲实例就说明软件层 OK。4.2 dbca 静默建库字符集、内存与 ASM 数据盘建库前先在 ASM 里创建一个 DATA 磁盘组用 asmca 或者直接 sqlplus 连 ASM 实例。我一般用 asmca 静默asmca -silent -createDiskGroup -diskGroupName DATA \ -diskList /dev/asm-data -redundancy EXTERNAL -au_size 4然后生成 dbca 响应文件dbca -silent -createDatabase -templateName General_Purpose.dbc \ -gdbName racdb -sid racdb -responseFile /tmp/dbca.rsp响应文件里关键参数characterSet选AL32UTF8totalMemory给 4096虚拟机 12G 内存的话storageType选ASMdiskGroupName填DATArecoveryGroupName可以填DATA或单独建 FRA。建库过程会跑 20 分钟左右期间可以用tail -f看/u01/app/oracle/cfgtoollogs/dbca/racdb/racdb.log。建完后srvctl status database -d racdb应该显示两个实例都 running。5. 避坑与排查RAC 安装里最耗时的五个“玄学”问题这一章是我自己重装过十几次后总结的每条都按“现象 → 原因 → 解决”写。你如果卡住了先来这里对号入座。5.1 root.sh 在 rac2 上报 CRS-2674现象rac1 的 root.sh 跑完正常rac2 跑到一半报CRS-2674: Start of ora.cssd on rac2 failed。原因private 网卡不通或者 rac2 的 hosts 文件里 rac1 的 private IP 解析不对。解决先在 rac2 上ping 10.10.10.11如果不通检查 VMware 的“仅主机”网卡是否连到同一虚拟交换机。如果通检查/etc/hosts顺序确保 private IP 在 public IP 之后但 SCAN 之前。还不行就crsctl stop crs -f然后重新跑 root.sh。5.2 ASM 磁盘组挂载失败报 ORA-15018现象GI 装完asmcmd lsdg看不到 OCR 磁盘组或者crsctl stat res -t里 ora.asm 是 INTERMEDIATE。原因udev 规则没生效或者磁盘权限是 root:root。解决ls -l /dev/asm-ocr确认属主是 grid:asmadmin权限 0660。如果不是检查 udev 规则里的 WWID 是否两台一致udevadm trigger后重新插拔磁盘。另外如果用了多路径要确保/etc/multipath.conf里 blacklist 了本地磁盘否则 ASM 会看到重复设备。5.3 dbca 建库卡在 45%日志报 ORA-15041现象dbca 跑到 45% 不动日志里ORA-15041: diskgroup space exhausted。原因DATA 磁盘组太小或者 AU 大小设成了 1M 但磁盘只有 20G。解决虚拟机环境给 DATA 至少 40GAU 用 4M。如果已经建了磁盘组用asmcmd加盘或者重建。重建前先srvctl stop database -d racdb然后asmca -silent -deleteDiskGroup -diskGroupName DATA再加盘重建。5.4 VIP 无法漂移故障转移不生效现象手动crsctl stop res ora.rac1.vip后VIP 没有漂到 rac2应用连接超时。原因VIP 和 public IP 不在同一网段或者 SCAN 监听没配。解决srvctl config vip -n rac1检查 VIP 地址必须和 public 同网段。另外srvctl status scan_listener要确保 SCAN 监听在跑。如果用的是 LOCAL_SCANSCAN VIP 也要能漂。最后用srvctl relocate vip -n rac1测试漂移。5.5 实例间心跳延迟高CRS 频繁重启现象crsctl stat res -t里 ora.cssd 偶尔变成 OFFLINE日志报CRS-1614: heartbeat delay。原因private 网卡走了 NAT 或者被其他流量占用。解决private 网卡必须独立不要配网关不要跑 NFS 或备份流量。如果是 VMware把 private 网卡绑到独立虚拟交换机并关闭“内存气球”和“TSO”。另外net.core.rmem_max和wmem_max按 3.2 节调大。6. 装完之后怎么验证三个能让你睡好觉的检查动作装完 RAC 只是开始真正要确认它“能扛事”得做几个破坏性验证。我一般按下面三步走每步都有明确的通过标准。第一步资源状态全绿。crsctl stat res -t输出里ora.asm、ora.cssd、ora.diskmon、ora.rac1.vip、ora.rac2.vip、ora.scan1.vip、ora.racdb.db 全部是 ONLINE且 ora.racdb.db 的两个实例分别在不同节点。如果有一个是 INTERMEDIATE等 30 秒再看还不变就查对应日志。第二步故障转移实测。在 rac1 上crsctl stop res ora.rac1.vip -n rac1然后立刻在 rac2 上crsctl stat res ora.rac1.vip -t应该看到它漂到 rac2 并变成 ONLINE。再srvctl relocate database -d racdb -n rac2把数据库实例从 rac1 挪到 rac2用srvctl status database -d racdb确认。这一步能过说明 VIP 和实例的漂移逻辑都正常。第三步ASM 和数据库连通性。用asmcmd lsdg看 DATA 和 OCR 的state是 MOUNTEDtype是 EXTERN。然后sqlplus sys/passwordracdb1 as sysdba和racdb2都能连执行select instance_name, host_name from v$instance;应该分别返回 racdb1/rac1 和 racdb2/rac2。最后建个测试表create table t1(id number);在两个实例都能查到说明缓存融合正常。我自己的习惯是每次装完 RAC先不急着上业务而是用 Swingbench 或者简单的oracle脚本跑 10 分钟并发观察crsctl stat res -t有没有抖动。如果 10 分钟内资源状态稳定VIP 不漂ASM 不告警这套环境才算真正可用。血泪经验是虚拟机环境里内存给够、private 网卡独立、udev 权限对这三条做到了RAC 安装就没什么玄学。希望帮到你。本文还有配套的精品资源点击获取