Oracle RAC节点添加完整操作指南:从单机到集群,从两节点到多节点
适用版本:Oracle 12cR2/18c/19c(以19c为例)
适用系统:Oracle Linux 7/8(或同等RHEL版本)
存储要求:ASM(DATA/FRA),多路径或本地盘均可(需共享)
文章中未重点提及服务器环境、磁盘映射等相关事项,需单独额外注意
Oracle官方文档:文档信息 - 适用于 Oracle Real Application Clusters 的 Oracle® Solaris Cluster 数据服务指南
前言 - Oracle Solaris 11.1 管理:SAN 配置和多路径
一、概述
在Oracle RAC环境中,添加节点是常见的运维操作。本文档提供两种典型场景下的节点添加操作指南:
-
场景1:当前RAC已有两个节点(rac1、rac2),需要扩容新增节点(rac3)
-
场景2:当前为单机环境,需要转换为RAC并添加第二个节点(rac2)
无论哪种场景,都需要遵循严格的命名规范、充分的准备工作、正确的操作步骤和全面的验证检查。
二、命名规范与网络规划
2.1 统一命名规范(两个场景通用)
集群信息:
-
集群名称:
orclc -
数据库名(DB_NAME/DB_UNIQUE_NAME):
orcl -
Oracle版本:
19.18(示例) -
用户/组:
-
Grid用户:
grid:oinstall(GI/ASM) -
Oracle用户:
oracle:oinstall(RDBMS)
-
目录规划:
-
Grid Home:
/u01/app/19.0.0/grid -
Oracle Base:
/u01/app/oracle -
RDBMS Home:
/u01/app/oracle/product/19.0.0/dbhome_1
存储规划:
-
ASM磁盘组:
DATA(数据文件)、FRA(快速恢复区) -
存储类型:共享存储(多路径或ASMLIB)
网络规划:
-
SCAN名称:
orclc-scan(DNS或GNS,需要3条A记录) -
公网接口:
bond0/eth0,网段192.168.10.0/24 -
私网接口:
bond1/eth1,网段10.10.10.0/24 -
验证步骤:
-
在所有节点上执行
cat /etc/sysconfig/network-scripts/ifcfg-eth0和cat /etc/sysconfig/network-scripts/ifcfg-eth0,确保配置一致。 -
使用
ping命令测试公网和私网连通性。
-
2.2 节点IP规划
场景1:已有两节点,新增第三节点
| 节点名 | 公网IP | VIP | 私网IP |
|---|---|---|---|
| rac1(已有) | 192.168.10.11 | 192.168.10.111 | 10.10.10.11 |
| rac2(已有) | 192.168.10.12 | 192.168.10.112 | 10.10.10.12 |
| rac3(新增) | 192.168.10.13 | 192.168.10.113 | 10.10.10.13 |
场景2:单机转RAC,新增第二节点
| 节点名 | 公网IP | VIP | 私网IP |
|---|---|---|---|
| rac1(原单机) | 192.168.10.11 | 192.168.10.111 | 10.10.10.11 |
| rac2(新增) | 192.168.10.12 | 192.168.10.112 | 10.10.10.12 |
实例命名规则:
-
场景1:实例名分别为
orcl1、orcl2、orcl3 -
场景2:实例名分别为
orcl1、orcl2
三、操作前准备(两个场景通用)
3.1 环境一致性检查
3.1.1 操作系统一致性
【执行节点】 在所有节点上执行(包括新增节点)
# 1. 检查OS版本和内核版本 cat /etc/oracle-release uname -r # 2. 检查已安装的软件包 rpm -qa |grep -E "oracle|grid|compat|libaio|binutils" | sort # 3. 检查时区设置 timedatectl # 4. 检查NTP/chrony配置 systemctl status chronyd # 或 systemctl status ntpd
要求: 所有节点(包括新增节点)的OS版本、内核版本、补丁级别、时区必须完全一致。
3.1.2 系统参数一致性
【执行节点】 在所有节点上执行(包括新增节点)
# 1. 检查内核参数 cat /etc/sysctl.conf | grep - E"kernel|fs|net|vm" # 2. 检查资源限制 cat /etc/security/limits.conf | grep -E"oracle|grid" # 3. 检查必需的软件包 rpm -qa | grep -E"cvuqdisk|compat-libcap1|libaio|binutils|gcc|gcc-c++|libstdc++|libstdc++-devel"
要求: 所有节点的 /etc/sysctl.conf、/etc/security/limits.conf 配置必须一致。
3.1.3 用户和目录准备
【执行节点】 在所有节点上执行(包括新增节点),需要root权限
# 1. 创建grid用户和组(如果不存在) groupadd -g 54321 oinstall groupadd -g 54322 asmadmin groupadd -g 54323 asmdba groupadd -g 54324 asmoper useradd -u 54321 -g oinstall -G asmadmin,asmdba,asmoper grid # 2. 创建oracle用户和组(如果不存在) groupadd -g 54325 dba groupadd -g 54326 oper useradd -u 54322 -g oinstall -G dba,oper oracle # 3. 创建目录结构 mkdir -p /u01/app/19.0.0/grid mkdir -p /u01/app/oracle mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1 mkdir -p /u01/app/oraInventory # 4. 设置权限 chown -R grid:oinstall /u01/app/19.0.0/grid chown -R oracle:oinstall /u01/app/oracle chown -R grid:oinstall /u01/app/oraInventory chmod -R 775 /u01
3.2 存储准备
3.2.1 共享存储检查
【执行节点】 在所有节点上执行(包括新增节点),需要root权限
# 1. 检查共享LUN是否可见 fdisk -l | grep-i"disk" multipath -ll # 2. 检查ASM磁盘设备 ls -l /dev/oracleasm/disks/ # 或 ls -l /dev/asm* # 3. 验证多路径配置 cat /etc/multipath.conf # 4. 检查udev规则(如果使用udev) ls -l /etc/udev/rules.d/ | grep -i oracle cat /etc/udev/rules.d/99-oracle-asmdevices.rules
要求: 新增节点必须能看到与现有节点相同的共享LUN,设备名和权限必须一致。
-
验证步骤:
-
在现有节点上执行
ls -l /dev/oracleasm/disks/或ls -l /dev/asm*,记录设备名和权限。 -
在新增节点上执行相同命令,确保输出一致。
-
如果使用udev规则,确保
/etc/udev/rules.d/99-oracle-asmdevices.rules文件在所有节点上一致。
-
3.2.2 ASM磁盘组准备
【执行节点】 在任一现有节点上执行(如rac1),以grid用户执行
su - grid asmcmd lsdg asmcmd lsdsk
要求: 确保ASM磁盘组状态正常,新增节点可以访问相同的磁盘。
3.3 网络准备
3.3.1 网络配置
【执行节点】 在所有节点上执行(包括新增节点),需要root权限
# 1. 配置网络接口 cat /etc/sysconfig/network-scripts/ifcfg-eth0 # 公网 cat /etc/sysconfig/network-scripts/ifcfg-eth1 # 私网 # 2. 配置/etc/hosts文件(所有节点必须一致) cat /etc/hosts # 示例内容: # 192.168.10.11 rac1 rac1.example.com # 192.168.10.12 rac2 rac2.example.com # 192.168.10.13 rac3 rac3.example.com # 192.168.10.111 rac1-vip rac1-vip.example.com # 192.168.10.112 rac2-vip rac2-vip.example.com # 192.168.10.113 rac3-vip rac3-vip.example.com # 10.10.10.11 rac1-priv rac1-priv.example.com # 10.10.10.12 rac2-priv rac2-priv.example.com # 10.10.10.13 rac3-priv rac3-priv.example.com # 192.168.10.100 orclc-scan orclc-scan.example.com # 192.168.10.101 orclc-scan orclc-scan.example.com # 192.168.10.102 orclc-scan orclc-scan.example.com # 3. 测试网络连通性(从任一节点执行) ping -c 3 rac1 ping -c 3 rac2 ping -c 3 rac1-priv ping -c 3 rac2-priv
3.3.2 SCAN和DNS配置
【执行节点】 在任一节点上执行(如rac1)
# 1. 测试SCAN解析 nslookup orclc-scan # 或 dig orclc-scan # 2. 验证SCAN有3条A记录(场景1需要,场景2至少1条) # 应该返回3个不同的IP地址
要求:
-
所有节点的
/etc/hosts必须完全一致 -
SCAN名称必须正确解析(DNS或hosts)
-
VIP地址未被占用
-
公网和私网连通性正常
3.4 SSH互信配置
【执行节点】 在任一现有节点上执行(如rac1)
# 1. 为grid用户配置SSH互信 su - grid ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa ssh-keygen -t dsa -N '' -f ~/.ssh/id_dsa # 2. 将公钥复制到所有节点(包括新增节点) # 场景1:rac1 rac2 rac3 # 场景2:rac1 rac2 fornodein rac1 rac2 rac3; do # 场景1使用 # for node in rac1 rac2; do # 场景2使用 ssh-copy-id -i ~/.ssh/id_rsa.pub grid@$node ssh-copy-id -i ~/.ssh/id_dsa.pub grid@$node done # 3. 测试互信 fornodein rac1 rac2 rac3; do # 场景1使用 # for node in rac1 rac2; do # 场景2使用 ssh grid@$node"hostname; date" done # 4. 为oracle用户配置SSH互信 su- oracle ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa ssh-keygen -t dsa -N '' -f ~/.ssh/id_dsa fornodein rac1 rac2 rac3; do # 场景1使用 # for node in rac1 rac2; do # 场景2使用 ssh-copy-id -i ~/.ssh/id_rsa.pub oracle@$node ssh-copy-id -i ~/.ssh/id_dsa.pub oracle@$node done fornodein rac1 rac2 rac3; do # 场景1使用 # for node in rac1 rac2; do # 场景2使用 ssh oracle@$node"hostname; date" done
要求: grid和oracle用户在所有节点之间必须能够无密码SSH登录。
3.5 防火墙和SELinux配置
【执行节点】 在所有节点上执行(包括新增节点),需要root权限
# 1. 检查防火墙状态 systemctl status firewalld # 或 systemctl status iptables # 2. 关闭防火墙(生产环境建议关闭或放行必要端口) systemctl stop firewalld systemctl disable firewalld # 3. 检查SELinux状态 getenforce # 4. 设置SELinux为permissive或disabled setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
要求: 生产环境建议关闭防火墙或放行Oracle所需端口;SELinux设置为permissive或disabled。
3.6 软件介质准备
3.6.1 场景1:已有两节点,新增第三节点
介质放置位置: 只需要在执行安装的现有节点(如rac1)上准备介质,不需要在新节点(rac3)上准备。
原因: 使用 gridSetup.sh -addNodes 或 addnode.sh 时,工具会从现有节点的ORACLE_HOME自动将软件通过网络复制到新节点。
# 在rac1节点(执行安装的节点)上准备介质
# 1. Grid Infrastructure安装介质(可选,通常使用现有$ORACLE_HOME)
# 如果需要重新安装,准备:
ls -lh /home/grid/gi_19c/
# 2. Database软件安装介质(可选,通常使用现有$ORACLE_HOME)
# 如果需要重新安装,准备:
ls -lh /home/oracle/db_19c/
# 注意:实际操作中,通常直接使用现有节点的$ORACLE_HOME执行addnode.sh
# 例如:cd $ORACLE_HOME && ./addnode.sh -silent "CLUSTER_NEW_NODES={rac3}"
要求:
-
如果使用现有ORACLE_HOME的addnode.sh方式,不需要单独准备安装介质
-
如果需要重新安装,确保介质版本与现有环境一致
-
确保执行安装的节点与新节点之间网络连通正常(用于传输软件)
3.6.2 场景2:单机转RAC,新增第二节点
介质放置位置: 只需要在第一个节点(rac1)上准备介质,不需要在rac2上准备。
原因: 在rac1上安装GI和数据库软件后,使用 addnode.sh 会自动将软件复制到rac2。
# 在rac1节点上准备介质 # 1. Grid Infrastructure安装介质(必需) ls -lh /home/grid/gi_19c/ # 2. Database软件安装介质(必需) ls -lh /home/oracle/db_19c/
要求:
-
介质版本必须与计划安装的版本一致
-
确保rac1和rac2之间网络连通正常(用于传输软件)
-
如果有共享存储/NFS,也可以将介质放在共享位置,方便访问
3.7 备份准备
【执行节点】 在任一现有节点上执行(如rac1)
# 1. 备份OCR和Voting Disk(以grid用户执行) su - grid ocrconfig -manualbackup ocrconfig -showbackup # 2. 备份数据库spfile和密码文件(以oracle用户执行) su - oracle rman target / <<EOF backup spfile; backup current controlfile; exit; EOF # 3. 备份重要参数文件 sqlplus / as sysdba <<EOF create pfile='/tmp/init_orcl_backup.ora' from spfile; exit; EOF # 4. 备份数据库(建议完整备份) # 备份数据库:备份所有数据文件(包括控制文件、spfile) # 备份归档日志:备份所有归档日志文件 rman target / <<EOF backup database plus archivelog; exit; EOF # # backup database plus archivelog; # 等价如下两条命令 # backup database; # backup archivelog all;
要求: 操作前必须完成OCR、Voting Disk和数据库的备份。
-
验证步骤:
-
执行
ocrconfig -showbackup查看OCR备份文件。 -
检查RMAN备份日志,确保没有错误。
-
验证备份文件是否存在:
ls -lh /path/to/backup/
-
3.8 CVU预检
【执行节点】 在任一现有节点上执行(建议:rac1),以grid用户执行
# 场景1:新增节点预检 su - grid cluvfy stage -pre nodeadd -n rac3 -verbose # 如果预检失败,使用fixup自动修复 cluvfy stage -pre nodeadd -n rac3 -fixup -verbose # 场景2:集群安装预检 cluvfy stage -pre crsinst -n rac1,rac2 -method root -verbose cluvfy stage -pre hacfg -n rac1,rac2 -verbose
要求: 所有预检必须通过,否则需要修复问题后再继续。
四、场景1:RAC已有两节点,新增第三节点
4.1 新节点操作系统准备(rac3)
在新增节点rac3上执行以下操作:
【执行节点】 在rac3节点上执行,需要root权限
# 1. 安装与rac1/rac2相同版本的OS和补丁 # 2. 配置网络接口和IP地址(公网/私网/VIP) # 3. 配置/etc/hosts(与rac1/rac2完全一致) # 4. 创建grid和oracle用户及目录结构 # 5. 配置共享存储(udev/ASMLIB) # 6. 关闭防火墙和SELinux # 7. 配置系统参数(sysctl.conf、limits.conf) # 8. 安装必需的软件包
4.2 建立SSH互信
【执行节点】 在任一现有节点(建议:rac1)上执行
su - grid # 使用Grid Home自带的SSH配置工具(推荐) cd$ORACLE_HOME ./sshUserSetup.sh -user grid -hosts "rac1 rac2 rac3" -noPromptPassphrase # 或手动配置(见3.4节) # 为oracle用户配置 su- oracle cd$ORACLE_HOME ./sshUserSetup.sh -user oracle -hosts "rac1 rac2 rac3" -noPromptPassphrase # 验证互信 ssh grid@rac3 "hostname" ssh oracle@rac3 "hostname"
4.3 扩容Grid Infrastructure到新节点
【执行节点】 主要步骤在任一现有节点(建议:rac1)上执行,以grid用户执行;root.sh在rac3节点执行
su - grid
cd$ORACLE_HOME
# 方法1:使用gridSetup.sh(19c推荐)
./gridSetup.sh -silent-addNodes \
"CLUSTER_NEW_NODES={rac3}" \
-responseFile /u01/app/19.0.0/grid/install/response/grid_addnode.rsp
# 方法2:使用addnode.sh(早期版本)
cd $ORACLE_HOME/oui/bin
./addnode.sh -silent"CLUSTER_NEW_NODES={rac3}"
# 安装过程中会提示到rac3以root执行root.sh
# 【执行节点】在rac3节点执行,需要root权限
ssh root@rac3
/u01/app/19.0.0/grid/root.sh
# 【执行节点】在任一现有节点(如rac1)上执行,以grid用户执行
# 验证GI扩容
su - grid
crsctl check cluster -all
olsnodes -n -t
crsctl stat res -t
cluvfy stage -post nodeadd -n rac3 -verbose
4.4 验证ASM实例
【执行节点】 在任一节点上执行(建议:rac1),以grid用户执行
su - grid # 检查ASM磁盘组 asmcmd lsdg # 检查ASM实例状态 srvctl status asm -n rac3 srvctl status asm # 检查ASM磁盘可见性 asmcmd lsdsk
4.5 扩容数据库软件Home到新节点
【执行节点】 主要步骤在任一现有节点(建议:rac1)上执行,以oracle用户执行;root脚本在rac3节点执行
su - oracle
cd $ORACLE_HOME
# 使用addnode.sh扩容数据库软件
./addnode.sh -silent"CLUSTER_NEW_NODES={rac3}"
# 【执行节点】在rac3节点执行,需要root权限
# 如果提示,在rac3节点以root执行
ssh root@rac3
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh
# 【执行节点】在任一现有节点(如rac1)上执行,以oracle用户执行
# 验证数据库软件安装
su - oracle
$ORACLE_HOME/OPatch/opatch lsinventory -nodes rac1,rac2,rac3
4.6 新增数据库实例到新节点
【执行节点】 主要步骤在任一现有节点(建议:rac1)上执行,以oracle用户执行;方法2的步骤2在rac3节点执行
su - oracle # 方法1:使用DBCA(推荐) dbca -silent-addInstance \ -gdbName orcl \ -nodeName rac3 \ -instanceName orcl3 \ -sysPassword'Sys#Passw0rd' \ -systemPassword'System#Passw0rd' \ -storageType ASM \ -diskGroupName DATA \ -redoLogFileSize1024 \ -nodelist rac1,rac2,rac3 # 方法2:使用srvctl手动创建(备选) # 1. 添加实例配置(在任一现有节点执行) srvctl add instance -d orcl -i orcl3 -n rac3 # 【执行节点】在rac3节点执行,以oracle用户执行 # 2. 创建实例的spfile和密码文件(在rac3节点) ssh rac3 su - oracle exportORACLE_SID=orcl3 exportORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 sqlplus / as sysdba <<EOF startup nomount; create spfile='+DATA/orcl/spfileorcl3.ora' from memory; shutdown immediate; exit; EOF # 创建密码文件 orapwd file=$ORACLE_HOME/dbs/orapworcl3 password='Sys#Passw0rd'force=y # 【执行节点】在任一现有节点(如rac1)上执行,以oracle用户执行 # 3. 启动实例 srvctl start instance -d orcl -i orcl3
4.7 验证服务状态
【执行节点】 在任一节点上执行(建议:rac1)
# 检查监听器(以grid用户执行) su - grid srvctl status scan_listener srvctl status listener -n rac3 srvctl status listener # 检查数据库(以oracle用户执行) su - oracle srvctl status database -d orcl srvctl status service-d orcl # 检查实例 sqlplus / as sysdba <<EOF select inst_id, instance_name, host_name, status from gv$instance; exit; EOF
五、场景2:单机转RAC,新增第二节点
5.1 前提条件
重要提示:
-
单机数据库必须已经使用ASM存储(如果使用文件系统,需要先迁移到ASM)
-
数据库必须处于归档模式
-
建议在业务低峰期执行
5.2 两节点OS/存储/网络统一准备
【执行节点】 在rac1和rac2两个节点上执行相同的准备工作,需要root权限
# 1. 安装相同版本的OS和补丁 # 2. 配置网络接口(公网/私网/VIP) # 3. 配置/etc/hosts(两节点完全一致) # 4. 创建grid和oracle用户及目录 # 5. 配置共享存储(两节点可见相同LUN) # 6. 关闭防火墙和SELinux # 7. 配置系统参数 # 8. 安装必需软件包 # 9. 配置SSH互信(grid和oracle用户)
5.3 安装Grid Infrastructure(创建集群)
【执行节点】 主要步骤在rac1节点上执行,以grid用户执行;root.sh在两节点分别执行
su - grid # 1. 预检 cluvfy stage -pre crsinst -n rac1,rac2 -method root -verbose cluvfy stage -pre hacfg -n rac1,rac2 -verbose # 2. 安装GI(使用响应文件) cd /home/grid/gi_19c ./gridSetup.sh -silent-responseFile ./grid_install.rsp \ INVENTORY_LOCATION=/u01/app/oraInventory \ oracle.install.option=CRS_CONFIG \ ORACLE_BASE=/u01/app/grid \ oracle.install.asm.OSDBA=asmdba \ oracle.install.asm.OSASM=asmadmin \ oracle.install.crs.config.clusterName=orclc \ oracle.install.crs.config.gpnp.scanName=orclc-scan \ oracle.install.crs.config.gpnp.scanPort=1521 \ oracle.install.crs.config.clusterNodes=rac1:rac1-vip,rac2:rac2-vip \ oracle.install.crs.config.networkInterfaceList=bond0:192.168.10.0:1,bond1:10.10.10.0:5 \ oracle.install.asm.diskGroup.name=DATA \ oracle.install.asm.diskGroup.redundancy=EXTERNAL \ oracle.install.asm.diskGroup.disks=/dev/oracleasm/disks/DATA* \ oracle.install.asm.SYSASMPassword='Asm#Passw0rd' \ oracle.install.crs.rootconfig.executeRootScript=false # 3. 在两节点上以root执行root.sh # 【执行节点】在rac1节点执行,需要root权限 ssh root@rac1 /u01/app/19.0.0/grid/root.sh # 【执行节点】在rac2节点执行,需要root权限 ssh root@rac2 /u01/app/19.0.0/grid/root.sh # 【执行节点】在rac1节点上执行,以grid用户执行 # 4. 验证集群 su - grid crsctl check cluster -all olsnodes -n -t crsctl stat res -t
注意: 如果原单机已经安装了GI(SIHA),需要先卸载或按官方文档转换为RAC模式。
5.4 安装数据库软件到两节点
【执行节点】 主要步骤在rac1节点上执行,以oracle用户执行;root脚本在两节点分别执行
su - oracle
# 方法1:在rac1安装,然后扩容到rac2
cd /home/oracle/db_19c
./runInstaller -silent-responseFile ./db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_BASE=/u01/app/oracle \
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 \
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
# 【执行节点】在rac1节点执行,需要root权限
ssh root@rac1
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh
# 【执行节点】在rac1节点上执行,以oracle用户执行
# 扩容到rac2
cd $ORACLE_HOME
./addnode.sh -silent"CLUSTER_NEW_NODES={rac2}"
# 【执行节点】在rac2节点执行,需要root权限
ssh root@rac2
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh
# 方法2:使用Gold Image克隆(推荐,更快)
# 【执行节点】在rac1节点上执行,以oracle用户执行
# 在rac1上创建gold image
cd $ORACLE_HOME
./runInstaller -silent-cloneOracleHome \
ORACLE_BASE=/u01/app/oracle \
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
# 打包并传输到rac2
tar -czf dbhome_gold.tar.gz -C /u01/app/oracle/product/19.0.0 dbhome_1
scp dbhome_gold.tar.gz oracle@rac2:/u01/app/oracle/product/19.0.0/
# 【执行节点】在rac2节点执行,以oracle用户执行
# 在rac2解压并配置
ssh rac2
cd /u01/app/oracle/product/19.0.0
tar -xzf dbhome_gold.tar.gz
cd dbhome_1
./runInstaller -silent-cloneOracleHome \
ORACLE_BASE=/u01/app/oracle \
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 \
ORACLE_HOME_NAME=OraDB19000_home1 \
-invPtrLoc /u01/app/oraInventory/oraInst.loc
5.5 将单实例数据库转换为RAC
【执行节点】 主要步骤在rac1节点上执行,以oracle用户执行;方法3的步骤4在rac2节点执行
su - oracle # 方法1:使用DBCA转换(推荐,简单直接) dbca -silent-convertToRAC \ -gdbName orcl \ -nodelist rac1,rac2 \ -instanceNodeList rac1:orcl1,rac2:orcl2 \ -storageType ASM \ -sharedPassword'Sys#Passw0rd' \ -redoLogFileSize1024 # 方法2:使用rconfig工具(更灵活,可自定义XML) # 1. 复制模板 cp $ORACLE_HOME/assistants/rconfig/sampleXMLs/ConvertToRAC.xml /tmp/ConvertToRAC.xml # 2. 编辑XML文件 vi /tmp/ConvertToRAC.xml # 关键配置示例: # <SourceDBInfo SID="orcl"/> # <ConvertToRAC true="true"/> # <NodeList>rac1,rac2</NodeList> # <InstancePrefix>orcl</InstancePrefix> # <SharedStorage true="true"/> # <StorageType>ASM</StorageType> # <DiskGroupName>DATA</DiskGroupName> # 3. 执行转换 rconfig /tmp/ConvertToRAC.xml # 方法3:手动转换(复杂,不推荐) # 1. 修改spfile参数(在rac1节点执行) sqlplus / as sysdba <<EOF alter system setcluster_database=truescope=spfile; alter system setcluster_database_instances=2scope=spfile; alter system setinstance_number=1scope=spfile sid='orcl1'; alter system setinstance_number=2scope=spfile sid='orcl2'; alter system setthread=1scope=spfile sid='orcl1'; alter system setthread=2scope=spfile sid='orcl2'; alter system setinstance_name=orcl1 scope=spfile sid='orcl1'; alter system setinstance_name=orcl2 scope=spfile sid='orcl2'; shutdown immediate; exit; EOF # 2. 注册数据库到集群(在rac1节点执行) srvctl add database -d orcl -o $ORACLE_HOME -p '+DATA/orcl/spfileorcl.ora' # 3. 添加实例(在rac1节点执行) srvctl add instance -d orcl -i orcl1 -n rac1 srvctl add instance -d orcl -i orcl2 -n rac2 # 【执行节点】在rac2节点执行,以oracle用户执行 # 4. 创建rac2上的实例文件 # 在rac2节点创建密码文件 ssh rac2 su - oracle exportORACLE_SID=orcl2 orapwd file=$ORACLE_HOME/dbs/orapworcl2 password='Sys#Passw0rd' force=y # 【执行节点】在rac1节点上执行,以oracle用户执行 # 5. 启动数据库 srvctl start database -d orcl
5.6 验证转换结果
【执行节点】 在任一节点上执行(建议:rac1)
# 检查监听器(以grid用户执行) su - grid srvctl status scan_listener srvctl status listener -n rac1 srvctl status listener -n rac2 # 检查数据库(以oracle用户执行) su - oracle srvctl status database -d orcl srvctl status service-d orcl # 检查实例 sqlplus / as sysdba <<EOF select inst_id, instance_name, host_name, status from gv$instance; select name, open_mode, database_role from v$database; exit; EOF
六、操作后检查(两个场景通用)
6.1 集群和节点检查
【执行节点】 在任一节点上执行(建议:rac1,也可以每个节点上都检查),以grid用户执行
# 1. 检查节点列表 su - grid olsnodes -n -t # 应该显示所有节点及其状态 # 2. 检查集群完整性 crsctl check cluster -all # 3. 检查集群资源状态 crsctl stat res -t # 所有资源应该显示为ONLINE状态 # 4. 检查CRS服务 crsctl check crs # 5. 执行CVU后检查 cluvfy stage -post nodeadd -n rac3 -verbose # 场景1 # 或 cluvfy stage -post hwos -n rac1,rac2 -verbose # 场景2
6.2 ASM和存储检查
【执行节点】 在任一节点上执行(建议:rac1,也可以每个节点上哦度进行检查),以grid用户执行
su - grid # 1. 检查ASM磁盘组 asmcmd lsdg # 所有磁盘组状态应该为NORMAL # 2. 检查ASM实例状态 srvctl status asm -n rac1 srvctl status asm -n rac2 srvctl status asm -n rac3 # 场景1 # 3. 检查ASM磁盘 asmcmd lsdsk
6.3 监听器和网络检查
【执行节点】 在任一节点上执行(建议:rac1,也可以每个节点上都检查),以grid用户执行
su - grid # 1. 检查SCAN监听器 srvctl status scan srvctl status scan_listener # 2. 检查节点监听器 srvctl status listener -n rac1 srvctl status listener -n rac2 srvctl status listener -n rac3 # 场景1 # 3. 测试SCAN连接 tnsping orclc-scan:1521/orcl # 4. 检查VIP状态 srvctl status vip -n rac1 srvctl status vip -n rac2 srvctl status vip -n rac3 # 场景1
6.4 数据库实例检查
【执行节点】 在任一节点上执行(建议:rac1,也可以每个节点都检查),以oracle用户执行
su - oracle # 1. 检查数据库状态 srvctl status database -d orcl # 2. 检查所有实例 sqlplus / as sysdba <<EOF select inst_id, instance_name, host_name, status, database_status from gv$instance order by inst_id; exit; EOF # 3. 检查数据库参数 sqlplus / as sysdba <<EOF show parameter cluster_database show parameter cluster_database_instances show parameter instance_name show parameter instance_number exit; EOF # 4. 检查服务状态 srvctl status service-d orcl srvctl config service-d orcl
6.5 数据库连接测试
【执行节点】 在任一节点上执行(建议:rac1,也可以每个节点都检查),以oracle用户执行
su - oracle
# 1. 通过SCAN连接测试
sqlplus system/System#Passw0rd@orclc-scan:1521/orcl <<EOF
select instance_name, host_name from v$instance;
exit;
EOF
# 2. 通过VIP连接测试
sqlplus system/System#Passw0rd@rac1-vip:1521/orcl <<EOF
select instance_name, host_name from v$instance;
exit;
EOF
# 3. 测试负载均衡
# 多次连接SCAN,应该轮询到不同实例
for i in {1..10}; do
sqlplus -s system/System#Passw0rd@orclc-scan:1521/orcl <<EOF | grep "INSTANCE_NAME"
select instance_name from v$instance;
exit;
EOF
done
6.6 日志检查
【执行节点】 在任一节点上执行(建议:rac1,也可以每个节点上都检查)
# 1. 检查Grid日志(以grid用户执行) su - grid tail -100$ORACLE_HOME/log/rac1/agent/ohasd/orarootagent_root/orarootagent_root.log tail -100$ORACLE_HOME/log/rac1/crsd/crsd.log # 2. 检查数据库告警日志(以oracle用户执行) su- oracle tail -100 $ORACLE_BASE/diag/rdbms/orcl/orcl1/trace/alert_orcl1.log tail -100 $ORACLE_BASE/diag/rdbms/orcl/orcl2/trace/alert_orcl2.log tail -100 $ORACLE_BASE/diag/rdbms/orcl/orcl3/trace/alert_orcl3.log # 场景1 # 3. 检查是否有错误(在任一节点执行) grep -i error $ORACLE_HOME/log/rac*/crsd/crsd.log | tail -20 grep -i error $ORACLE_BASE/diag/rdbms/orcl/*/trace/alert_*.log | tail -20
6.7 性能检查
【执行节点】 在任一节点上执行(建议:rac1,也可以是相关数据库连接工具),以oracle用户执行
su - oracle
sqlplus / as sysdba <<EOF
-- 检查等待事件
select event, count(*) as wait_count, sum(time_waited) as total_time
from gv$session_wait
where wait_class <> 'Idle'
group by event
order by wait_count desc
fetch first 10 rows only;
-- 检查活动会话
select count(*) as active_sessions
from gv$session
where status ='ACTIVE' and username is not null;
-- 检查资源使用
select resource_name, current_utilization, max_utilization,
round(current_utilization/max_utilization*100, 2) as usage_pct
from v$resource_limit
where resource_name in ('processes', 'sessions', 'transactions')
order by usage_pct desc;
exit;
EOF
6.8 业务验证
【执行节点】 在任一节点上执行(建议:rac1,也可以使用相关数据库连接工具)
# 1. 测试应用连接 # 从应用服务器或客户端测试连接SCAN # 2. 验证服务注册(以oracle用户执行) su - oracle lsnrctl services LISTENER # 3. 检查服务配置 sqlplus / as sysdba <<EOF select name, network_name, goal, clb_goal, enabled from dba_services order by name; exit; EOF # 4. 验证数据完整性 sqlplus / as sysdba <<EOF -- 检查表空间状态 select tablespace_name, status from dba_tablespaces; -- 检查数据文件状态 select name, status from v$datafile; -- 检查控制文件 select name, status from v$controlfile; -- 检查重做日志 select group#, thread#, status, archived from v$log; exit; EOF
七、常见问题与处理
7.1 CVU预检失败
问题: cluvfy预检报错,缺少软件包或参数配置不正确
处理:
【执行节点】 步骤1在任一现有节点(如rac1)上执行,以grid用户执行;步骤2和3在问题节点上执行,需要root权限
# 1. 使用fixup自动修复 cluvfy stage -pre nodeadd -n rac3 -fixup -verbose # 2. 手动安装缺失的包 yum install -y <package_name> # 3. 手动调整参数 # 编辑/etc/sysctl.conf和/etc/security/limits.conf # 然后执行sysctl -p
7.2 共享存储不可见
问题: 新增节点看不到共享LUN
处理:
【执行节点】 在问题节点上执行,需要root权限
# 1. 检查HBA和存储zone配置 # 2. 检查多路径配置 multipath -ll cat /etc/multipath.conf # 3. 检查udev规则 ls -l /etc/udev/rules.d/ | grep oracle cat /etc/udev/rules.d/99-oracle-asmdevices.rules # 4. 检查ASMLIB(如果使用) /etc/init.d/oracleasm listdisks /etc/init.d/oracleasm scandisks # 5. 确保设备名和权限一致 ls -l /dev/oracleasm/disks/
7.3 VIP或SCAN解析异常
问题: VIP无法启动或SCAN无法解析
处理:
【执行节点】 步骤1-3在任一节点上执行(如rac1);步骤4在任一节点上执行(如rac1),以grid用户执行;步骤5在问题节点上执行,需要root权限
# 1. 检查DNS配置 nslookup orclc-scan dig orclc-scan # 2. 检查/etc/hosts cat /etc/hosts | grep-E"scan|vip" # 3. 检查VIP是否被占用 ping rac1-vip ping rac2-vip # 4. 手动启动VIP srvctl start vip -n rac3 # 5. 检查网络接口 ifconfig eth0
7.4 root.sh执行失败
问题: root.sh脚本执行失败
处理:
【执行节点】 步骤1和3在问题节点上执行,需要root权限;步骤2在任一节点上执行(如rac1),以grid用户执行
# 1. 查看root.sh日志 tail -100 /u01/app/oraInventory/logs/installActions*.log # 2. 检查OCR和Voting Disk ocrcheck crsctl query css votedisk # 3. 根据错误信息修复问题后重新执行 # 注意:重新执行root.sh前需要清理之前的部分配置
7.5 DBCA转换失败
问题: 单机转RAC时DBCA失败
处理:
【执行节点】 步骤1、2、5在rac1节点上执行,以oracle用户执行;步骤3、4在任一节点上执行(如rac1),以grid用户执行
# 1. 检查DBCA日志 tail -200 $ORACLE_BASE/cfgtoollogs/dbca/orcl/trace.log # 2. 确保数据库在归档模式 sqlplus / as sysdba <<EOF archive log list; exit; EOF # 3. 确保spfile和密码文件在ASM上 # 4. 检查ASM磁盘组空间 asmcmd lsdg # 5. 重新执行转换
7.6 服务未注册到监听器
问题: 数据库服务未在监听器中注册
处理:
【执行节点】 步骤1、2在任一节点上执行(如rac1),以oracle用户执行;步骤3在问题节点上执行(如rac1),以grid用户执行
# 1. 检查local_listener和remote_listener参数 sqlplus / as sysdba <<EOF show parameter local_listener show parameter remote_listener exit; EOF # 2. 手动注册服务 srvctl add service-d orcl -s <service_name> -r orcl1 -a orcl2 srvctl startservice-d orcl -s <service_name> # 3. 重启监听器 srvctl stop listener -n rac1 srvctl start listener -n rac1
八、回滚方案
8.1 场景1回滚(新增节点失败)
【执行节点】 步骤1在任一现有节点(如rac1)上执行;步骤2在任一现有节点(如rac1)上执行,以grid用户执行;步骤3在rac3节点执行,需要root权限
# 1. 停止新节点上的服务(以oracle用户执行)
su - oracle
srvctl stop instance -d orcl -i orcl3
srvctl remove instance -d orcl -i orcl3 -f
su - grid
srvctl stop listener -n rac3
srvctl remove listener -n rac3 -f
srvctl stop vip -n rac3
srvctl remove vip -n rac3 -f
# 2. 从集群中删除节点(在任一现有节点执行,以grid用户执行)
crsctl stop crs -n rac3
cd$ORACLE_HOME
./gridSetup.sh -silent-removeNodes"CLUSTER_NODES={rac3}"
# 3. 清理新节点上的文件
# 在rac3节点执行
rm -rf /u01/app/19.0.0/grid
rm -rf /u01/app/oracle/product/19.0.0/dbhome_1
rm -rf /etc/oracle
8.2 场景2回滚(单机转RAC失败)
【执行节点】 在rac1节点上执行,以oracle用户执行
# 1. 如果转换未完成,可以恢复spfile sqlplus / as sysdba <<EOF create spfile='+DATA/orcl/spfileorcl.ora' from pfile='/tmp/init_orcl_backup.ora'; shutdown immediate; startup; exit; EOF # 2. 如果已部分转换,需要清理RAC配置(在rac1节点执行,以oracle用户执行) srvctl remove database -d orcl -f srvctl remove instance -d orcl -i orcl1 -f srvctl remove instance -d orcl -i orcl2 -f # 3. 修改参数为单实例(在rac1节点执行,以oracle用户执行) sqlplus / as sysdba <<EOF alter system setcluster_database=falsescope=spfile; alter system reset cluster_database_instances scope=spfile; shutdown immediate; startup; exit; EOF
九、实用命令速查表
9.1 集群管理命令
【执行节点】 在任一节点上执行,以grid用户执行
# 查看节点 olsnodes -n -t # 查看集群资源 crsctl stat res -t # 检查集群状态 crsctl check cluster -all # 检查CRS服务 crsctl check crs
9.2 ASM管理命令
【执行节点】 在任一节点上执行,以grid用户执行
# 查看磁盘组 asmcmd lsdg # 查看ASM实例状态 srvctl status asm # 查看ASM磁盘 asmcmd lsdsk
9.3 监听器管理命令
【执行节点】 在任一节点上执行,以grid用户执行
# 查看SCAN监听器 srvctl status scan_listener # 查看节点监听器 srvctl status listener -n <node> # 查看所有监听器 srvctl status listener
9.4 数据库管理命令
【执行节点】 在任一节点上执行,以oracle用户执行
# 查看数据库状态 srvctl status database -d orcl # 查看实例状态 srvctl status instance -d orcl -i orcl1 # 查看服务状态 srvctl status service-d orcl # 查看所有实例 sqlplus / as sysdba <<EOF select inst_id, instance_name, host_name, status from gv$instance; exit; EOF
十、注意事项与最佳实践
-
备份优先:操作前必须备份OCR、Voting Disk和数据库
-
环境一致性:确保所有节点OS版本、补丁、配置完全一致
-
分步验证:每执行一步操作后立即验证,确认无误后再继续
-
维护窗口:选择业务低峰期执行,预留充足时间
-
测试验证:生产环境操作前,务必在测试环境完整验证
-
文档记录:详细记录操作过程和遇到的问题
-
监控观察:操作完成后持续监控至少24小时
-
团队协作:提前通知应用团队,确保连接切换准备就绪
3051

被折叠的 条评论
为什么被折叠?



