Oracle RAC节点添加完整操作指南:从单机到集群,从两节点到多节点

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 配置和多路径

RAC One Node


一、概述

在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:已有两节点,新增第三节点

节点名公网IPVIP私网IP
rac1(已有)192.168.10.11192.168.10.11110.10.10.11
rac2(已有)192.168.10.12192.168.10.11210.10.10.12
rac3(新增)192.168.10.13192.168.10.11310.10.10.13

场景2:单机转RAC,新增第二节点

节点名公网IPVIP私网IP
rac1(原单机)192.168.10.11192.168.10.11110.10.10.11
rac2(新增)192.168.10.12192.168.10.11210.10.10.12

实例命名规则:

  • 场景1:实例名分别为 orcl1orcl2orcl3

  • 场景2:实例名分别为 orcl1orcl2


三、操作前准备(两个场景通用)

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

十、注意事项与最佳实践

  1. 备份优先:操作前必须备份OCR、Voting Disk和数据库

  2. 环境一致性:确保所有节点OS版本、补丁、配置完全一致

  3. 分步验证:每执行一步操作后立即验证,确认无误后再继续

  4. 维护窗口:选择业务低峰期执行,预留充足时间

  5. 测试验证:生产环境操作前,务必在测试环境完整验证

  6. 文档记录:详细记录操作过程和遇到的问题

  7. 监控观察:操作完成后持续监控至少24小时

  8. 团队协作:提前通知应用团队,确保连接切换准备就绪

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值