[TOC]
60分钟部署 Oracle 26ai RAC
官方发布,Oracle 26ai RAC支持在podman环境生产使用
https://container-registry.oracle.com/ords/ocr/ba/database/rac
Oracle RAC is supported for production use on Podman starting with Oracle Database 19c (19.16), Oracle Database 21c (21.7) and Oracle Database 23.26ai (26ai).
资源准备
宿主机1台:
操作系统:Oracle Linux Server release 9.7
https://yum.oracle.com/ISOS/OracleLinux/OL9/u7/x86_64/OracleLinux-R9-U7-x86_64-dvd.iso
装好后uname -r为: 6.12.0-105.51.5.el9uek.x86_64
cpu:4核
内存:33G
磁盘:160G+(swap分16G,/boot分1G,/分剩下的)
[root@ol9 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 17G 84K 17G 1% /dev/shm
tmpfs tmpfs 6.6G 8.8M 6.6G 1% /run
efivarfs efivarfs 256K 34K 218K 14% /sys/firmware/efi/efivars
/dev/mapper/ol-root xfs 143G 11G 132G 8% /
/dev/sdc2 xfs 960M 317M 644M 33% /boot
/dev/sdc1 vfat 599M 7.2M 592M 2% /boot/efi
tmpfs tmpfs 3.3G 0 3.3G 0% /run/user/0
RAC网络规划
(仅在podman容器内部通讯,外部通讯使用cman映射实现)
10.0.20.170 racnodep1.example.com racnodep1
192.168.17.170 racnodep1-priv.example-priv.com racnodep1-priv
10.0.20.200 racnodep1-vip.example.com racnodep1-vip
10.0.20.171 racnodep2.example.com racnodep2
192.168.17.171 racnodep2-priv.example-priv.com racnodep2-priv
10.0.20.201 racnodep2-vip.example.com racnodep2-vip
10.0.20.236 racnodepc1-scan.example.com racnodepc1-scan
10.0.20.237 racnodepc1-scan.example.com racnodepc1-scan
10.0.20.238 racnodepc1-scan.example.com racnodepc1-scan
10.0.20.166 racnodepc1-cman.example.com racnodepc1-cman
关闭透明大页(THP)
grubby --update-kernel=ALL --args=“transparent_hugepage=never”
检查是否修改成功:
$ cat /sys/kernel/mm/*transparent_hugepage/enabled
always [never]
设置虚拟机时钟源
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
如果存在tsc时钟源,则设置为当前时钟源
grubby --update-kernel=ALL --args=“clocksource=tsc”
检查是否修改成功:
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl status firewalld
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
操作完成后,重启一次主机
宿主机参数设置
vi /etc/sysctl.conf
添加
fs.aio-max-nr=1048576
fs.file-max=6815744
net.core.rmem_max=4194304
net.core.rmem_default=262144
net.core.wmem_max=1048576
net.core.wmem_default=262144
net.core.rmem_default=262144
net.ipv4.ip_forward=1
强制生效
sysctl -a
sysctl -p
安装podman
要求 podman version: 4.0.2+
https://github.com/containers/podman/releases
https://docs.oracle.com/en/operating-systems/oracle-linux/podman/
dnf install -y podman
podman version
Client: Podman Engine
Version: 5.6.0
API Version: 5.6.0
Go Version: go1.25.5 (Red Hat 1.25.5-2.el9_7)
Built: Mon Feb 2 17:29:55 2026
OS/Arch: linux/amd64
下载 Oracle 26ai RAC 镜像
podman pull registry.cn-hangzhou.aliyuncs.com/hd2020/ka:rac-dnsserver250227
podman pull registry.cn-hangzhou.aliyuncs.com/hd2020/ka:rac23.26.1.0
podman pull registry.cn-hangzhou.aliyuncs.com/hd2020/ka:cman23.5.0.0
或
https://github.com/oracle/docker-images/tree/main/OracleDatabase/RAC/OracleDNSServer 自行编译dns
podman pull container-registry.oracle.com/database/rac:23.26.1.0
podman pull container-registry.oracle.com/database/cman:23.5.0.0
创建podman网桥
podman network create --driver=bridge --subnet=10.0.20.0/24 --gateway=10.0.20.1 --opt mtu=9000 rac_pub1_nw
podman network create --driver=bridge --subnet=192.168.17.0/24 --opt mtu=9000 --disable-dns --internal rac_priv1_nw
podman network create --driver=bridge --subnet=192.168.18.0/24 --opt mtu=9000 --disable-dns --internal rac_priv2_nw
podman network ls
指定操作系统oracle用户、grid用户,数据库sys用户的密码
mkdir -p /opt/.secrets/
cd /opt/.secrets/
echo 'Qq00000000!' > /opt/.secrets/pwdfile.txt
openssl genrsa -out key.pem 4096
openssl rsa -in key.pem -out key.pub -pubout
openssl pkeyutl -in pwdfile.txt -out pwdfile.enc -pubin -inkey key.pub -encrypt
rm -rf /opt/.secrets/pwdfile.txt
podman secret create pwdsecret /opt/.secrets/pwdfile.enc
podman secret create keysecret /opt/.secrets/key.pem
podman secret ls
共享块设备(本次基于ESXi,给虚拟机分配 block devices 2个,每个52GB )
块设备盘符固定方案
用 /dev/disk/by-path 绑定
[root@ol9 ~]# ls -l /dev/disk/by-path/
lrwxrwxrwx 1 root root 9 Feb 18 22:10 pci-0000:03:00.0-scsi-0:0:1:0 -> ../../sda
lrwxrwxrwx 1 root root 9 Feb 18 22:10 pci-0000:03:00.0-scsi-0:0:2:0 -> ../../sdb
绑定 VMware 虚拟磁盘 sda、sdb 到 asm-disk1、asm-disk2
vi /etc/udev/rules.d/99-oracle-asmdevices.rules
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:03:00.0-scsi-0:0:1:0", SYMLINK+="asm-disk1", OWNER="root", GROUP="root", MODE="0640"
SUBSYSTEM=="block", ENV{ID_PATH}=="pci-0000:03:00.0-scsi-0:0:2:0", SYMLINK+="asm-disk2", OWNER="root", GROUP="root", MODE="0640"
重载 udev 规则
udevadm control --reload-rules
触发设备重新匹配
udevadm trigger --type=devices --subsystem-match=block
验证软链接是否生成
[root@ol9 ~]# ls -l /dev/asm-disk*
lrwxrwxrwx 1 root root 3 Feb 18 22:10 /dev/asm-disk1 -> sda
lrwxrwxrwx 1 root root 3 Feb 18 22:10 /dev/asm-disk2 -> sdb
块设备清零、初始化
dd if=/dev/zero of=/dev/asm-disk1 bs=1024k count=1024
dd if=/dev/zero of=/dev/asm-disk2 bs=1024k count=1024
时区文件,按需修改
echo ‘Asia/Shanghai’ > /etc/timezone
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
创建dns服务
podman rm -f racdns1
mkdir -p /tmp/racdns_tmp
rm /tmp/racdns_tmp/* -rf
chmod 777 -R /tmp/racdns_tmp
podman create -t -i \
--name racdns1 \
--hostname racdns1 \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
--dns-search=example.com \
--cap-add=SYS_ADMIN \
-e DOMAIN_NAME="example.com" \
-e PRIVATE_DOMAIN_NAME="example-priv.com" \
-e WEBMIN_ENABLED=false \
-e RAC_NODE_NAME_PREFIXD="racnode" \
-e RAC_NODE_NAME_PREFIXP="racnodep" \
-e RAC_PRIVATE_ETH="eth1" \
-e RAC_PUBLIC_ETH="eth0" \
-e RAC_PRIVATE_SUBNET="192.168.17" \
-e RAC_PUBLIC_SUBNET="10.0.20" \
-e SETUP_DNS_CONFIG_FILES="setup_true" \
--privileged=false \
-v /tmp/racdns_tmp:/tmp \
registry.cn-hangzhou.aliyuncs.com/hd2020/ka:rac-dnsserver250227
sleep 2
podman network disconnect podman racdns1
#按连接的顺序,rac_pub1_nw、rac_priv1_nw、rac_priv2_nw依次为eth0、eth1、eth2网口
podman network connect rac_pub1_nw --ip 10.0.20.252 racdns1
podman network connect rac_priv1_nw --ip 192.168.17.252 racdns1
podman network connect rac_priv2_nw --ip 192.168.18.252 racdns1
sleep 2
podman start racdns1
podman logs -f racdns1
新开2个shell终端,提前执行
官方镜像中Echo命令写错,修复它
watch -n 0.1 “podman exec -i racnodep1 sed -i ‘s/Echo/echo/g’ /u01/app/oracle/product/23ai/dbhome_1/bin/srvctl”
watch -n 0.1 “podman exec -i racnodep2 sed -i ‘s/Echo/echo/g’ /u01/app/oracle/product/23ai/dbhome_1/bin/srvctl”
等2个容器(racnodep1、racnodep2)启动后,检查是否修复
podman exec -i racnodep1 cat /u01/app/oracle/product/23ai/dbhome_1/bin/srvctl|grep -i echo
podman exec -i racnodep2 cat /u01/app/oracle/product/23ai/dbhome_1/bin/srvctl|grep -i echo
创建集群的第一个节点,暂不启动
podman rm -f racnodep1
podman create -t -i \
--name racnodep1 \
--hostname racnodep1 \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
--dns-search "example.com" \
--dns 10.0.20.252 \
--shm-size 4G \
--cpuset-cpus 0-1 \
--memory 16G \
--memory-swap 32G \
--sysctl kernel.shmall=2097152 \
--sysctl "kernel.sem=250 32000 100 128" \
--sysctl kernel.shmmax=8589934592 \
--sysctl kernel.shmmni=4096 \
--sysctl 'net.ipv4.conf.eth1.rp_filter=2' \
--sysctl 'net.ipv4.conf.eth2.rp_filter=2' \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
--cap-add=SYS_NICE \
--cap-add=AUDIT_WRITE \
--cap-add=AUDIT_CONTROL \
--cap-add=NET_RAW \
--secret pwdsecret \
--secret keysecret \
--health-cmd "/bin/python3 /opt/scripts/startup/scripts/main.py --checkracstatus" \
-e DNS_SERVERS="10.0.20.252" \
-e DB_SERVICE=service:mycdb \
-e CRS_PRIVATE_IP1=192.168.17.170 \
-e CRS_PRIVATE_IP2=192.168.18.170 \
-e CRS_NODES="\"pubhost:racnodep1,viphost:racnodep1-vip;pubhost:racnodep2,viphost:racnodep2-vip\"" \
-e SCAN_NAME=racnodepc1-scan \
-e INIT_SGA_SIZE=3G \
-e INIT_PGA_SIZE=2G \
-e INSTALL_NODE=racnodep1 \
-e DB_PWD_FILE=pwdsecret \
-e PWD_KEY=keysecret \
--device=/dev/asm-disk1:/dev/asm-disk1 \
--device=/dev/asm-disk2:/dev/asm-disk2 \
-e CRS_ASM_DEVICE_LIST=/dev/asm-disk1,/dev/asm-disk2 \
-e OP_TYPE=setuprac \
--restart=always \
--ulimit rtprio=99 \
--systemd=always \
registry.cn-hangzhou.aliyuncs.com/hd2020/ka:rac23.26.1.0
podman network disconnect podman racnodep1
podman network connect rac_pub1_nw --ip 10.0.20.170 racnodep1
podman network connect rac_priv1_nw --ip 192.168.17.170 racnodep1
podman network connect rac_priv2_nw --ip 192.168.18.170 racnodep1
添加集群的第二个节点,暂不启动
podman rm -f racnodep2
podman create -t -i \
--name racnodep2 \
--hostname racnodep2 \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
--dns-search "example.com" \
--dns 10.0.20.252 \
--shm-size 4G \
--cpuset-cpus 0-1 \
--memory 16G \
--memory-swap 32G \
--sysctl kernel.shmall=2097152 \
--sysctl "kernel.sem=250 32000 100 128" \
--sysctl kernel.shmmax=8589934592 \
--sysctl kernel.shmmni=4096 \
--sysctl 'net.ipv4.conf.eth1.rp_filter=2' \
--sysctl 'net.ipv4.conf.eth2.rp_filter=2' \
--cap-add=SYS_RESOURCE \
--cap-add=NET_ADMIN \
--cap-add=SYS_NICE \
--cap-add=AUDIT_WRITE \
--cap-add=AUDIT_CONTROL \
--cap-add=NET_RAW \
--secret pwdsecret \
--secret keysecret \
--health-cmd "/bin/python3 /opt/scripts/startup/scripts/main.py --checkracstatus" \
-e DNS_SERVERS="10.0.20.252" \
-e DB_SERVICE=service:mycdb \
-e CRS_PRIVATE_IP1=192.168.17.171 \
-e CRS_PRIVATE_IP2=192.168.18.171 \
-e CRS_NODES="\"pubhost:racnodep1,viphost:racnodep1-vip;pubhost:racnodep2,viphost:racnodep2-vip\"" \
-e SCAN_NAME=racnodepc1-scan \
-e INIT_SGA_SIZE=3G \
-e INIT_PGA_SIZE=2G \
-e INSTALL_NODE=racnodep1 \
-e DB_PWD_FILE=pwdsecret \
-e PWD_KEY=keysecret \
--device=/dev/asm-disk1:/dev/asm-disk1 \
--device=/dev/asm-disk2:/dev/asm-disk2 \
-e CRS_ASM_DEVICE_LIST=/dev/asm-disk1,/dev/asm-disk2 \
-e OP_TYPE=setuprac \
--restart=always \
--ulimit rtprio=99 \
--systemd=always \
registry.cn-hangzhou.aliyuncs.com/hd2020/ka:rac23.26.1.0
podman network disconnect podman racnodep2
podman network connect rac_pub1_nw --ip 10.0.20.171 racnodep2
podman network connect rac_priv1_nw --ip 192.168.17.171 racnodep2
podman network connect rac_priv2_nw --ip 192.168.18.171 racnodep2
注意: INSTALL_NODE=racnodep1 在两个节点都是一样的,否则安装失败
启动容器
podman start racnodep1
podman start racnodep2
创建和设置双节点Oracle RAC服务器大约需要60分钟。
在终端会话中使用如下命令查看日志:
podman exec racnodep1 /bin/bash -c “tail -f /tmp/orod/oracle_db_setup.log”
您应该在最后看到数据库创建成功的消息:
02/16/2026 10:36:19 AM INFO: oracommon - performdbcheck :
========================================================
Oracle Database ORCLCDB1 is up and running on racnodep1.
========================================================
02/16/2026 10:36:19 AM INFO: oracommon - performdbcheck :
===================================
ORACLE RAC DATABASE IS READY TO USE
===================================
02/16/2026 10:36:19 AM
podman exec -i -t racnodep1 /bin/bash
[grid@racnodep1 ~]$ ps -ef|grep pmon
grid 22520 1 0 09:40 ? 00:00:06 asm_pmon_+ASM1
oracle 89133 1 0 10:25 ? 00:00:07 ora_pmon_ORCLCDB1
检查rac集群
crsctl query css votedisk
crsctl check cluster -all
crsctl stat res -t
[grid@racnodep1 ~]$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE c9b44ae1c6f74fc1bf73ae6ab84e7461 (/dev/asm-disk1) [DATA]
Located 1 voting disk(s).
[grid@racnodep1 ~]$ crsctl check cluster -all
**************************************************************
racnodep1:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
racnodep2:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
[grid@racnodep1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
ONLINE ONLINE racnodep1 STABLE
ONLINE ONLINE racnodep2 STABLE
ora.chad
ONLINE ONLINE racnodep1 STABLE
ONLINE ONLINE racnodep2 STABLE
ora.helper
OFFLINE OFFLINE racnodep1 IDLE,STABLE
OFFLINE OFFLINE racnodep2 IDLE,STABLE
ora.net1.network
ONLINE ONLINE racnodep1 STABLE
ONLINE ONLINE racnodep2 STABLE
ora.ons
ONLINE ONLINE racnodep1 STABLE
ONLINE ONLINE racnodep2 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racnodep1 STABLE
2 ONLINE ONLINE racnodep2 STABLE
ora.ASMNET2LSNR_ASM.lsnr(ora.asmgroup)
1 ONLINE ONLINE racnodep1 STABLE
2 ONLINE ONLINE racnodep2 STABLE
ora.DATA.dg(ora.asmgroup)
1 ONLINE ONLINE racnodep1 STABLE
2 ONLINE ONLINE racnodep2 STABLE
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE racnodep2 STABLE
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE racnodep2 STABLE
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE racnodep1 STABLE
ora.asm(ora.asmgroup)
1 ONLINE ONLINE racnodep1 Started,STABLE
2 ONLINE ONLINE racnodep2 Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racnodep1 STABLE
2 ONLINE ONLINE racnodep2 STABLE
ora.asmnet2.asmnetwork(ora.asmgroup)
1 ONLINE ONLINE racnodep1 STABLE
2 ONLINE ONLINE racnodep2 STABLE
ora.cdp1.cdp
1 OFFLINE OFFLINE STABLE
ora.cdp2.cdp
1 OFFLINE OFFLINE STABLE
ora.cdp3.cdp
1 OFFLINE OFFLINE STABLE
ora.cvu
1 ONLINE ONLINE racnodep2 STABLE
ora.cvuhelper
1 OFFLINE OFFLINE STABLE
ora.orclcdb.db
1 ONLINE ONLINE racnodep1 Open,HOME=/u01/app/o
racle/product/23ai/d
bhome_1,STABLE
2 ONLINE ONLINE racnodep2 Open,HOME=/u01/app/o
racle/product/23ai/d
bhome_1,STABLE
ora.orclcdb.orclcdb_orclpdb.svc
1 ONLINE ONLINE racnodep2 STABLE
2 ONLINE ONLINE racnodep1 STABLE
ora.orclcdb.orclpdb.pdb
1 ONLINE ONLINE racnodep1 READ WRITE,STABLE
2 ONLINE ONLINE racnodep2 READ WRITE,STABLE
ora.orclcdb.mycdb.svc
1 ONLINE ONLINE racnodep2 STABLE
2 ONLINE ONLINE racnodep1 STABLE
ora.racnodep1.vip
1 ONLINE ONLINE racnodep1 STABLE
ora.racnodep2.vip
1 ONLINE ONLINE racnodep2 STABLE
ora.rhpserver
1 OFFLINE OFFLINE STABLE
ora.scan1.vip
1 ONLINE ONLINE racnodep2 STABLE
ora.scan2.vip
1 ONLINE ONLINE racnodep2 STABLE
ora.scan3.vip
1 ONLINE ONLINE racnodep1 STABLE
--------------------------------------------------------------------------------
切换到oracle用户
sudo su
su - oracle
echo $ORACLE_HOME
echo $ORACLE_SID
sqlplus / as sysdba
查看数据库运行模式、ASM磁盘使用情况等
SQL> select open_mode,name from v$database;
OPEN_MODE NAME
-------------------- ---------
READ WRITE ORCLCDB
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
SQL> select group_number,name,total_mb,free_mb from v$ASM_DISKGROUP;
GROUP_NUMBER NAME TOTAL_MB FREE_MB
------------ ------------------------------ ---------- ----------
1 DATA 106496 97960
asm空间实际用了 8536 MB
修改参数
sqlplus "/as sysdba"
alter system set remote_listener="racnodepc1-scan:1521,racnodepc1-cman:1521" sid='*';
show parameter remote_listener;
alter system register;
alter system register;
部署cman
我们规划是在一台宿主机部署2个podman容器搭建RAC,
需要使用cman(Oracle Connection Manager)做连接代理服务器,在宿主机暴露1521端口;
https://github.com/oracle/podman-images/tree/main/OracleDatabase/OracleConnectionManager
https://github.com/oracle/docker-images/issues/2951
podman rm -f racnodepc1-cman
mkdir -p /tmp/raccman_tmp
rm /tmp/raccman_tmp/* -rf
chmod 777 -R /tmp/raccman_tmp
podman create -t -i \
--name racnodepc1-cman \
--hostname racnodepc1-cman \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
--dns-search "example.com" \
--dns 10.0.20.252 \
-e DNS_SERVER=10.0.20.252 \
-e DOMAIN=example.com \
-e PUBLIC_IP=10.0.20.166 \
-e PUBLIC_HOSTNAME=racnodepc1-cman --privileged=false \
-e DB_HOSTDETAILS="HOST=racnodepc1-scan:RULE_ACT=accept,HOST=racnodepc1-cman:RULE_ACT=accept" \
--publish=1521:1521 \
--cap-add=AUDIT_WRITE \
--cap-add=NET_RAW \
--restart=always \
-v /tmp/raccman_tmp:/tmp \
registry.cn-hangzhou.aliyuncs.com/hd2020/ka:cman23.5.0.0
podman network disconnect podman racnodepc1-cman
podman network connect rac_pub1_nw --ip 10.0.20.166 racnodepc1-cman
podman start racnodepc1-cman
podman logs -f racnodepc1-cman
您应该在最后看到cman创建成功的消息:
####################################
CONNECTION MANAGER IS READY TO USE!
####################################
修改cman.ora配置,并重启
vi /root/cman.ora
CMAN_racnodepc1-cman.example.com =
(configuration=
(address=(protocol=tcp)(host=racnodepc1-cman.example.com)(port=1521))
(parameter_list =
(connection_statistics=yes)
(valid_node_checking_registration=on)
(registration_invited_nodes=*)
)
(rule_list=
(rule=
(src=*)(dst=*)(srv=*)(act=accept)
(action_list=(aut=off)(moct=0)(mct=0)(mit=0)(conn_stats=on))
)
(rule=(src=racnodepc1-cman.example.com)(dst=127.0.0.1)(srv=*)(act=accept))
)
)
podman stop racnodepc1-cman
podman cp /root/cman.ora racnodepc1-cman:/u01/app/oracle/product/23ai/client_1/network/admin/cman.ora
podman start racnodepc1-cman
podman logs -f racnodepc1-cman
在其他电脑连接到RAC实例
sqlplus /nolog
conn sys/Qq00000000!@172.17.10.82:1521/orclcdb as sysdba
SQL> select instance_name,status from gv$instance;
INSTANCE_NAME STATUS
---------------- ----------
ORCLCDB1 OPEN
ORCLCDB2 OPEN
Have fun!




