第一次在纯远程环境里部署 Oracle 19c RAC 时,我面前只有一台带 SSH 的跳板机,机房物理 console 约不到,VNC 又因为网段隔离慢到没法用。当时几乎没犹豫,直接选了 Oracle 19c RAC 静默安装。后来整套流程跑下来,这个选择不仅省掉了半小时以上的窗口点击,还把整个部署过程变成了一份可重复执行的配置清单。这篇文章就是按我当时实操顺序整理出来的完整记录,内容包括前置环境、响应文件解读、GI/DB/DBCA 三步安装以及最后的排障方法,适合需要在多节点 Linux 服务器上重复部署 RAC 的 DBA 和运维同学参考。
1. 为什么我一开始就锁定静默安装,而不是图形界面
1.1 静默安装到底解决了什么问题
很多人听到“静默安装”第一反应是:是不是就是无人值守、不用管、跑完就行。其实不完全是。Oracle 19c RAC 的静默安装,本质上是把图形安装向导里的每一步交互,提前写进一个文本响应文件里,由安装程序按字段逐项读取并执行。换句话说,你只是把“鼠标点选”换成了“写配置文件”,安装过程的每个环节仍然在,一个都没少。
这带来一个很实际的好处:配置本身可以被版本化管理。响应文件放在 Git 仓库里,谁改过、为什么改,全部留痕。我后来在测试环境和生产环境之间复制同样的集群架构时,只需要把响应文件里的主机名、IP、磁盘路径替换掉,跑一遍命令就行,不用再对着图形界面回忆“上次到底选了哪个选项”。
静默安装真正适合的场景,我总结下来就三类:
- 机房远程操作,图形通道不可用或者慢到影响效率;
- 需要反复部署多套结构相同的 RAC,比如一主多备、多套测试环境;
- 想要把安装动作集成到脚本化运维平台里去,减少人工介入。
如果你只是装一台实验环境,而且服务器就在手边,图形安装完全没毛病。但如果你面对的是生产环境批量交付,静默安装几乎是唯一靠谱的路。
1.2 静默安装和图形安装的差异:不只是省一次鼠标点击
用一张表来说明两者在实际工作中的差别:
| 对比维度 | 图形安装 | 静默安装 |
|---|---|---|
| 前置要求 | 需要 X11、VNC 或本地图形环境 | 只需要 SSH 终端 |
| 交互次数 | 全程 20 步以上点击 | 0 次,全部在响应文件里 |
| 可重复性 | 每次都要人工重新点击 | 同一配置可反复执行 |
| 排错复杂度 | 弹出窗口即时反馈 | 完全依赖日志定位 |
| 对执行者要求 | 熟悉界面选项即可 | 必须理解每个配置项含义 |
从表面看,静默安装省的是时间,实际上省的是“人”。图形安装中,真正容易出错的往往不是最后一步点“Install”,而是前面几页里那些不起眼的下拉框:选错了磁盘组冗余级别、漏掉了某个节点、把专用网卡和公共网卡顺序搞反,这些错误在图形界面里会被默认值掩盖。响应文件则强制你把每一个参数都显式写出来,反而不容易漏。
当然,静默安装也有代价。最大的问题是出错时没有直观提示,你需要去翻安装日志,并且要熟悉日志路径。这个内容我会在后面的排障部分专门讲。
1.3 实际执行前我会先确认的几件事
再往下走之前,先说说我在做任何安装动作之前都会确认的东西,这也是避免做到一半才发现问题的基础:
- 安装介质完整:19c Grid Infrastructure 和 Database 的安装包都解压好了,目录可读;
- 节点时间同步:NTP 或 chrony 已配置,两节点时间差控制在分钟级以内;
- SSH 互信:grid 用户和 oracle 用户在节点之间能免密登录,这是静默安装往多节点分发软件的前提;
- 磁盘和共享卷:ASM 磁盘已经映射并且权限正确,至少一块磁盘组用于 OCR/Voting File,一块用于数据文件。
这些项目看着基础,但每一条都有人在最后一步翻过车。后面每个环节我会再展开。
2. 前置环境,照做就不会在最后一步翻车
2.1 主机规划与域名解析
先说我常用的规划方式。两个节点,公共网卡 eth0,私有网卡 eth1,扫描地址用一个独立 IP。以下是我的 /etc/hosts 片段,注意私有地址段要与公共网络严格分开:
192.168.10.11 racnode01.localdomain racnode01 192.168.10.12 racnode02.localdomain racnode02 192.168.10.21 racnode01-vip.localdomain racnode01-vip 192.168.10.22 racnode02-vip.localdomain racnode02-vip 192.168.10.100 rac-scan.localdomain rac-scan 192.168.11.11 racnode01-priv.localdomain racnode01-priv 192.168.11.12 racnode02-priv.localdomain racnode02-priv要点有两个。第一,主机名不能随便起,必须与节点名保持对应关系,否则后面 clusterNodes 参数写起来会很别扭。第二,扫描地址我建议直接写进 hosts 文件,而不是依赖 DNS。虽然官方推荐用 DNS 解析 SCAN,但很多人实际环境里的 DNS 并没有配置好正向和反向解析,一旦依赖 DNS 而条件不满足,安装会直接报错。先把 SCAN 写进 hosts 跑通一件事,比在 DNS 上纠缠一整天要实在。
如果一定要用 DNS,至少确认nslookup rac-scan和dig -x <scan-ip>都能返回正确结果。SCAN 解析不通过,gridSetup.sh 在预检查阶段就会卡住。
2.2 用户、组和目录权限
安装 19c RAC 需要两组不同的用户:grid 用户负责 Grid Infrastructure,oracle 用户负责数据库软件。常见的操作系统用户组分工如下:
| 用户 | 主组 | 辅助组 | 用途 |
|---|---|---|---|
| grid | oinstall | dba, oper, asmadmin, asmdba, asmoper | 管理 GI、ASM |
| oracle | oinstall | dba, oper, backupdba, dgdba, kmdba, racdba | 管理数据库软件 |
对应创建命令大致是:
groupadd -g 1001 oinstall groupadd -g 1002 dba groupadd -g 1003 oper groupadd -g 1004 backupdba groupadd -g 1005 dgdba groupadd -g 1006 kmdba groupadd -g 1007 racdba groupadd -g 1008 asmadmin groupadd -g 1009 asmdba groupadd -g 1010 asmoper useradd -g oinstall -G dba,oper,asmadmin,asmdba,asmoper grid useradd -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle目录权限方面,我通常把 Grid 软件放在/u01/app/grid,数据库软件放在/u01/app/oracle/product/19.0.0/dbhome_1,库存目录统一用/u01/app/oraInventory。目录归属要求:
mkdir -p /u01/app/grid mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1 chown -R grid:oinstall /u01/app/grid chown -R oracle:oinstall /u01/app/oracle很多静默安装失败发生在预检查阶段,报错内容是权限组不存在或者目录不可写。比如常见的PRVG-1001,就是因为我漏建了 asmadmin 组。建议在执行安装脚本前,先逐项核对组和目录。
2.3 内核参数、资源限制与共享内存
19c 对内核参数有默认要求,我一般直接在/etc/sysctl.d/96-oracle.conf里写入以下典型的配置值,然后执行sysctl --system:
fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 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 = 4194304需要提醒的是,shmmax 不要盲目照抄,要根据物理内存来设定,建议至少覆盖 SGA 需求的一半以上。至于透明大页,建议直接关闭,因为数据库在透明大页场景下容易出现性能抖动,这个在安装阶段不改,上线之后再调整就痛苦了。
资源限制配置在/etc/security/limits.d/oracle-database.conf:
grid soft nproc 2047 grid hard nproc 16384 grid soft nofile 1024 grid hard nofile 65536 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536这些限制如果不配,安装阶段一般不会立刻报错,但后续数据库跑起来后会出现进程数不够、句柄耗尽这类问题。既然是静默安装一遍过,这些前置项就一次性配到位。
2.4 共享存储与 ASM 磁盘权限
共享磁盘是 RAC 的命根子。我的习惯是把多块共享 LUN 通过 multipath 映射为/dev/mapper/asm-data01这类稳定路径,再用 udev 规则固定属主和权限:
# /etc/udev/rules.d/99-oracle-asm.rules KERNEL=="dm-*", ENV{DM_NAME}=="asm-data01", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="dm-*", ENV{DM_NAME}=="asm-data02", OWNER="grid", GROUP="asmadmin", MODE="0660"写完规则后执行udevadm control --reload-rules && udevadm trigger,然后确认ls -l /dev/mapper/asm-data*的权限是grid:asmadmin 0660。
这里有一个经验:ASM 磁盘权限在静默安装阶段非常容易出现“扫描不到磁盘”的问题。原因通常是 udev 规则没生效,或者磁盘设备名在两个节点上不一致。所以我会在安装前先把两个节点的/dev/mapper下的设备都列出来对比一遍,确保完全一致,再开始安装。
3. 一份能跑通的 Grid 响应文件是安装成功的关键
3.1 响应文件从哪里来
静默安装的响应文件并不是凭空写的。Oracle 在安装介质里提供了模板,路径通常在:
# Grid Infrastructure 模板 $GRID_HOME/assistants/rsp/grid_install.rsp # 数据库软件安装模板 $ORACLE_HOME/assistants/rsp/db_install.rsp实际工作中,我很少从头开始写响应文件,都是先把模板复制出来,再按当前环境修改。这里有一个坑:模板里的注释很多,字段与字段之间有空行,复制到服务器上后如果用了不同的换行符或者引入多余空格,可能会导致解析失败。建议复制到 Linux 环境后用dos2unix处理一遍,再统一保存。
3.2 grid_install.rsp 的关键字段
下面是一份我实际用过的 Grid 响应文件的核心内容,字段值已经替换成了通用占位符:
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0 oracle.install.option=CRS_CONFIG ORACLE_HOSTNAME=racnode01 INVENTORY_LOCATION=/u01/app/oraInventory oracle.install.asm.OSDBA=asmdba oracle.install.asm.OSOPER=asmoper oracle.install.asm.OSASM=asmadmin oracle.install.asm.SYSASMPassword=YourStrongPwd oracle.install.asm.monitorPassword=YourMonitorPwd oracle.install.crs.config.clusterName=rac-cluster oracle.install.crs.config.gpnp.enable=true oracle.install.crs.config.autoConfigureClusterScope=true oracle.install.crs.config.clusterNodes=racnode01:racnode01-vip:racnode01-priv,racnode02:racnode02-vip:racnode02-priv oracle.install.crs.config.networkInterfaceList=eth0:192.168.10.0:1,eth1:192.168.11.0:2 oracle.install.asm.diskGroup.name=DATA oracle.install.asm.diskGroup.redundancy=EXTERNAL oracle.install.asm.diskGroup.AUSize=4 oracle.install.asm.diskGroup.disks=/dev/mapper/asm-data01,/dev/mapper/asm-data02 oracle.install.asm.diskGroup.diskDiscoveryString=/dev/mapper/asm-*逐行说说重点。
oracle.install.crs.config.clusterNodes的格式是“节点名:VIP名:私有节点名”,多个节点用逗号分隔。节点名必须与 /etc/hosts 里一一对应,VIP 名也是,不建议这里写 IP,否则后面容易在名称解析上出错。
networkInterfaceList的格式是“网卡名:子网:接口类型”。类型 1 代表公共网卡,2 代表私有网卡。这里最容易踩的坑是两个节点的网卡名必须一致,也就是说两个节点都用 eth0 做公共网卡、eth1 做私有网卡。如果一台是 eth0 另一台是 ens192,预检查就会报错,即使 IP 网络完全能通也白搭。
diskGroup.name、redundancy、disks是 ASM 磁盘组定义。redundancy=EXTERNAL表示外部冗余,适用于底层存储已经做了 RAID 的情况。如果底层是普通磁盘没有保护,至少要选择 NORMAL。AUSize 单位是 MB,默认 4MB 对大多数场景都够用。
这里有一个细节:安装程序会自动用第一块磁盘组作为 OCR 和 Voting File 的存放位置。也就是说,如果这张盘坏了,集群就没了。所以我个人建议在配置里单独分一组 FRA 或者单独建 OCR 磁盘组,不要把所有鸡蛋放一个篮子里。静默安装只允许在响应文件里配置一个磁盘组,后续可以在安装完成后再用asmca或者asmcmd添加其他磁盘组。
3.3 数据库软件安装响应文件 db_install.rsp
数据库软件安装的响应文件比 Grid 简单得多。核心字段如下:
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0 oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 oracle.install.db.ClusterEdition=CLUSTER oracle.install.db.InstallEdition=EE oracle.install.db.OSDBA=dba oracle.install.db.OSBACKUPDBA=backupdba oracle.install.db.OSDGDBA=dgdba oracle.install.db.OSKMDBA=kmdba oracle.install.db.OSRACDBA=racdba oracle.install.db.rootconfig.executeRootScript=false注意两点。
第一,oracle.install.option=INSTALL_DB_SWONLY表示只安装软件,不建库。建库的动作我后面单独用 DBCA 静默模式来做,这样职责分离,出问题时好定位。
第二,oracle.install.db.rootconfig.executeRootScript=false是让安装程序不要把 root 脚本执行过程自动托管,而是等我们把脚本手动跑在两台节点上。这里没有绝对标准,有的团队喜欢自动执行,我习惯手动执行,因为可以在 root.sh 执行时观察输出,发现问题时立刻处理。
4. 实测静默安装完整流程:GI、DB、DBCA 三步跑完
4.1 第一步:用 gridSetup.sh 部署 Grid Infrastructure
在所有前置检查通过之后,先切到 grid 用户,在节点一上执行:
cd /u01/grid ./gridSetup.sh -silent -responseFile /u01/stage/grid_install.rsp -ignorePrereq命令里的-ignorePrereq表示忽略非关键预检查警告。如果你对前置环境非常有信心,可以用这个参数跳过交互确认环节;如果不想忽略,就不要加这个参数,让安装程序自动检查并报告问题。
执行后,安装程序会依次完成以下动作:
- 在节点一解压并安装 Grid 软件;
- 把安装文件复制到其他节点;
- 执行远程配置工作;
- 提示你以 root 用户在两台节点上执行脚本。
等到终端出现类似“可以执行 root.sh”的提示时,会停下来等待。如果你没有执行 root 脚本,安装不会继续。这是静默安装给人的第一个错觉:“是不是卡死了?”其实不是,是在等你手动跑脚本。
4.2 并行跑 root.sh:这一步最容易卡住
在节点一执行:
cd /u01/app/oraInventory ./orainstRoot.sh cd /u01/app/grid ./root.sh节点二同样执行一遍,两边的 root.sh 可以并行。root.sh 会创建 OCR、启动 OHAS、注册集群资源,过程通常需要几分钟到十几分钟不等。执行期间看到的输出里会有clscfg、ocrconfig、crsctl这些关键词。
这里有几个必须留意的点。
第一,root.sh 失败后不要盲目重试。先看日志,位置通常在$GRID_HOME/install/root_<hostname>.log,日志会明确告诉你是哪一步失败,比如 DNS 解析、磁盘权限、防火墙策略。盲目重试只会让 OCR 状态更乱。
第二,node1 的 root.sh 跑完后,node2 再跑时如果报错提示 node1 资源没有 startup,通常是因为 node1 集群还没有完全 ready。这很正常,稍等一会儿再重试 node2 的 root.sh 即可。
第三,如果集群里之前装过其他 RAC 或者做过恢复测试,可能导致 OCR 残留在某个磁盘上,此时 root.sh 可能报PROT-9之类的错误。遇到这种残留问题,需要用 root 执行$GRID_HOME/crs/install/rootcrs.pl -deconfig -force清理旧配置,再重新跑 root.sh。
两台节点的 root.sh 都成功后,回到节点一继续等待安装程序完成剩余配置。安装成功后会看到类似“Grid Infrastructure configuration completed”的提示。此时可以用crsctl check cluster -all初步验证。
4.3 第二步:用 runInstaller 安装数据库软件
GI 部署完成后,切到 oracle 用户,在节点一执行:
cd /u01/oracle/database ./runInstaller -silent -responseFile /u01/stage/db_install.rsp -ignorePrereq这次安装同样会把软件分发到所有节点,完成后会提示在每台节点上执行 root 脚本:
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh注意这个 root.sh 和 Grid 的 root.sh 不一样,一个是 ORACLE_HOME 下的,一个是 GRID_HOME 下的。很多第一次做的人,看到终端出现 root.sh 就直接去之前那个目录找了,白忙活半天。
数据库软件完成之后,/u01/app/oracle/product/19.0.0/dbhome_1/bin下会生成sqlplus、dbca、srvctl等工具,但此时还没有真正的数据库实例。
4.4 第三步:DBCA 静默建库
这是整个流程里最接近“一键完成”的一步。在节点一上以 oracle 用户执行:
dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl -sid orcl \ -sysPassword YourSysPwd \ -systemPassword YourSystemPwd \ -createAsContainerDatabase true \ -numberOfPDBs 1 \ -pdbName orclpdb \ -pdbAdminPassword YourPdbPwd \ -storageType ASM \ -diskGroupName DATA \ -recoveryAreaDestination RECO \ -recoveryAreaSize 40960 \ -nodelist racnode01,racnode02说明几个参数:
-gdbName是全局数据库名,-sid是实例名前缀。RAC 场景下,两个节点的实例会分别叫 orcl1、orcl2。-storageType ASM表示数据文件放在 ASM 磁盘组 DATA 上。-recoveryAreaDestination是快速恢复区的磁盘组,我这里用的是 RECO,建议提前用asmca创建好。如果没有,也可以先不指定,后续再补,但不指定就会少一层保护。-createAsContainerDatabase true表示创建 CDB,这是 19c 的默认推荐结构,除非有特殊兼容要求,否则建议保留。
执行过程中,DBCA 会在两个节点并行创建实例,并自动通过 SRVCTL 注册数据库资源。结束后可以用srvctl status database -d orcl查看状态,应该看到两个实例都处于 Online。
4.5 如果中途失败,重装前必须做的清理
静默安装失败后直接重跑,是很多人反复折腾的根源。我踩过几次之后,养成了一个固定习惯:失败后先定位原因,再做一次系统性清理,然后再重装。
简单的清理流程如下:
# 1. 先把集群资源停掉(如果已经起了一部分) crsctl stop cluster -all crsctl stop crs # 2. 以 root 在每台节点执行配置卸载 $GRID_HOME/crs/install/rootcrs.pl -deconfig -force -verb # 3. 删除软件目录和库存目录 rm -rf /u01/app/grid rm -rf /u01/app/oracle/product/19.0.0/dbhome_1 rm -rf /u01/app/oraInventory # 4. 清理残留配置 rm -rf /etc/oracle rm -rf /var/tmp/.oracle rm -f /etc/oraInst.loc注意,ASM 磁盘组里如果已经初始化过 OCR,单纯删目录是清理不干净的。rootcrs.pl -deconfig的作用就是把这部分残留抹掉。如果你跳过了它,第二次 root.sh 几乎一定会在 OCR 初始化阶段报错,到时候问题就从“软件没装好”变成“旧集群没卸干净”,排查难度直接上一个台阶。
5. 安装完成后的集群体检,以及几个我踩过的坑
5.1 最基本的集群与数据库状态检查
完成安装后,不要急着把服务器交付出去。先做一轮体检,我每次必跑的命令如下:
crsctl check cluster -all crsctl check crs crsctl stat res -t asmcmd lsdg srvctl status database -d orcl srvctl config database -d orclcrsctl check cluster -all会返回 Online 状态,crsctl stat res -t可以看到资源明细,重点确认 ora.DATA.dg、ora.RECO.dg、ora.orcl.db 这些资源都是 ONLINE。asmcmd lsdg可以核对磁盘组的总容量和剩余空间,验证数据是否真的写到了共享存储上。
另一个容易被忽略的检查项是监听器状态。RAC 的监听资源是由 GI 管理的,检查方式:
srvctl status listener srvctl status scan如果 scan 资源没有正常注册到 DNS 或者广播到 SCAN IP,远程客户端就连不上集群。SCAN 的问题往往是 DNS 引起的,建议在客户端机器上用tnsping rac-scan:1521验证。
5.2 常见错误与排查途径
静默安装的报错不像图形界面那么友好,掌握日志位置是关键。我一般按以下顺序排查:
| 报错类型 | 日志位置 | 常见原因 |
|---|---|---|
| 预检查失败 | $GRID_HOME/cfgtoollogs/下的日志 | 组、权限、内核参数、网络接口名不一致 |
| Grid 安装卡住 | $GRID_HOME/cfgtoollogs/gridSetup/ | root.sh 未执行、远程分配节点失败 |
| root.sh 失败 | $GRID_HOME/install/root_<hostname>.log | DNS 异常、OCR 残留、磁盘访问失败 |
| DBCA 建库失败 | $ORACLE_BASE/cfgtoollogs/dbca/ | ASM 磁盘组空间不足、密码复杂度不够 |
这里反复强调日志是因为静默安装下,日志几乎是唯一的线索。有一个新人比较容易犯的错误是:看到某个报错就去搜索解决方案,但没看日志里的前后文明明已经写了具体原因。建议养成先看日志、再查网络、最后动手清理的习惯。
5.3 我实际踩过的坑:网卡名不一致和 SCAN 解析超时
分享两个我印象最深的真实问题,都是静默安装特有的坑。
第一个是网卡名不一致。两台节点的操作系统网卡命名分别是 eth0 和 ens192,我图省事,在响应文件里写了 eth0,结果预检查阶段直接报网络接口校验失败。当时还以为是防火墙或者路由问题,排查了一圈才发现是命名不一致。后来在安装规范里加了一条硬要求:两个节点的网卡名必须一致,否则先统一命名,再继续。
第二个是 SCAN 解析超时。我在一个测试环境里没有配置 DNS,直接把 SCAN 的 IP 写进了 /etc/hosts。安装倒是顺利完成了,但应用连接时出现间歇性连不上的情况。排查后发现,部分客户端把 rac-scan 解析成了多 IP 中的某一个,而这个 IP 对应的 SCAN 监听器没有完全就绪。后来我给客户端环境的 hosts 文件也统一加上了 SCAN 条目,并重启了 SCAN 监听,问题才消失。虽然 19c 的 SCAN 本身支持多个 IP,但如果你的 DNS 基础设施不够稳定,优先保证一个 SCAN IP 的简单可靠,胜过盲目追求多 IP 的负载均衡。
5.4 安装规范化的最后一点建议
我现在做 RAC 部署时,习惯把响应文件、环境检查脚本和部署命令一起打包存放。每次部署新环境,先跑环境检查脚本,再根据输出微调响应文件,最后执行安装。这套流程跑熟之后,一套双节点 19c RAC 从开始到交付,真正需要人工介入的只剩 root.sh 和 DBCA 建库那几分钟。
最后再提一个很多人都会忽略的点:安装完成后,不要急着把安装介质和响应文件删掉。响应文件里包含密码字段,注意文件权限至少要限制为属主可读写;而安装介质留着,下次添加节点、修复组件时都会用到。放在一个安全目录里,比临时翻找旧光盘要靠谱得多。