RAC 安装失败,绝大多数不是败在 runInstaller 那一步,而是败在前半程:私网和公网同网段、共享盘没做多路径、RemoveIPC 没关、大页算错、udev 权限不对。这些问题在 Grid 安装时会以 PRVF/PRVG 检查失败或 CRS 起不来的形式集中爆发,排查成本远高于提前配好。
本文是完整的一条链路:从安装规划、主机与共享存储配置、内核参数、用户与 udev,到 Grid 与 DB 软件安装、ASM 磁盘组、dbca 建 CDB/PDB,最后到建库后的参数优化和日志清理脚本。软件安装阶段给出图形化与静默两条路径,产物一致,选一条走完即可,不要混用。
环境为两节点 ora19c-rac01、ora19c-rac02,操作系统 Red Hat 7.9,数据库 19c。GI 用户 grid,数据库用户 oracle,GI Home 为 /oracle/app/19.3.0/grid,DB Home 为 /oracle/app/19.3.0/db_1,安装包统一放在 /oracle/soft。所有命令都标注了执行节点,“两个节点”表示 rac01 与 rac02 都要执行;所有 root.sh 都必须先在节点 1 跑完,再跑节点 2。
全流程执行位置
RAC 安装最常见的返工不是命令写错,而是在错误的节点执行。下表是本文所有阶段的执行位置,后文每节还会再标注一次。
| 阶段 | 执行节点 | 执行用户 |
|---|---|---|
| 上传解压 GI 包 | 节点 1 | root / grid |
| 安装 cvuqdisk | 两节点 | root |
| Grid 安装(图形化或静默) | 节点 1 | grid |
orainstRoot.sh、root.sh | 两节点,先节点 1 | root |
| 创建 ARCHDG、DATADG | 节点 1 | grid |
| Oracle DB 软件安装 | 节点 1 | oracle |
DB 的 root.sh | 两节点,先节点 1 | root |
dbca 创建 CDB/PDB | 节点 1 | oracle |
| 参数优化 | 按条目,多数要求两节点或所有容器 | oracle |
| 日志清理脚本 | 两节点 | root / grid / oracle |
1. 安装前规划
1.1 系统层面
| 维度 | 节点1 | 节点2 |
|---|---|---|
| 操作系统版本 | redhat 7.9 | redhat 7.9 |
| CPU/内存 | 4C 8G(推荐 8C 16G 以上) | 4C 8G(推荐 8C 16G 以上) |
| 主机名称 | ora19c-rac01 | ora19c-rac02 |

4C 8G 能装起来,但跑不动真实业务:Grid 的 ohasd、CSSD、ASM 加上两个实例,8G 内存下 SGA 能分到的很有限。按“8C 16G 以上”准备更稳妥。
1.2 网络层面
| 维度 | 节点1 | 节点2 | 用途 |
|---|---|---|---|
| 物理IP | 192.168.61.134 | 192.168.61.135 | 公司内部访问,非外网 |
| 心跳IP(私网) | 172.16.2.11 | 172.16.2.12 | 用于节点间心跳网络 |
| VIP | 192.168.61.136 | 192.168.61.137 | 提供客户端访问,漂移 |
| SCANIP | 192.168.61.138 | 192.168.61.138 | 提供客户端访问,负载均衡 |

四个地址段各有约束:公网与私网必须不同网段,否则 Oracle 会拒绝把该网卡识别为 private interconnect;VIP 必须与公网同网段,切换时由 ARP 接管;SCAN 也必须在公网网段,且能反向解析。这里只配了一个 SCAN IP,实验环境够用;生产环境通常配 3 个,让 SCAN 监听有冗余。
1.3 存储层面
Oracle RAC 使用 ASM 存储来存放数据,包含心跳盘、数据盘、归档盘三个磁盘组。归档盘、数据盘大小根据实际数据量大小划分。
| 磁盘名称 | 磁盘用途 | 磁盘大小 |
|---|---|---|
| asm-ocrdg01 | OCR/Voting File | 20G |
| asm-archdg01 | ARCH/Files | 40G |
| asm-datadg01 | Data/Files | 40G |

OCR/Voting 盘不需要大,但要求低延迟和高可靠;20G 对 19c 的 OCR 加三个 voting file 足够。数据盘和归档盘按业务量给,实验环境 40G 起步。
2. 主机基础配置
2.1 yum 源配置
已有可用 yum 源可跳过。网络源写法:
cat > /etc/yum.repos.d/redhat.repo << 'EOF'
[base]
name= yum repo
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
enabled=1
gpgcheck=0
EOF
没有外网时用本地镜像源:
mount /dev/cdrom /mnt
df -Th
cat <<EOF>>/etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
enabled=1
EOF
yum repolist all
两种方式按实际环境二选一,不要同时启用互相冲突的 base 源。挂载镜像后 yum repolist all 应能看到 local 仓库和包数量,数量为 0 说明挂载点或 baseurl 不对。
2.2 配置心跳 IP(私网)
节点1:
[root@ora19c-rac01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=fd9a356e-a199-4e52-b8fe-704d50fafcde
IPADDR=172.16.2.11
NETMASK=255.255.255.0
GATEWAY=192.168.61.2
DEVICE=ens33
ONBOOT=yes
[root@ora19c-rac01 ~]# systemctl restart network
节点2:
[root@ora19c-rac02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=fd9a356e-a199-4e52-b8fe-704d50fafcde
DEVICE=ens33
IPADDR=172.16.2.12
NETMASK=255.255.255.0
GATEWAY=192.168.61.2
ONBOOT=yes
[root@ora19c-rac02 ~]# systemctl restart network
改完双向 ping 验证:
[root@ora19c-rac02 ~]# ping 172.16.2.11
PING 172.16.2.11 (172.16.2.11) 56(84) bytes of data.
64 bytes from 172.16.2.11: icmp_seq=1 ttl=64 time=0.448 ms
64 bytes from 172.16.2.11: icmp_seq=2 ttl=64 time=0.306 ms
64 bytes from 172.16.2.11: icmp_seq=3 ttl=64 time=0.282 ms
[root@ora19c-rac01 ~]# ping 172.16.2.12
PING 172.16.2.12 (172.16.2.12) 56(84) bytes of data.
64 bytes from 172.16.2.12: icmp_seq=1 ttl=64 time=0.308 ms
64 bytes from 172.16.2.12: icmp_seq=2 ttl=64 time=0.323 ms
64 bytes from 172.16.2.12: icmp_seq=3 ttl=64 time=0.278 ms
这段配置有三处需要复核。
第一,两个节点的 UUID 完全相同。这是 ifcfg 里 NetworkManager 的连接标识,两台机器各自独立时一般不会因此冲突,但克隆出来的虚机保留同一个 UUID 容易在排查网卡问题时混淆,建议用 uuidgen 重新生成后替换。
第二,私网卡上写了 GATEWAY=192.168.61.2 且 DEFROUTE=yes。这会让心跳网卡也参与默认路由,两张网卡都有默认路由时由 metric 决定走向;一旦心跳流量被路由到公网卡,Oracle 可能把 ens33 判成 public,私网就白配了。私网应只保留 IPADDR、NETMASK 与 ONBOOT,GATEWAY 和 DEFROUTE 交给公网卡。
第三,这里只给出了 ens33 的配置,而规划表里 192.168.61.134/135 才是公网地址。两节点需要各自规划公网与私网两张网卡,不要把两个网段配到同一张 ens33 上;公网卡承载 public、VIP 与 SCAN,私网卡只承载 interconnect。
3. 共享存储与多路径
3.1 添加共享盘并确认设备
先在 VMware 中配置共享存储,再进系统确认。节点1:
[root@ora19c-rac01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 15G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 14G 0 part
├─rhel-root 253:0 0 12.5G 0 lvm /
└─rhel-swap 253:1 0 1.5G 0 lvm [SWAP]
sdb 8:16 0 80G 0 disk
└─sdb1 8:17 0 80G 0 part
sdc 8:32 0 20G 0 disk
sdd 8:48 0 40G 0 disk
sde 8:64 0 40G 0 disk
sr0 11:0 1 4.2G 0 rom
节点2 的 lsblk 输出与节点1 一致:sdc 20G、sdd 40G、sde 40G 为三块共享盘,sdb 为本地盘。两个节点看到的容量和设备名必须一致,不一致说明共享磁盘没挂对。
用 scsi_id 取 WWID,两个节点都要执行,且结果必须相同:
/usr/lib/udev/scsi_id -g -u -d /dev/sdc
/usr/lib/udev/scsi_id -g -u -d /dev/sdd
/usr/lib/udev/scsi_id -g -u -d /dev/sde
36000c29abee91b0f18a5032f6808d007
36000c29066009d6eefabc7c18f5d489c
36000c29223d26b4fc93a5a37543f0c64
节点2 执行同样三条命令,应得到完全相同的三个值。若某个节点读不到或值不同,先解决共享盘映射,不要继续往下做——WWID 不一致时 udev 规则和 multipath 都会错位。
3.2 安装 multipath 并确认 WWID
两个节点都需要安装:
yum install -y device-mapper*
mpathconf --enable --with_multipathd y
/usr/lib/udev/scsi_id -g -u /dev/sdc
/usr/lib/udev/scsi_id -g -u /dev/sdd
/usr/lib/udev/scsi_id -g -u /dev/sde
mpathconf 会生成 /etc/multipath.conf 并设置 multipathd 开机启动。这里不带 -d 参数取 scsi_id,输出与上一步一致。
3.3 配置 multipath.conf
两个节点配置相同。先备份再改:
cp /etc/multipath.conf /etc/multipath.conf_$(date +%F)
cat > /etc/multipath.conf << 'EOF'
defaults {
user_friendly_names yes
}
blacklist {
devnode "^sda"
}
multipaths {
multipath {
wwid "36000c29abee91b0f18a5032f6808d007"
alias asm-ocrdg01
}
multipath {
wwid "36000c29066009d6eefabc7c18f5d489c"
alias asm-archdg01
}
multipath {
wwid "36000c29223d26b4fc93a5a37543f0c64"
alias asm-datadg01
}
}
EOF
三个 alias 与磁盘用途一一对应:ocrdg01 放 OCR/Voting,archdg01 放归档,datadg01 放数据。blacklist 里只排除了 sda,本地盘 sdb 没排除;如果 sdb 也被 multipath 接管,后面在 /dev/mapper/mpatha 上做 LVM 就可能打到共享盘,建议把 "^sdb" 一并加入 blacklist,让本地盘完全不进 multipath。
3.4 激活并检查
两个节点执行:
multipath -F
multipath -v2
multipath -ll
multipath -ll 应列出三个 alias 及各自的路径状态,状态为 active/ready 才算正常。多路径不是必须的:单路径环境下可以跳过 3.2 到 3.4,直接用 /dev/sdc、/dev/sdd、/dev/sde 配 udev;但一旦配了 multipath,ASM 就应该使用 /dev/mapper/asm-* 而不是裸盘设备名。
4. 操作系统参数
4.1 hosts
两个节点都需要,内容完全一致:
cat > /etc/hosts << 'EOF'
################ Oracle RAC for pub ########################
192.168.61.134 ora19c-rac01 ora19c-rac01-pub
192.168.61.135 ora19c-rac02 ora19c-rac02-pub
################ Oracle RAC for priv #######################
172.16.2.11 ora19c-rac01-priv
172.16.2.12 ora19c-rac02-priv
################ Oracle RAC for vip ########################
192.168.61.136 ora19c-rac01-vip
192.168.61.137 ora19c-rac02-vip
################ Oracle RAC for Scan IP ####################
192.168.61.138 cj-scan
EOF
节点1 改好后直接传过去:
scp /etc/hosts [email protected]:/etc/hosts
SCAN 名称 cj-scan 必须与后面 Grid 安装时填的 SCAN 名称一致,大小写不敏感但拼写要一致。hosts 里不要留 127.0.0.1 到主机名的映射,否则 SCAN 解析可能拿到回环地址。
4.2 防火墙与 SELinux
两个节点执行:
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
getenforce
getenforce 应立即返回 Permissive,重启后为 Disabled。RAC 的私网通信、VIP 漂移、ASM 都依赖大量动态端口,实验环境直接关防火墙;生产环境若必须开启,需要按端口清单放行,而不是只开 1521。
4.3 时间同步
两个节点执行。如果有自己的 NTP 服务器,则在 /etc/chrony.conf 配置文件下改成自己的 NTP 服务域名,否则用默认配置。
timedatectl status
chronyc sources -v
两条命令分别确认 NTP 同步已启用、以及当前实际使用的源。两个节点必须指向同一时间源,且时间偏差控制在秒级以内。CSSD 对节点间时钟敏感,偏差过大会导致集群节点被驱逐,这类故障在日志里表现为节点重启而不是报错,很难事后定位。集群起来后可用 cluvfy comp clocksync -n all 复核。
4.4 avahi-daemon
两个节点执行。图形化界面默认会安装这个服务,禁用即可:
systemctl stop avahi-daemon.socket
systemctl stop avahi-daemon.service
systemctl disable avahi-daemon.socket
systemctl disable avahi-daemon.service
avahi 占用 5353 端口做零配置发现,会和 Oracle 的 mDNS 解析冲突,导致 SCAN 或 VIP 被解析到错误地址。
4.5 NOZEROCONF
两个节点执行。这是 19c 新增的一项配置要求:
-- 节点1
cat /etc/sysconfig/network
# Created by anaconda
NETWORKING=yes
HOSTNAME=ora19c-rac01
NOZEROCONF=yes
-- 节点2
cat /etc/sysconfig/network
# Created by anaconda
NETWORKING=yes
HOSTNAME=ora19c-rac02
NOZEROCONF=yes
没有这一行时,系统可能给未配置的网卡自动分配 169.254 网段地址,Oracle 会多识别出一张网卡,导致 interconnect 选错。
4.6 RemoveIPC
两个节点执行。设置了 RemoveIPC=yes 会 crash 掉 Oracle ASM 实例和 Oracle database 实例:
cat /etc/systemd/logind.conf
RemoveIPC=no
这是 systemd 的默认行为带来的坑:用户退出登录时 systemd 会清理该用户的 IPC 资源,而 Oracle 的共享内存和信号量正是挂在对应用户下。改完执行 systemctl daemon-reload 并重启 systemd-logind,或者直接重启主机。
4.7 pam.d/login
两个节点执行:
cat /etc/pam.d/login
session required pam_limits.so
session required /lib64/security/pam_limits.so
两行看似重复,实际分别对应 32 位和 64 位路径,保留即可。
4.8 limits.conf
两个节点执行。memlock 取物理内存的一半:
memlock=`awk '/MemTotal/{printf("%1.0f\n",$2/2.0)}' /proc/meminfo`
echo $memlock
cat >> /etc/security/limits.conf << EOF
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft memlock $memlock
oracle hard memlock $memlock
oracle soft stack 65536
oracle hard stack 32768
grid soft nproc 16384
grid hard nproc 16384
grid soft nofile 65536
grid hard nofile 65536
grid soft stack 65536
grid hard stack 32768
EOF
$memlock 会在写入时展开为实际值;在 8G 内存机器上按上式算得 3995032,换机器要重算。注意 grid 用户没有 memlock 条目:Grid Infrastructure 的 ASM 实例同样需要锁内存,实际部署应给 grid 也加上 soft/hard memlock,值取同一个计算结果,否则 ASM 启动或扩容时可能因无法锁页失败。
另外 stack 的软限制 65536 大于硬限制 32768,软限超过硬限不会生效,建议两者统一。
4.9 sysctl.conf 与大页
两个节点执行。大页数量按 SGA 推算,SGA 取物理内存的一半:
sga(物理内存的一半,[如物理内存为8 则sga为4]) HUGE=4*1024/2=2048
SHMALL=`awk '($1 == "MemTotal:"){print $2/4}' /proc/meminfo`
SHMMAX=`awk '/MemTotal/{printf("%1.0f\n",$2*0.8*1024)}' /proc/meminfo`
cat >> /etc/sysctl.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = $SHMALL
kernel.shmmax = $SHMMAX
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 = 1048586
net.ipv4.tcp_wmem = 262144 262144 262144
net.ipv4.tcp_rmem = 4194304 4194304 4194304
vm.min_free_kbytes=524288
kernel.panic_on_oops = 1
vm.nr_hugepages = 2048
EOF
sysctl -p
shmall=1997516、shmmax=6545460429 是 8G 内存机器的实际取值;上面的 heredoc 用 $SHMALL、$SHMMAX 代入,换环境时先执行两条 awk 重算,不要照抄数字。vm.nr_hugepages 与 HUGE 的计算结果对应:SGA 4G、每页 2M,得到 2048 页。大页配多了会挤占普通内存,配少了 SGA 用不上大页,两种情况都会让实例启动告警。
4.10 关闭透明大页与 NUMA
两个节点执行。在 GRUB_CMDLINE_LINUX 添加 numa=off transparent_hugepage=never:
[root@ora19c-rac01 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap numa=off transparent_hugepage=never rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
改完先备份再重新生成:
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_$(date +%F)
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
重启后检查:
grep -i numa /var/log/dmesg
grep HugePages /proc/meminfo
NUMA turned off
AnonHugePages: 0 kB <<<0表示已禁用transparent hugepages
关 THP 是为了避免 khugepaged 在后台合并页时造成毛刺;关 NUMA 能规避小内存虚机上跨节点分配不均的问题,但在大内存多路机器上会失去本地内存亲和性,是否关闭要按硬件规格决定。
4.11 /dev/shm 大小
两个节点执行。大小设为内存的一半。修改 /etc/fstab 中 /dev/shm 对应行,在 defaults 后加 size=4G:
tmpfs /dev/shm tmpfs defaults,rw,exec,size=4G 0 0
若 /etc/fstab 没有 /dev/shm 行,就增加上面这一行,然后在 root 下执行:
mount -o rw,remount /dev/shm
df -h /dev/shm
Oracle 用 /dev/shm 存放一些临时共享内存段,太小会在建库或并行业务时报错。4G 对应 8G 内存机器,换规格按一半调整。
5. Oracle 用户、目录与环境变量
5.1 用户与组
两个节点执行:
groupadd -g 54421 oinstall
groupadd -g 54422 dba
groupadd -g 54423 oper
groupadd -g 54424 backupdba
groupadd -g 54425 dgdba
groupadd -g 54426 kmdba
groupadd -g 54427 asmdba
groupadd -g 54428 asmoper
groupadd -g 54429 asmadmin
groupadd -g 54430 racdba
useradd -u 54321 -g oinstall -G dba,racdba,asmadmin,asmdba,asmoper -d /home/grid -s /bin/bash -c "grid Infrastructure Owner" grid
echo "Ad#0783#DBA6" | passwd --stdin grid
useradd -u 54322 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba,asmdba,asmadmin -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle
echo "Ad#0783#DBA6" | passwd --stdin oracle
UID/GID 在两个节点上必须完全一致,否则共享存储上的文件会出现属主错乱。密码是示例值,生产环境必须替换。
5.2 目录与权限
两个节点执行:
mkdir -p /oracle/app/grid
mkdir -p /oracle/app/19.3.0/grid
mkdir -p /oracle/app/db
mkdir -p /oracle/app/19.3.0/db_1
chown -R root:oinstall /oracle
chown -R grid:oinstall /oracle/app/grid
chown -R oracle:oinstall /oracle/app/db
chown -R root:oinstall /oracle/app/19.3.0
chown -R grid:oinstall /oracle/app/19.3.0/grid
chown -R oracle:oinstall /oracle/app/19.3.0/db_1
chmod -R 775 /oracle
顺序不能反:先 chown 顶层,再逐层下放给 grid 和 oracle。最后 chmod -R 775 让同组可写,Grid 安装时需要往 ORACLE_BASE 写 inventory 和诊断目录。
5.3 环境变量
两个节点执行,每个节点的 ORACLE_SID 不一样,需要自行修改。grid 用 +ASM1、+ASM2,oracle 用 dbname1、dbname2。
grid 用户:
cat >> /home/grid/.bash_profile << 'EOF'
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=+ASM1
export ORACLE_BASE=/oracle/app/grid
export ORACLE_HOME=/oracle/app/19.3.0/grid
export ORACLE_TERM=xterm
export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export EDITOR=vi
export LANG=en_US
export NLS_LANG=american_america.AL32UTF8
umask 022
EOF
oracle 用户:
cat >> /home/oracle/.bash_profile << 'EOF'
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=
export ORACLE_BASE=/oracle/app/db
export ORACLE_HOME=/oracle/app/19.3.0/db_1
export ORACLE_UNQNAME=
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_TERM=xterm
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export EDITOR=vi
export LANG=en_US
export NLS_LANG=american_america.AL32UTF8
export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'
umask 022
EOF
两份内容分别追加到 grid 与 oracle 的 ~/.bash_profile,重新登录后生效,不是当前会话临时 export。ORACLE_SID 留空的两项必须在建库后补成实际实例名(如 TESTDB1、TESTDB2),否则 sqlplus 无法本地认证。
5.4 登录 shell 限制
两个节点执行,root 用户下:
echo 'if [ $USER = "oracle" ]||[ $USER = "grid" ]; then' >> /etc/profile
echo 'if [ $SHELL = "/bin/ksh" ]; then' >> /etc/profile
echo 'ulimit -p 16384' >> /etc/profile
echo 'ulimit -n 65536' >> /etc/profile
echo 'else' >> /etc/profile
echo 'ulimit -u 16384 -n 65536' >> /etc/profile
echo 'fi' >> /etc/profile
echo 'fi' >> /etc/profile
重复执行会重复追加,改前先确认 /etc/profile 末尾没有同样的块。
6. 本地盘与 ASM 设备名
6.1 本地盘划分并挂载 /oracle
两个节点执行。本地盘不参与共享,划分后挂到 /oracle:
fdisk /dev/mapper/mpatha
partprobe /dev/mapper/mpatha
pvcreate /dev/mapper/mpatha1
vgcreate vg_ora /dev/mapper/mpatha1
lvcreate -l +100%free -n lv_ora vg_ora
mkfs.xfs /dev/mapper/vg_ora-lv_ora
mount /dev/mapper/vg_ora-lv_ora /oracle
vi /etc/fstab
/dev/mapper/vg_ora-lv_ora /oracle xfs defaults 0 0
执行前必须先确认 /dev/mapper/mpatha 对应哪块物理盘。3.3 节的三块共享盘都有显式 alias(asm-ocrdg01、asm-archdg01、asm-datadg01),multipath 不会再给它们分配 mpathX 这样的名字;而本地盘 sdb 没有进 blacklist,最可能被接管成 mpatha。这个推断必须用命令验证,不能想当然:
multipath -ll
lsblk /dev/mapper/mpatha
multipath -ll 会显示 mpatha 的 wwid 与底层 sd 设备,lsblk 会显示容量。本地盘是 80G,三块共享盘分别是 20G、40G、40G,容量对不上就停下来重新确认。如果 mpatha 实际指向共享盘,在其上执行 fdisk、pvcreate、mkfs.xfs 会直接毁掉 OCR 或数据盘,集群随之报废。
另一个更稳妥的做法是在 multipath.conf 的 blacklist 中加入 devnode "^sdb",让本地盘完全不受 multipath 管理,然后直接用 /dev/sdb 分区,设备名更直观,也不会随 multipath 的枚举顺序变化。
6.2 udev 绑定 ASM 磁盘
两个节点执行。先确认 WWID:
/usr/lib/udev/scsi_id -g -u -d /dev/sdc
/usr/lib/udev/scsi_id -g -u -d /dev/sdd
/usr/lib/udev/scsi_id -g -u -d /dev/sde
36000c29abee91b0f18a5032f6808d007
36000c29066009d6eefabc7c18f5d489c
36000c29223d26b4fc93a5a37543f0c64
创建规则文件 /etc/udev/rules.d/99-oracle-asmdevices.rules,两个节点内容相同:
cat > /etc/udev/rules.d/99-oracle-asmdevices.rules << 'EOF'
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c29abee91b0f18a5032f6808d007", SYMLINK+="asm-ocrdg01", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c29066009d6eefabc7c18f5d489c", SYMLINK+="asm-archdg01", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c29223d26b4fc93a5a37543f0c64", SYMLINK+="asm-datadg01", OWNER="grid", GROUP="asmadmin", MODE="0660"
EOF
重新加载并验证:
udevadm control --reload-rules
udevadm trigger --type=devices --action=change
ll /dev/asm*
lrwxrwxrwx 1 root root 3 3月 23 21:15 /dev/asm-archdg01 -> sdd
lrwxrwxrwx 1 root root 3 3月 23 21:15 /dev/asm-datadg01 -> sde
lrwxrwxrwx 1 root root 3 3月 23 21:15 /dev/asm-ocrdg01 -> sdc
节点2 执行同样三条命令,应看到相同的三个软链。注意规则匹配的是 sd* 裸设备,而 3.3 节又配了 multipath 别名;两套命名同时存在时,ASM 到底用 /dev/asm-* 还是 /dev/mapper/asm-* 必须二选一。用 udev 就不要让 multipath 接管这三块盘,用 multipath 就把 udev 规则的 KERNEL 匹配改成 dm-* 或直接省略,否则可能出现同一个 LUN 被两条路径同时暴露给 ASM。
7. 依赖包与安装介质
7.1 安装依赖
两个节点执行:
yum install -y bc \
gcc-c++ \
binutils \
compat-libcap1 \
compat-libstdc++-33 \
elfutils-libelf \
elfutils-libelf-devel \
fontconfig-devel \
glibc \
glibc-devel \
libaio \
libaio-devel \
libX11 \
libXau \
libXi \
libXtst \
libXrender \
libXrender-devel \
libgcc \
libstdc++ \
libstdc++-devel \
libxcb \
make \
net-tools \
nfs-utils \
smartmontools \
sysstat \
expect \
psmisc \
unzip \
rsync
还有两个 rpm 依赖包需要单独安装:
rpm -ivh compat-libstdc++-33-3.2.3-47.3.x86_64.rpm
rpm -ivh pdksh-5.2.14-37.el5.x86_64.rpm
compat-libstdc++-33 在 yum 列表里已经出现一次,若源里能装成功,rpm 这步可跳过;pdksh 在 RHEL 7 源里没有,必须本地装。装完用 rpm -q 逐个确认,缺包会让 Grid 的 CVU 检查直接失败。
7.2 上传 19c 软件包
需要上传 Oracle 19c grid 与 oracle 基础包(19.3.0)。放到 grid 和 oracle 都能读到的目录,例如 /oracle/soft,并保证剩余空间足够解压两份安装介质。
mkdir -p /oracle/soft
chown grid:oinstall /oracle/soft
chmod 775 /oracle/soft
上传后核对文件大小与校验和,再分别解压到各自的 ORACLE_HOME。软件包不要放在 /tmp,重启会被清理,空间也常常不够。
8. 执行顺序与检查清单
第 1 到 7 节的顺序不要颠倒:规划 → 系统与网络 → 共享存储与多路径 → 内核参数 → 用户与目录 → 本地盘与 udev → 依赖包 → 上传介质。顺序颠倒的典型后果是:先装软件再改 limits,root.sh 执行时权限不对;先配 udev 再改 multipath,设备名被覆盖。
在解压 Grid 安装包之前,逐项确认:
- 两个节点 hostname 与 hosts 完全对应,四个网段互不重叠,VIP 与公网同段;
- 私网双向 ping 通,且私网卡没有默认路由;
- 两个节点 lsblk 看到的共享盘容量一致,三个 WWID 完全一致;
- multipath -ll 三个 alias 状态正常,或明确决定不用多路径;
- getenforce 为 Permissive,firewalld 已停用,avahi 已禁用;
- /etc/systemd/logind.conf 中 RemoveIPC=no;
- sysctl -p 无报错,ipcs -l 的 shmall/shmmax 与配置一致,/proc/meminfo 的 HugePages_Total 等于 nr_hugepages;
- grep -i numa /var/log/dmesg 显示 NUMA turned off,AnonHugePages 为 0;
- id grid 与 id oracle 在两个节点的 UID/GID 完全一致;
- /oracle 已挂载且 fstab 有条目,/oracle/app 下四个目录属主正确;
- /dev/asm-ocrdg01、asm-archdg01、asm-datadg01 三个软链存在,属主 grid:asmadmin,权限 0660;
- 依赖包全部可查,19c grid 与 db 安装包已上传并校验。
这些检查全部通过,再进入第 9 节的 Grid 安装,后面的 CVU 检查会顺很多。
9. Grid 安装的公共准备
软件包上传到节点 1 的 /oracle/soft,先建目录并调整属组,再切换到 grid 解压到 GI Home。原文只在节点 1 解压,节点 2 的 GI Home 由安装器分发,不需要重复解压。解压前确认 grid 用户的 ORACLE_HOME 已经指向 /oracle/app/19.3.0/grid,否则 unzip -d $ORACLE_HOME 会解到空路径。
mkdir -p /oracle/soft
chown -R root:oinstall /oracle/soft
su - grid
cd /oracle/soft
unzip grid_home_193_V982068-01.zip -d $ORACLE_HOME
解压完成后安装 cvuqdisk。这个 RPM 必须两个节点都装,否则 CVU 检查会报找不到共享磁盘设备。
cd /oracle/app/19.3.0/grid/cv/rpm
rpm -ivh cvuqdisk-1.0.10-1.rpm
scp cvuqdisk-1.0.10-1.rpm [email protected]:/oracle/soft/
节点 2 上执行:
cd /oracle/soft
rpm -ivh cvuqdisk-1.0.10-1.rpm
安装输出中的 Using default group oinstall to install package 属正常,说明包默认把设备权限给了 oinstall 组。
10. 路径 A:图形化安装 Grid(节点 1)
10.1 准备图形环境
最小化安装的系统没有 X11。服务端装图形组会顺带装上 NetworkManager 和 firewalld,这两个服务会覆盖前面已经做好的网络与防火墙配置,装完必须停掉并禁用。
yum group install "Server with GUI"
systemctl set-default graphical.target
systemctl isolate graphical.target
systemctl get-default
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl status NetworkManager
然后允许 root 的 X 会话被 grid 使用,并确认 DISPLAY:
xhost +
echo $DISPLAY
输出为 :0 时,切换到 grid 并沿用该显示号:
su - grid
export DISPLAY=:0
cd /oracle/app/19.3.0/grid
./gridSetup.sh -jreLoc /etc/alternatives/jre_1.8.0
-jreLoc 显式指定系统自带的 JDK 8 路径。
10.2 向导中的关键选项
向导页数不少,真正会决定后续能不能启动的只有下面这些。
向导前两屏选择安装模式与集群类型:


SCAN 名称必须与 /etc/hosts 中配置的 SCAN 记录完全一致,拼写差一个字符都会导致后续客户端连不上。

添加节点 2 后先点 Setup 配置互信,再点 Test 验证。两节点的 grid 用户密码必须一致,否则互信配置会失败。


网卡配置这一步最容易错。公网网卡只勾 Public,私网网卡除了 Private 还要勾上 ASM,19c 的 ASM 实例依赖这条私网做 ASM 网络通信。只勾 Private 不勾 ASM,ASM 实例的托管网络会缺失,后面集群资源起不来。

存储类型这一步 19c 只有两个选项,选 ASM 时只能选 Flex。

不安装 GIMR。GIMR 会额外建一个 MGMTDB,占用 OCR 磁盘组空间和内存,只有在需要 CHM/TFA 集中管理时才装。测试和多数生产库都可以选 NO。

配置 OCR 磁盘组,选择前面 udev 绑定的 OCR 盘:

ASM 管理密码统一设为 your_password,与后面 dbca 使用的密码保持一致,便于实验环境复现:


跳过 EM 管理注册。除非确实要接 EMCC,否则这一步只会拖慢安装并在失败时留下无用的配置。

ASM 管理组保持默认(asmdba、asmoper、asmadmin),与第 5 节创建的用户组对应:

安装路径保持 /oracle/app/19.3.0/grid,Inventory 为 /oracle/app/oraInventory:


不要勾选自动运行配置脚本。安装结束后先自己检查一遍再手工执行,比安装器自动跑完再回头找日志容易得多。

预检查阶段会出现两类可以忽略的告警:一是 ksh 已安装但仍提示缺失,二是 RPM Package Manager database 相关检查,后者是 CVU 需要 root 权限读取 RPM 数据库导致,对应 MOS 文档 Cluvfy Fail with PRVG-11250 The Check "RPM Package Manager Database"。



10.3 执行 root.sh(两节点,先节点 1)
安装器最后会提示以 root 执行两个脚本。orainstRoot.sh 两节点都要跑,作用是统一 Inventory 的权限和属组。
/oracle/app/oraInventory/orainstRoot.sh
节点 1 输出:
Changing permissions of /oracle/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /oracle/app/oraInventory to oinstall.
The execution of the script is complete.
执行前确认脚本路径与节点顺序:

节点 2 输出相同。接着在节点 1 执行 GI 的 root.sh,提示本地 bin 目录时直接回车使用 /usr/local/bin:
/oracle/app/19.3.0/grid/root.sh
节点 1 的关键输出如下。中间会经历 19 个安装步骤,最后一行 CLSRSC-325 才是成功标志:
Performing root user operation.
The following environment variables are set as:
ORACLE_OWNER= grid
ORACLE_HOME= /oracle/app/19.3.0/grid
Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Relinking oracle with rac_on option
Using configuration parameter file: /oracle/app/19.3.0/grid/crs/install/crsconfig_params
The log of current session can be found at:
/oracle/app/grid/crsdata/ora19c-rac01/crsconfig/rootcrs_ora19c-rac01_2026-03-23_11-46-10PM.log
2026/03/23 23:46:15 CLSRSC-594: Executing installation step 1 of 19: 'SetupTFA'.
2026/03/23 23:46:15 CLSRSC-594: Executing installation step 2 of 19: 'ValidateEnv'.
2026/03/23 23:46:15 CLSRSC-363: User ignored prerequisites during installation
2026/03/23 23:46:15 CLSRSC-594: Executing installation step 3 of 19: 'CheckFirstNode'.
2026/03/23 23:46:17 CLSRSC-594: Executing installation step 4 of 19: 'GenSiteGUIDs'.
2026/03/23 23:46:17 CLSRSC-594: Executing installation step 5 of 19: 'SetupOSD'.
2026/03/23 23:46:17 CLSRSC-594: Executing installation step 6 of 19: 'CheckCRSConfig'.
2026/03/23 23:46:18 CLSRSC-594: Executing installation step 7 of 19: 'SetupLocalGPNP'.
2026/03/23 23:46:28 CLSRSC-594: Executing installation step 8 of 19: 'CreateRootCert'.
2026/03/23 23:46:31 CLSRSC-594: Executing installation step 9 of 19: 'ConfigOLR'.
2026/03/23 23:46:37 CLSRSC-594: Executing installation step 10 of 19: 'ConfigCHMOS'.
2026/03/23 23:46:37 CLSRSC-594: Executing installation step 11 of 19: 'CreateOHASD'.
2026/03/23 23:46:38 CLSRSC-4002: Successfully installed Oracle Trace File Analyzer (TFA) Collector.
2026/03/23 23:46:41 CLSRSC-594: Executing installation step 12 of 19: 'ConfigOHASD'.
2026/03/23 23:46:41 CLSRSC-330: Adding Clusterware entries to file 'oracle-ohasd.service'
2026/03/23 23:47:12 CLSRSC-594: Executing installation step 13 of 19: 'InstallAFD'.
2026/03/23 23:47:16 CLSRSC-594: Executing installation step 14 of 19: 'InstallACFS'.
2026/03/23 23:47:48 CLSRSC-594: Executing installation step 15 of 19: 'InstallKA'.
2026/03/23 23:47:51 CLSRSC-594: Executing installation step 16 of 19: 'InitConfig'.
已成功创建并启动 ASM。
[DBT-30001] 已成功创建磁盘组。有关详细信息, 请查看 /oracle/app/grid/cfgtoollogs/asmca/asmca-260323下午114820.log。
2026/03/23 23:49:27 CLSRSC-482: Running command: '/oracle/app/19.3.0/grid/bin/ocrconfig -upgrade grid oinstall'
CRS-4256: Updating the profile
Successful addition of voting disk 577bc2cb37f04fc6bfd56173a448563b.
Successfully replaced voting disk group with +OCRDG.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 577bc2cb37f04fc6bfd56173a448563b (/dev/asm-ocrdg01) [OCRDG]
Located 1 voting disk(s).
2026/03/23 23:50:31 CLSRSC-594: Executing installation step 17 of 19: 'StartCluster'.
2026/03/23 23:51:31 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/03/23 23:51:31 CLSRSC-594: Executing installation step 18 of 19: 'ConfigNode'.
2026/03/24 00:21:07 CLSRSC-594: Executing installation step 19 of 19: 'PostConfig'.
2026/03/24 00:21:25 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded
这里只列出了 1 个 voting disk,而静默路径有 3 个,两次安装的 OCRDG 盘数配置不同。生产环境应当用三块盘做 NORMAL 冗余,具体差异见文末「待核对」。
节点 1 返回 CLSRSC-325 之后,再在节点 2 执行同一个脚本。节点 2 只做本机配置,不会再创建磁盘组,日志里出现 CLSRSC-343 和 CLSRSC-325 即成功:
2026/03/24 00:25:36 CLSRSC-594: Executing installation step 17 of 19: 'StartCluster'.
2026/03/24 00:26:18 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/03/24 00:26:18 CLSRSC-594: Executing installation step 18 of 19: 'ConfigNode'.
2026/03/24 00:26:28 CLSRSC-594: Executing installation step 19 of 19: 'PostConfig'.
2026/03/24 00:26:34 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded



10.4 检查集群资源
/oracle/app/19.3.0/grid/bin/crsctl stat res -t
重点看四项:ora.asm 在两个节点都是 ONLINE、ora.OCRDG.dg 在两个节点都是 ONLINE、ora.LISTENER_SCAN1.lsnr 在线、两个节点的 VIP 在线。ora.proxy_advm 显示 OFFLINE 是正常的,没有 ACFS 需求时不需要它。
ora.LISTENER.lsnr
ONLINE ONLINE ora19c-rac01 STABLE
ONLINE ONLINE ora19c-rac02 STABLE
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE ora19c-rac01 STABLE
2 ONLINE ONLINE ora19c-rac02 STABLE
ora.OCRDG.dg(ora.asmgroup)
1 ONLINE ONLINE ora19c-rac01 STABLE
2 ONLINE ONLINE ora19c-rac02 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE ora19c-rac01 Started,STABLE
2 ONLINE ONLINE ora19c-rac02 Started,STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE ora19c-rac01 STABLE
ora.ora19c-rac01.vip
1 ONLINE ONLINE ora19c-rac01 STABLE
ora.ora19c-rac02.vip
1 ONLINE ONLINE ora19c-rac02 STABLE
ora.scan1.vip
1 ONLINE ONLINE ora19c-rac01 STABLE
11. 路径 B:静默安装 Grid(节点 1)
静默安装把向导里的每个选项固化到响应文件,适合重复搭建和交付。它与图形化路径二选一,不要在同一套环境上重复执行。
11.1 预配互信
图形化是在向导里点 Setup,静默安装必须提前用脚本配好。GI 阶段只配 grid,DB 软件阶段再配 oracle。节点列表用空格分隔:
su - grid
$ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user grid -hosts "ora19c-rac01 ora19c-rac02" -advanced -noPromptPassphrase
-advanced 会同时配置 ssh 和 scp 的双向信任,-noPromptPassphrase 表示不设口令短语,适合自动化。执行过程中会要求输入两节点 grid 用户的密码。
11.2 编写响应文件
从模板复制一份,只改副本:
cd /oracle/app/19.3.0/grid/install/response/
cp gridsetup.rsp mygridsetup.rsp
vi mygridsetup.rsp
完整内容如下,路径、磁盘名、网段都需要按实际环境替换:
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v19.0.0
INVENTORY_LOCATION=/oracle/app/oraInventory
oracle.install.option=CRS_CONFIG
ORACLE_BASE=/oracle/app/grid
oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin
oracle.install.crs.config.scanType=LOCAL_SCAN
oracle.install.crs.config.SCANClientDataFile=
oracle.install.crs.config.gpnp.scanName=cj-scan
oracle.install.crs.config.gpnp.scanPort=1521
oracle.install.crs.config.ClusterConfiguration=STANDALONE
oracle.install.crs.config.configureAsExtendedCluster=
oracle.install.crs.config.memberClusterManifestFile=
oracle.install.crs.config.clusterName=cj-cluster
oracle.install.crs.config.gpnp.configureGNS=
oracle.install.crs.config.autoConfigureClusterNodeVIP=
oracle.install.crs.config.gpnp.gnsOption=
oracle.install.crs.config.gpnp.gnsClientDataFile=
oracle.install.crs.config.gpnp.gnsSubDomain=
oracle.install.crs.config.gpnp.gnsVIPAddress=
oracle.install.crs.config.sites=
oracle.install.crs.config.clusterNodes=ora19c-rac01:ora19c-rac01-vip:HUB,ora19c-rac02:ora19c-rac02-vip:HUB
oracle.install.crs.config.networkInterfaceList=ens32:192.168.61.0:1,ens33:172.16.2.0:5
oracle.install.crs.configureGIMR=false
oracle.install.asm.configureGIMRDataDG=false
oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE
oracle.install.crs.config.sharedFileSystemStorage.votingDiskLocations=
oracle.install.crs.config.sharedFileSystemStorage.ocrLocations=
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcUsername=
oracle.install.crs.config.ipmi.bmcPassword=
oracle.install.asm.SYSASMPassword=your_password
oracle.install.asm.diskGroup.name=OCRDG
oracle.install.asm.diskGroup.redundancy=NORMAL
oracle.install.asm.diskGroup.AUSize=4
oracle.install.asm.diskGroup.FailureGroups=
oracle.install.asm.diskGroup.disksWithFailureGroupNames=
oracle.install.asm.diskGroup.disks=/dev/asm-ocrdg01,/dev/asm-ocrdg02,/dev/asm-ocrdg03
oracle.install.asm.diskGroup.quorumFailureGroupNames=
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/asm-*
oracle.install.asm.monitorPassword=your_password
oracle.install.asm.gimrDG.name=
oracle.install.asm.gimrDG.redundancy=
oracle.install.asm.gimrDG.AUSize=
oracle.install.asm.gimrDG.FailureGroups=
oracle.install.asm.gimrDG.disksWithFailureGroupNames=
oracle.install.asm.gimrDG.disks=
oracle.install.asm.gimrDG.quorumFailureGroupNames=
oracle.install.asm.configureAFD=false
oracle.install.crs.configureRHPS=false
oracle.install.crs.config.ignoreDownNodes=false
oracle.install.config.managementOption=NONE
oracle.install.config.omsHost=
oracle.install.config.omsPort=
oracle.install.config.emAdminUser=
oracle.install.config.emAdminPassword=
oracle.install.crs.rootconfig.executeRootScript=false
oracle.install.crs.rootconfig.configMethod=
oracle.install.crs.rootconfig.sudoPath=
oracle.install.crs.rootconfig.sudoUserName=
oracle.install.crs.config.batchinfo=
oracle.install.crs.app.applicationAddress=
oracle.install.crs.deleteNode.nodes=
几个字段值得单独说明。networkInterfaceList 的格式是 网卡:网段:类型,类型 1 是公网、5 是私网,与图形化里勾选 Public/ASM 等价。diskDiscoveryString 用 /dev/asm-* 配合 udev 绑定,避免重启后盘符漂移。executeRootScript=false 表示安装器不自动跑 root 脚本,由人工按节点顺序执行。
11.3 执行安装
cd /oracle/app/19.3.0/grid
./gridSetup.sh -silent -ignorePrereqFailure -waitForCompletion -responseFile /oracle/app/19.3.0/grid/install/response/mygridsetup.rsp
-ignorePrereqFailure 对应图形化里忽略 ksh、RPM 数据库这两类误报,-waitForCompletion 让命令阻塞到安装结束,便于脚本判断返回码。
[WARNING] [INS-32047] The location (/oracle/app/oraInventory) specified for the central inventory is not empty.
ACTION: It is recommended to provide an empty location for the inventory.
[WARNING] [INS-13013] Target environment does not meet some mandatory requirements.
CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /tmp/GridSetupActions2026-03-29_00-58-26AM/gridSetupActions2026-03-29_00-58-26AM.log
ACTION: Identify the list of failed prerequisite checks from the log: /tmp/GridSetupActions2026-03-29_00-58-26AM/gridSetupActions2026-03-29_00-58-26AM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually.
The response file for this session can be found at:
/oracle/app/19.3.0/grid/install/response/grid_2026-03-29_00-58-26AM.rsp
You can find the log of this install session at:
/tmp/GridSetupActions2026-03-29_00-58-26AM/gridSetupActions2026-03-29_00-58-26AM.log
As a root user, execute the following script(s):
1. /oracle/app/oraInventory/orainstRoot.sh
2. /oracle/app/19.3.0/grid/root.sh
Execute /oracle/app/oraInventory/orainstRoot.sh on the following nodes:
[ora19c-rac01, ora19c-rac02]
Execute /oracle/app/19.3.0/grid/root.sh on the following nodes:
[ora19c-rac01, ora19c-rac02]
Run the script on the local node first. After successful completion, you can start the script in parallel on all other nodes.
Successfully Setup Software with warning(s).
As install user, execute the following command to complete the configuration.
/oracle/app/19.3.0/grid/gridSetup.sh -executeConfigTools -responseFile /oracle/app/19.3.0/grid/install/response/mygridsetup.rsp [-silent]
Moved the install session logs to:
/oracle/app/oraInventory/logs/GridSetupActions2026-03-29_00-58-26AM
INS-32047 表示 Inventory 目录里已有内容,通常是此前的安装尝试留下的,属于可继续的告警。INS-13013 与图形化里的预检查忽略是同一件事,确认日志里没有磁盘权限、内存、内核参数类错误即可继续。
11.4 执行 root.sh
顺序与图形化完全一致:orainstRoot.sh 两节点,root.sh 先节点 1 后节点 2。节点 1 的输出与 10.3 节相同,只有两处差别:日志时间戳不同;OCR 使用了三块盘,因此投票盘有三条记录。
Successful addition of voting disk 1ec01af450bd4f06bf19e7f485ee6ed5.
Successful addition of voting disk 7b10642f75514f1ebf2e5110a6ad36f9.
Successful addition of voting disk 2435b60c8d2e4f4ebf71875ea5a544b3.
Successfully replaced voting disk group with +OCRDG.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 1ec01af450bd4f06bf19e7f485ee6ed5 (/dev/asm-ocrdg01) [OCRDG]
2. ONLINE 7b10642f75514f1ebf2e5110a6ad36f9 (/dev/asm-ocrdg02) [OCRDG]
3. ONLINE 2435b60c8d2e4f4ebf71875ea5a544b3 (/dev/asm-ocrdg03) [OCRDG]
Located 3 voting disk(s).
2026/03/29 01:10:00 CLSRSC-343: Successfully started Oracle Clusterware stack
2026/03/29 01:11:42 CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded
节点 2 执行完同样以 CLSRSC-325 结束。
11.5 安装后配置
静默安装不会自动调用配置助手,需要再执行一次 -executeConfigTools:
cd /oracle/app/19.3.0/grid
./gridSetup.sh -silent -executeConfigTools -responseFile /oracle/app/19.3.0/grid/install/response/mygridsetup.rsp
本次执行的输出是配置失败:
Launching Oracle Grid Infrastructure Setup Wizard...
You can find the logs of this session at:
/oracle/app/oraInventory/logs/GridSetupActions2026-03-29_01-21-16AM
You can find the log of this install session at:
/oracle/app/oraInventory/logs/UpdateNodeList2026-03-29_01-21-16AM.log
Configuration failed.
[WARNING] [INS-43080] Some of the configuration assistants failed, were cancelled or skipped.
ACTION: Refer to the logs or contact Oracle Support Services.
原文的判断是 SCAN 域名相关的配置可以忽略,后续 crsctl stat res -t 显示集群资源全部在线,因此没有继续处理。这一条不能照抄到生产:如果日志里失败的是 ASM 或网络类助手,必须先解决再装 DB 软件。核对方法见文末。
12. 创建 ASM 磁盘组(节点 1)
12.1 磁盘组规划
Grid 安装时只建了 OCRDG,数据和归档还需要两个独立磁盘组。分开的原因是备份、归档和在线日志的 I/O 特征不同,独立磁盘组可以分别设定 AU 和冗余,也便于后续单独扩容。
| 磁盘组 | 用途 | 冗余 | AU | 盘 |
|---|---|---|---|---|
| OCRDG | OCR、投票盘 | NORMAL | 4M | /dev/asm-ocrdg01 至 03 |
| ARCHDG | 归档日志 | EXTERNAL | 1M | /dev/asm-archdg01 |
| DATADG | 数据文件 | EXTERNAL | 1M | /dev/asm-datadg01 |
OCR 必须能承受单盘故障,所以用 NORMAL 冗余;数据盘和归档盘由底层存储保证冗余时用 EXTERNAL,避免 ASM 再做一次镜像浪费空间。如果底层是单机盘或没有 RAID,DATADG 也应改成 NORMAL。
12.2 图形化创建
su - grid
asmca
在 Disk Groups 页点 Create,分别填入 ARCHDG、DATADG,冗余选 External,勾选对应的 udev 盘。两块盘不要放进同一个磁盘组,否则失去分开规划的意义。





12.3 静默创建
静默方式一条命令建一个组,先确认 OCRDG 状态:
asmcmd lsdg
State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED NORMAL N 512 512 4096 4194304 30720 29804 10240 9782 0 Y OCRDG/
创建归档组和数据组:
asmca -silent -createDiskGroup -diskGroupName archdg -diskList '/dev/asm-archdg01' -redundancy EXTERNAL
asmca -silent -createDiskGroup -diskGroupName datadg -diskList '/dev/asm-datadg01' -redundancy EXTERNAL
[INFO] [DBT-30001] Disk groups created successfully. Check /oracle/app/grid/cfgtoollogs/asmca/asmca-260329AM012918.log for details.
[INFO] [DBT-30001] Disk groups created successfully. Check /oracle/app/grid/cfgtoollogs/asmca/asmca-260329AM013048.log for details.
再次确认:
State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 512 4096 1048576 40960 40862 0 40862 0 N ARCHDG/
MOUNTED EXTERN N 512 512 4096 1048576 40960 40862 0 40862 0 N DATADG/
MOUNTED NORMAL N 512 512 4096 4194304 30720 29804 10240 9782 0 Y OCRDG/
三个组都是 MOUNTED、Rebal 为 N,说明没有正在进行的再平衡,可以进入 DB 软件安装。
13. 安装 Oracle DB 软件(节点 1)
13.1 解压
su - oracle
cd /oracle/soft/
unzip db_home_193_V982063-01.zip -d $ORACLE_HOME
13.2 路径 A:图形化安装
xhost +
echo $DISPLAY
su - oracle
export DISPLAY=:0
cd $ORACLE_HOME
./runInstaller -jreLoc /etc/alternatives/jre_1.8.0
选择「仅安装软件」,数据库随后用 dbca 单独创建。这样软件安装和建库解耦,建库参数可以反复调整而不用重装 Home。

选择 RAC 集群安装:

添加节点 2,用 oracle 用户配置并测试互信:

选择企业版:

安装目录:

管理组比 11g 多了 DG、备份和加密三组,分别对应 dgdba、backupdba、kmdba,按第 5 节创建的组选择:

不自动运行配置脚本:



安装完成后以 root 逐节点执行 root.sh:
/oracle/app/19.3.0/db_1/root.sh
Performing root user operation.
The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /oracle/app/19.3.0/db_1
Enter the full pathname of the local bin directory: [/usr/local/bin]:
The contents of "dbhome" have not changed. No need to overwrite.
The contents of "oraenv" have not changed. No need to overwrite.
The contents of "coraenv" have not changed. No need to overwrite.
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.

节点 2 输出相同,dbhome、oraenv 已存在时会提示 No need to overwrite,属正常。

13.3 路径 B:静默安装
先给 oracle 用户配互信:
$ORACLE_HOME/oui/prov/resources/scripts/sshUserSetup.sh -user oracle -hosts "ora19c-rac01 ora19c-rac02" -advanced -noPromptPassphrase
复制并编辑响应文件:
cd $ORACLE_HOME/install/response/
cp db_install.rsp mydb_install.rsp
vi mydb_install.rsp
完整内容如下。因为只装软件,所有 starterdb.* 字段留空,建库交给 dbca:
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/oracle/app/oraInventory
ORACLE_HOME=/oracle/app/19.3.0/db_1
ORACLE_BASE=/oracle/app/db
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=backupdba
oracle.install.db.OSDGDBA_GROUP=dgdba
oracle.install.db.OSKMDBA_GROUP=kmdba
oracle.install.db.OSRACDBA_GROUP=racdba
oracle.install.db.rootconfig.executeRootScript=false
oracle.install.db.rootconfig.configMethod=
oracle.install.db.rootconfig.sudoPath=
oracle.install.db.rootconfig.sudoUserName=
oracle.install.db.CLUSTER_NODES=ora19c-rac01,ora19c-rac02
oracle.install.db.config.starterdb.type=
oracle.install.db.config.starterdb.globalDBName=
oracle.install.db.config.starterdb.SID=
oracle.install.db.ConfigureAsContainerDB=
oracle.install.db.config.PDBName=
oracle.install.db.config.starterdb.characterSet=
oracle.install.db.config.starterdb.memoryOption=
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=
oracle.install.db.config.starterdb.password.ALL=
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.password.PDBADMIN=
oracle.install.db.config.starterdb.managementOption=
oracle.install.db.config.starterdb.omsHost=
oracle.install.db.config.starterdb.omsPort=
oracle.install.db.config.starterdb.emAdminUser=
oracle.install.db.config.starterdb.emAdminPassword=
oracle.install.db.config.starterdb.enableRecovery=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
执行安装:
cd $ORACLE_HOME
./runInstaller -silent -ignorePrereqFailure -waitForCompletion -responseFile /oracle/app/19.3.0/db_1/install/response/mydb_install.rsp
Launching Oracle Database Setup Wizard...
[WARNING] [INS-13013] Target environment does not meet some mandatory requirements.
CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /oracle/app/oraInventory/logs/InstallActions2026-03-29_01-49-54AM/installActions2026-03-29_01-49-54AM.log
ACTION: Identify the list of failed prerequisite checks from the log: /oracle/app/oraInventory/logs/InstallActions2026-03-29_01-49-54AM/installActions2026-03-29_01-49-54AM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually.
The response file for this session can be found at:
/oracle/app/19.3.0/db_1/install/response/db_2026-03-29_01-49-54AM.rsp
You can find the log of this install session at:
/oracle/app/oraInventory/logs/InstallActions2026-03-29_01-49-54AM/installActions2026-03-29_01-49-54AM.log
As a root user, execute the following script(s):
1. /oracle/app/oraInventory/orainstRoot.sh
2. /oracle/app/19.3.0/db_1/root.sh
Execute /oracle/app/oraInventory/orainstRoot.sh on the following nodes:
[ora19c-rac02]
Execute /oracle/app/19.3.0/db_1/root.sh on the following nodes:
[ora19c-rac01, ora19c-rac02]
Successfully Setup Software with warning(s).
注意 orainstRoot.sh 这一行只列了节点 2,因为节点 1 的 Inventory 在装 GI 时已经初始化过。两个节点的 db_1/root.sh 仍然都要执行:
/oracle/app/oraInventory/orainstRoot.sh
/oracle/app/19.3.0/db_1/root.sh
静默模式下 root.sh 只提示日志位置,具体输出要自己 cat:
cat /oracle/app/19.3.0/db_1/install/root_ora19c-rac01_2026-03-29_01-59-34-994034719.log
日志结尾出现 Finished running generic part of root script 和 Now product-specific root actions will be performed 即完成。节点 2 同样处理。
14. 创建 CDB 和 PDB(节点 1)
14.1 路径 A:图形化 dbca
在 oracle 用户下执行 dbca,选择高级模式:
dbca


管理方式选 admin-Managed。策略管理需要先创建对应的资源池,实验环境没必要增加这一层:


CDB 全局库名 QQCDB,SID 前缀同名,同时创建一个 PDB,名为 QQDB:

数据文件放在 DATADG:

配置恢复区并开启归档,归档路径指向 ARCHDG:


内存按实际物理内存分配,后续可以用 sga_target、pga_aggregate_target 调整:


字符集用 AL32UTF8,与国家字符集 AL16UTF16 搭配。已有系统迁移时要与源库保持一致,不要在这里随手改:

不启动 EM,保留 CVU 检查:

所有管理账号密码设为 your_password:


ksh 和 SCAN 的告警忽略:



等待创建完成:


14.2 路径 B:静默 dbca
一条命令完成 CDB、PDB、归档和密码设置:
dbca -silent -ignorePreReqs -createDatabase \
-templateName General_Purpose.dbc \
-datafileJarLocation $ORACLE_HOME/assistants/dbca/templates \
-gdbName QQCDB \
-sid QQCDB \
-sysPassword your_password \
-systemPassword your_password \
-storageType ASM \
-diskGroupName DATADG \
-useOMF true \
-asmsnmpPassword your_password \
-dbsnmpPassword your_password \
-runCVUChecks true \
-nodelist ora19c-rac01,ora19c-rac02 \
-createAsContainerDatabase true \
-useLocalUndoForPDBs true \
-numberOfPDBs 1 \
-pdbName QQDB \
-pdbAdminPassword your_password \
-characterset AL32UTF8 \
-nationalCharacterSet AL16UTF16 \
-sampleSchema false \
-databaseType MULTIPURPOSE \
-emConfiguration NONE \
-memoryPercentage 30
-sid QQCDB 在 RAC 下是实例前缀,实际实例为 QQCDB1、QQCDB2。-useLocalUndoForPDBs true 让每个 PDB 使用独立 UNDO 表空间,避免 PDB 之间互相影响。-memoryPercentage 30 表示按物理内存的 30% 分配,装完后仍可按实际负载调整。
Prepare for db operation
7% complete
Copying database files
27% complete
Creating and starting Oracle instance
28% complete
31% complete
35% complete
37% complete
40% complete
Creating cluster database views
41% complete
53% complete
Completing Database Creation
57% complete
59% complete
60% complete
Creating Pluggable Databases
64% complete
80% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/oracle/app/db/cfgtoollogs/dbca/QQCDB.
Database Information:
Global Database Name:QQCDB
System Identifier(SID) Prefix:QQCDB
Look at the log file "/oracle/app/db/cfgtoollogs/dbca/QQCDB/QQCDB5.log" for further details.
确认两个实例都起来了:
srvctl status database -d QQCDB
Instance QQCDB1 is running on node ora19c-rac01
Instance QQCDB2 is running on node ora19c-rac02
14.3 建库后检查
ps -ef | grep smon
sqlplus / as sysdba
show pdbs
ps -ef 应能看到 ora_smon_QQCDB1 和 asm_smon_+ASM1;show pdbs 应看到 PDB$SEED 为 READ ONLY、QQDB 为 READ WRITE:
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 QQDB READ WRITE NO
15. 建库后的参数优化
这一节多数语句需要指定容器或在两个节点分别执行,逐条标注了位置。所有 ALTER SYSTEM 都先确认当前容器,避免改到 CDB$ROOT 而不是业务 PDB。
15.1 PDB 随实例自动启动(两节点)
alter pluggable database all save state;
SELECT * FROM DBA_PDB_SAVED_STATES;
save state 保存的是当前实例的打开状态,RAC 下每个节点各存一份,所以两个节点都要执行。只在一个节点执行,另一个节点重启后 PDB 仍是 MOUNTED。
15.2 统一监听端口(任一节点)
srvctl modify listener -l LISTENER -p "TCP:1521"
srvctl stop listener
srvctl start listener
srvctl 修改的是集群资源,在一个节点执行即可同步到所有节点。改完确认监听已在两个节点重新拉起。
15.3 兼容低版本客户端(两节点)
cd $ORACLE_HOME/network/admin
vi sqlnet.ora
加入两行:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
这是为了 11g 客户端或旧版 JDBC 驱动能连上 19c。它同时降低了认证协议的下限,只应在内网或迁移过渡期使用,迁移完成后应恢复默认值。
15.4 TNSNAMES 高可用配置
tnsnames.ora 涉及 LOAD_BALANCE、FAILOVER 和 SCAN 的写法,内容较多,已单独成篇,这里不重复。建库完成后至少要保证客户端能用 SCAN 地址连通两个实例。
15.5 密码策略(CDB 与每个 PDB)
进入目标 PDB 后执行:
alter session set container=QQDB;
@?/rdbms/admin/utlpwdmg.sql
alter profile default limit password_verify_function verify_function;
alter profile default limit password_life_time unlimited;
utlpwdmg.sql 会重建密码校验函数并把 DEFAULT profile 的校验函数指向它。password_life_time unlimited 关闭密码过期,适合无人值守的监控账号;生产环境应配合定期改密流程,而不是简单设为无限。
CDB 根容器也要执行同样三条,只是不需要 alter session set container。每个新建 PDB 都要单独执行一次,profile 不会自动继承这次修改。
15.6 关闭自动空间顾问和 SQL 调优顾问(CDB 与 PDB)
exec DBMS_AUTO_TASK_ADMIN.DISABLE( client_name => 'auto space advisor', operation => NULL, window_name => NULL);
exec DBMS_AUTO_TASK_ADMIN.DISABLE( client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);
这两个自动任务会在维护窗口跑统计信息和调优建议,测试库或资源紧张的环境里容易和业务高峰撞车。关掉不代表不能再手动跑,DBMS_SPACE_ADMIN 和 SQL Tuning Advisor 仍可单独调用。
15.7 关闭 OCM 调度任务与统计收集(CDB)
exec dbms_scheduler.disable('ORACLE_OCM.MGMT_CONFIG_JOB');
exec dbms_scheduler.disable('ORACLE_OCM.MGMT_STATS_CONFIG_JOB');
exec DBMS_STATS.SET_PARAM( 'method_opt','FOR ALL COLUMNS SIZE 1' );
PDB 内只需执行最后一条:
exec DBMS_STATS.SET_PARAM( 'method_opt','FOR ALL COLUMNS SIZE 1' );
method_opt 设为 FOR ALL COLUMNS SIZE 1 表示不收集列级直方图,能明显缩短统计信息收集时间,代价是数据倾斜严重的列可能选错执行计划。数据仓库或有明显倾斜的业务表不要照搬。
15.8 关闭自动索引(需重启)
alter system set "_optimizer_use_auto_indexes"=OFF scope=spfile;
alter system set filesystemio_options=setall scope=spfile;
19c 的自动索引会在后台创建、验证并删除索引,测试和 OLTP 环境里常出现计划突变。_optimizer_use_auto_indexes 是隐藏参数,关闭后需要重启实例生效。filesystemio_options=setall 对文件系统存储有意义,ASM 环境下影响有限,原文保留该设置。
16. 日常运维脚本
16.1 历史日志清理(两节点)
脚本分三层:grid 清监听和 ASM 审计、oracle 清数据库审计、root 负责调用前两者并挂定时任务。
grid 用户脚本:
mkdir -p /home/grid/scripts
vi /home/grid/scripts/clean_grid_log.sh
#!/bin/bash
. /home/grid/.bash_profile
LISTENER_LOG=`$ORACLE_HOME/bin/lsnrctl status|grep log|awk '{print $4}'|sed 's!/alert/log.xml!/trace/listener.log!'`
LISTENER_LOG_BAK=`$ORACLE_HOME/bin/lsnrctl status|grep log|awk '{print $4}'|sed 's!/alert/log.xml!/trace/listener.log.bak!'`
LISTENER_XML=`$ORACLE_HOME/bin/lsnrctl status|grep log|awk '{print $4}'|sed 's!/alert/log.xml!/alert/log_*.xml!'`
########## grid user clean listener log ##########
echo $LISTENER_LOG
echo $LISTENER_LOG_BAK
echo $LISTENER_XML
tail -n 10000 $LISTENER_LOG > $LISTENER_LOG_BAK
cp $LISTENER_LOG_BAK $LISTENER_LOG
rm -rf $LISTENER_XML
########## grid user clean ASM audit log ##########
echo $ORACLE_HOME/rdbms/audit
nohup find $ORACLE_HOME/rdbms/audit -type f -name "*.aud" -mtime +1 -exec rm {} \; &
rm -rf $LISTENER_XML 依赖 lsnrctl status 的输出格式解析路径,执行前先单独 echo 三个变量确认展开结果,避免变量为空或指向非预期目录。
oracle 用户脚本:
mkdir -p /home/oracle/scripts
vi /home/oracle/scripts/clean_oracle_log.sh
#!/bin/bash
. /home/oracle/.bash_profile
########## oracle user clean audit log ##########
audit_log=`sqlplus -s / as sysdba <<END
set feedback off
set head off
select value from v\$parameter where name='audit_file_dest';
END`
date
echo $audit_log
nohup find $audit_log -type f -name "*.aud" -mtime +1 -exec rm {} \; &
这里 v\$parameter 的转义不能省。heredoc 没有加引号,$parameter 会被 shell 展开成空值,必须写成 \$ 才能让 SQL*Plus 收到字面量。
root 用户包装脚本:
vi /root/clean_rac_log.sh
su - oracle -c "/bin/sh /home/oracle/scripts/clean_oracle_log.sh >> /tmp/clean_rac.log"
su - grid -c "/bin/sh /home/grid/scripts/clean_grid_log.sh >> /tmp/clean_rac.log"
定时任务前先建好日志文件并放开权限,否则第一次重定向会因为权限失败:
touch /tmp/clean_rac.log
chmod 777 /tmp/clean_rac.log
crontab -e
0 0 * * 0 sh /root/clean_rac_log.sh
每周日 0 点执行。监听日志被截断时 lsnrctl 仍持有文件句柄,脚本用 tail 重写再 cp 覆盖,属于常见做法;如果发现监听进程仍写旧 inode,需要 lsnrctl reload 或重启监听。
16.2 归档日志清理(两节点分别配置)
先建目录和 RMAN 脚本:
mkdir -p /home/oracle/arch_del
cd /home/oracle/arch_del
mkdir log scripts
vi /home/oracle/arch_del/scripts/delarc.rsv
run{
show all;
crosscheck archivelog all;
delete noprompt archivelog all completed before 'sysdate -7';
}
删除脚本:
vi /home/oracle/arch_del/scripts/del_root_arch.sh
#!/bin/bash
export ORACLE_SID=QQCDB1
export ORACLE_BASE=/oracle/app/db
export ORACLE_HOME=/oracle/app/19.3.0/db_1
LOG_DIR=/home/oradba/arch_del/log
LOG_FILE=${LOG_DIR}/arch_del_$(date +%Y%m%d).log
su - oracle -c "echo Script started at $(date) >> ${LOG_FILE}"
su - oracle -c "rman target / cmdfile=/home/oradba/arch_del/scripts/delarc.rsv >> ${LOG_FILE}"
su - oracle -c "echo Script ended at $(date) >> ${LOG_FILE}"
su - oracle -c "find /home/oradba/arch_del/log/* -mtime +9 | xargs rm -rf"
root 定时任务:
crontab -e
30 6 * * 5 sh /home/oracle/arch_del/scripts/del_root_arch.sh &
每周五 6:30 执行。归档保留 7 天,日志保留 9 天。
这份脚本有两处必须按节点改:ORACLE_SID 固定为 QQCDB1,节点 2 上要改成 QQCDB2;LOG_DIR 和 cmdfile 写的是 /home/oradba,而前面创建的目录是 /home/oracle。直接照抄会在节点 2 清理错实例,或者因为路径不存在而静默失败。原文如此,未做改动,部署前务必统一。
归档日志的保留周期要结合备份策略确定。只删归档不做全备,等于把恢复能力一起删掉。
17. 各阶段的结果判定
安装过程输出很长,判断成功与否只需要盯住每个阶段的最后一行。下面这些标志都来自本文实际执行输出,出现即说明该阶段通过,不必逐行读日志。
| 阶段 | 成功标志 | 常见非致命告警 |
|---|---|---|
| Grid 软件安装 | Successfully Setup Software with warning(s). | INS-32047、INS-13013 |
节点 1 的 GI root.sh | CLSRSC-325: Configure Oracle Grid Infrastructure for a Cluster ... succeeded | CLSRSC-363、CLSRSC-4002 |
节点 2 的 GI root.sh | 同上,且不出现 DBT-30001 | CLSRSC-363 |
| 创建磁盘组 | DBT-30001 后跟磁盘组名 | 无 |
| DB 软件安装 | Successfully Setup Software with warning(s). | INS-13013 |
DB 的 root.sh | Finished running generic part of root script | No need to overwrite |
dbca 建库 | Database creation complete. | ksh、SCAN 相关预检查告警 |
CLSRSC-363: User ignored prerequisites during installation 表示安装时跳过了预检查,图形化和静默两条路径都会出现,不是错误。真正需要处理的是带 failed、CRS- 错误码或 CLSRSC-4xxx 非预期编号的行。
阶段之间不要跳步。Grid 的 root.sh 没到 CLSRSC-325 就去装 DB 软件,后面 dbca 一定在 ASM 连接上失败,而报错信息不会指向真正的原因。
全流程要点
- 两条安装路径产物一致,图形化用于首次确认,静默用于复现;响应文件里的
scanName、clusterName、networkInterfaceList、磁盘路径四处必须逐项核对。 root.sh永远先在节点 1 跑完再跑节点 2,orainstRoot.sh两节点都要跑。- 19c 私网必须同时勾选
ASM和Private;存储只能是 Flex ASM。 - OCRDG 用 NORMAL 冗余,DATADG/ARCHDG 在底层有 RAID 时用 EXTERNAL。
- PDB 的
save state、sqlnet.ora、日志清理脚本都是两节点各做一次。 - 归档清理脚本的
ORACLE_SID和路径必须按节点修改后再上定时任务。
待核对
- 原文 5.4 节出现两次(本地盘、udev),已按内容拆为 6.1 与 6.2,编号顺延。
- 6.1 的 /dev/mapper/mpatha 原文未说明对应哪块物理盘。按 multipath 的命名规则推断应为未配 alias 的本地盘 sdb(80G),但必须在执行 fdisk/mkfs 前用 multipath -ll 与 lsblk 核实,切勿直接格式化。
- 原文两个节点的 ifcfg-ens33 使用相同 UUID(fd9a356e-a199-4e52-b8fe-704d50fafcde),且私网卡配置了 GATEWAY 与 DEFROUTE=yes;原文也未单独给出公网网卡的 ifcfg。配置照原样保留,落地时需按实际网络调整。
- 原文 limits.conf 只给 oracle 配了 memlock,grid 没有;配置照原样保留,正文提示补充。
- 原文 limits.conf 的 stack 软限 65536 大于硬限 32768;配置照原样保留,正文提示统一。
- 原文 multipath.conf 的 blacklist 只排除 sda,本地盘 sdb 未排除;配置照原样保留,正文提示补充。
- 同时配置了 multipath alias 与基于 sd* 的 udev 规则,两套命名如何取舍原文未说明;6.2 给出两种处理方向,需按实际环境确认。
- 4.3 时间同步原文只写了“改成自己的 NTP 服务域名”,未给出具体配置内容;正文补的 timedatectl、chronyc 与 cluvfy 属通用检查命令,需按实际环境执行确认。
- 原文 SCAN 只配置了一个 IP(192.168.61.138),生产环境通常需要三个,需按实际规划确认。
- 原文 sysctl 的 shmall=1997516、shmmax=6545460429、limits 的 memlock=3995032 对应约 8G 内存机器,换规格需按文中 awk 重算。
- 原文 yum 源指向 mirrors.aliyun.com/centos/7,与 redhat 7.9 混用,且 CentOS 7 已停止维护,源地址可能失效,需确认内网源可用。
- 静默 Grid 响应文件中的
scanName=cj-scan、clusterName=cj-cluster与本文主机名ora19c-rac01/02不一致,像是模板残留。实际部署时应改为与/etc/hosts一致的名称,否则root.sh阶段或 SCAN 解析会失败。 - 图形化路径的
root.sh输出只有 1 个 voting disk,静默路径有 3 个。两条路径的 OCRDG 盘数和冗余不一致,生产环境应以 3 块盘 NORMAL 为准。 - 静默路径执行
-executeConfigTools报INS-43080 Configuration failed,原文判断 SCAN 域名配置可忽略,且随后集群资源正常。该判断未在生产验证,若日志中失败的是 ASM/网络助手,不应跳过。 - 归档清理脚本中
LOG_DIR=/home/oradba/arch_del/log、cmdfile=/home/oradba/...与创建目录/home/oracle/arch_del不一致;ORACLE_SID=QQCDB1也只适用于节点 1。 - 19c 的
utlpwdmg.sql默认创建的校验函数名可能不是verify_function,执行前先确认该函数在当前版本中确实存在且名称一致。 - 原文
su- gird、gird$为笔误,已改为su - grid、grid$;// disable 19c automatic indexing feature不是合法 SQL 注释,已改为正文说明。 - 原文 17 的 6.3 标题为空,本文按内容补为图形化安装的向导步骤。
原文首发于微信公众号「止水研习社」。
文章评论