RHEL 6.10 + Oracle 11.2.0.4 RAC 高可用集群部署指南
这是一套可完整复现的Oracle 11g RAC双节点集群部署笔记,基于VirtualBox虚拟机环境,所有步骤均亲测有效。无需丰富的Linux或Oracle经验,跟着步骤操作即可成功搭建。如有错误,欢迎批评指正。
一、环境准备
1.1 VirtualBox 配置
打开 VirtualBox,进入「管理 → 主机网络管理器」,创建 Host-Only 网卡,默认网段为 192.168.56.1/24,关闭DHCP服务器,用于集群公网通信。
1.2 软件清单
提前下载以下文件,放在宿主机易访问目录(如 D:\software\):
| 文件名 | 说明 |
|---|---|
rhel-server-6.10-x86_64-dvd.iso | RHEL 6.10 操作系统镜像 |
p13390677_112040_Linux-x86-64_1of7.zip | Oracle 11g 数据库安装包分卷1 |
p13390677_112040_Linux-x86-64_2of7.zip | Oracle 11g 数据库安装包分卷2 |
p13390677_112040_Linux-x86-64_3of7.zip | Oracle Grid Infrastructure 安装包 |
rlwrap-0.42-1.el6.x86_64.rpm | sqlplus/rman 命令行增强工具(可选) |
1.3 网络规划
| 节点 | 主机名 | 公网IP(Public) | 虚拟IP(VIP) | 私有IP(Private) |
|---|---|---|---|---|
| 节点1 | rac1 | 192.168.56.71 | 192.168.56.81 | 10.10.10.71 |
| 节点2 | rac2 | 192.168.56.72 | 192.168.56.82 | 10.10.10.72 |
| SCAN | rac-scan | 192.168.56.83 | - | - |
规划说明:
- Public IP:用于客户端连接和管理
- Private IP:用于集群内部心跳和Cache Fusion,使用独立网段
- VIP:浮动IP,用于实现故障转移
- SCAN IP:客户端统一访问入口,集群自动分配后端实例
1.4 磁盘空间规划
| 磁盘类型 | 大小 | 用途 | VirtualBox配置 |
|---|---|---|---|
| 系统盘(rac1) | 100 GB | RHEL操作系统 + Oracle软件 | SATA控制器,固定大小VMDK |
| 系统盘(rac2) | 100 GB | RHEL操作系统 + Oracle软件 | SATA控制器,固定大小VMDK |
| 共享磁盘1 | 2 GB | OCR和Voting Disk | SCSI控制器,共享模式VMDK |
| 共享磁盘2 | 2 GB | OCR和Voting Disk | SCSI控制器,共享模式VMDK |
| 共享磁盘3 | 2 GB | OCR和Voting Disk | SCSI控制器,共享模式VMDK |
| 共享磁盘4(DATA) | 20 GB | 数据库数据文件 | SCSI控制器,共享模式VMDK |
| 共享磁盘5(ARCH) | 10 GB | 归档日志和闪回区 | SCSI控制器,共享模式VMDK |
二、创建第一台虚拟机并安装操作系统(rac1)
2.1 创建虚拟机 rac1
- 打开 VirtualBox,点击「新建」,名称设为
rac1,选择相应的操作系统镜像文件 - 内存分配4096MB,创建100GB固定大小VMDK虚拟磁盘
- 启动顺序:硬盘优先,移除软驱
2.2 创建并添加共享磁盘
- 创建磁盘并设置为共享模式
- 将共享磁盘附加到rac1:
- 选中rac1 → 设置 → 存储 → 添加SCSI控制器
- 选中SCSI控制器 → 添加虚拟硬盘 → 使用现有的虚拟硬盘,依次添加上述5个VMDK文件
2.3 配置 rac1 的网络
- 网卡1:启用,连接方式「仅主机(Host-Only)网络」(公网)
- 网卡2:启用,连接方式「内部网络」,名称
rac-private(私网) - 网卡3:启用,连接方式「NAT」(上网)
2.4 安装 RHEL 6.10
- 启动rac1,加载RHEL 6.10 ISO镜像
- 语言选择English,时区Asia/Shanghai
- 软件选择:带GUI的服务器
- 手动分区(100GB系统盘):
挂载点 大小 文件系统 核心用途 /boot1GB ext4 系统引导文件、内核镜像 swap6GB swap 虚拟内存换页空间 /tmp10GB ext4 Oracle安装/运行临时文件 /var15GB ext4 系统日志、集群日志 /u0150GB ext4 Oracle软件安装目录 /剩余空间 ext4 系统根目录 - 网络配置:
- eth0(公网):静态IP
192.168.56.71/24 - eth1(私网):静态IP
10.10.10.71/24 - eth2(NAT):DHCP自动获取
- 主机名:
rac1
- eth0(公网):静态IP
- 设置root密码为
oracle,关闭Kdump,完成安装并重启
2.5 节点1系统基础配置(root用户执行)
2.5.1 网络配置优化
# 停止并禁用NetworkManager
service NetworkManager stop
chkconfig NetworkManager off
# 配置DNS
cat > /etc/resolv.conf <<EOF
nameserver 223.5.5.5
nameserver 223.6.6.6
domain localdomain
search localdomain
EOF
# 统一配置三块网卡
sed -i '/IPADDR=/d;/PREFIX=/d;/BOOTPROTO=/d;/DEFROUTE=/d;/PEERDNS=/d;/PEERROUTES=/d;/IPV4_FAILURE_FATAL=/d' /etc/sysconfig/network-scripts/ifcfg-eth*
sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/g' /etc/sysconfig/network-scripts/ifcfg-eth*
# eth2(NAT上网)
cat >> /etc/sysconfig/network-scripts/ifcfg-eth2 <<EOF
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
EOF
# eth0(公网)
cat >> /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
BOOTPROTO=none
IPADDR=192.168.56.71
PREFIX=24
IPV4_FAILURE_FATAL=no
EOF
# eth1(私网)
cat >> /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
BOOTPROTO=none
IPADDR=10.10.10.71
PREFIX=24
IPV4_FAILURE_FATAL=no
EOF
# 重启网络
service network restart
2.5.2 配置hosts解析
cat >> /etc/hosts <<EOF
# public
192.168.56.71 rac1
192.168.56.72 rac2
# private
10.10.10.71 rac1-priv
10.10.10.72 rac2-priv
# virtual IP
192.168.56.81 rac1-vip
192.168.56.82 rac2-vip
# scan IP
192.168.56.83 rac-scan
EOF
2.5.3 关闭防火墙与SELinux
# 关闭防火墙
service iptables stop
chkconfig iptables off
service ip6tables stop
chkconfig ip6tables off
# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 验证
getenforce # 应输出Disabled
2.5.4 配置本地YUM源
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local RHEL 6.10 DVD
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
EOF
yum clean all && yum makecache
yum install -y net-tools vim wget unzip bc
2.5.5 创建Oracle用户与组
groupadd -g 1000 oinstall
groupadd -g 1020 asmadmin
groupadd -g 1021 asmdba
groupadd -g 1022 asmoper
groupadd -g 1031 dba
groupadd -g 1032 oper
useradd -u 1100 -g oinstall -G asmadmin,asmdba,asmoper,dba grid
useradd -u 1101 -g oinstall -G dba,asmdba,oper oracle
echo "oracle" | passwd --stdin grid
echo "oracle" | passwd --stdin oracle
2.5.6 创建软件安装目录
mkdir -p /u01/app/11.2.0/grid
mkdir -p /u01/app/grid
mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1
mkdir -p /u01/app/oraInventory
mkdir -p /soft
chown -R grid:oinstall /u01
chown -R oracle:oinstall /u01/app/oracle
chown -R grid:oinstall /u01/app/oraInventory
chmod -R 775 /u01
2.5.7 配置内核参数(4GB内存优化)
cat >> /etc/sysctl.conf <<EOF
# Oracle 11g RAC 核心内核参数
kernel.shmmax = 2147483648
kernel.shmall = 2097152
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
fs.aio-max-nr = 1048576
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 = 1048576
kernel.panic_on_oops = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
EOF
# 注释掉原有重复的内核参数
vi /etc/sysctl.conf
# 使配置生效
sysctl -p
2.5.8 调整/dev/shm大小
sed -i 's/^tmpfs.*/tmpfs /dev/shm tmpfs defaults,size=2048M 0 0/' /etc/fstab
mount -o remount /dev/shm
df -h /dev/shm # 验证大小为2GB
2.5.9 配置用户资源限制
sed -i 's/^* soft nproc 1024/* soft nproc 16384/' /etc/security/limits.d/90-nproc.conf
cat >> /etc/security/limits.conf <<EOF
# grid用户资源限制
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768
# oracle用户资源限制
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
EOF
2.5.10 安装依赖包
yum install -y binutils compat-libcap1 compat-libstdc++-33 \
elfutils-libelf-devel gcc gcc-c++ glibc glibc-devel ksh libaio \
libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst \
libX11 libXau libXi make sysstat unixODBC unixODBC-devel libaio.i686 libaio-devel.i686
2.5.11 配置用户环境变量
grid用户
su - grid
cat >> ~/.bash_profile <<EOF
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export ORACLE_SID=+ASM1
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
umask 022
EOF
source ~/.bash_profile
oracle用户
su - oracle
cat >> ~/.bash_profile <<EOF
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl1
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
umask 022
EOF
source ~/.bash_profile
2.5.12 配置共享磁盘UDEV规则
# 使用LsiLogic SAS控制器,直接按设备名绑定
cat > /etc/udev/rules.d/99-oracle-asmdevices.rules <<EOF
SUBSYSTEM=="block", KERNEL=="sdb", SYMLINK+="asm-ocr1", OWNER="grid", GROUP="asmadmin", MODE="0660"
SUBSYSTEM=="block", KERNEL=="sdc", SYMLINK+="asm-ocr2", OWNER="grid", GROUP="asmadmin", MODE="0660"
SUBSYSTEM=="block", KERNEL=="sdd", SYMLINK+="asm-ocr3", OWNER="grid", GROUP="asmadmin", MODE="0660"
SUBSYSTEM=="block", KERNEL=="sde", SYMLINK+="asm-data", OWNER="grid", GROUP="asmadmin", MODE="0660"
SUBSYSTEM=="block", KERNEL=="sdf", SYMLINK+="asm-arch", OWNER="grid", GROUP="asmadmin", MODE="0660"
EOF
# 重新加载UDEV规则
start_udev
# 验证权限
ls -l /dev/asm*
ls -l /dev/sd*
2.5.13 关闭透明大页
# 临时关闭
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
# 永久关闭
sed -i 's/^kernel.*/& transparent_hugepage=never/' /etc/grub.conf
# 开机自动执行
chmod +x /etc/rc.d/rc.local
echo "echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled" >> /etc/rc.local
echo "echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag" >> /etc/rc.local
reboot
2.5.14 配置CTSS集群时间同步
Oracle RAC集群CTSS服务会在系统无NTP服务时自动接管时间同步,彻底解决虚拟机时间漂移问题。
# 设置系统时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 彻底卸载NTP服务
yum remove -y ntp ntpdate
# 清理NTP残留
rm -f /etc/ntp.conf /etc/sysconfig/ntpd /var/lib/ntp/drift
sed -i '/ntpdate/d;/hwclock/d;/service ntpd/d' /etc/rc.local
三、克隆虚拟机并配置节点2(rac2)
3.1 克隆 rac1
- 在rac1上执行清理操作:
rm -f /etc/udev/rules.d/70-persistent-net.rules
sed -i '/^HWADDR=/d' /etc/sysconfig/network-scripts/ifcfg-eth[0-2]
shutdown -h now
- VirtualBox中右键rac1 → 复制,新名称
rac2,勾选「为所有网卡重新生成MAC地址」,选择「完整克隆」
3.2 配置 rac2 差异化参数
- 启动rac2,以root用户登录
- 修改主机名和IP:
hostname rac2
sed -i 's/HOSTNAME=rac1/HOSTNAME=rac2/g' /etc/sysconfig/network
sed -i 's/192.168.56.71/192.168.56.72/g' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's/10.10.10.71/10.10.10.72/g' /etc/sysconfig/network-scripts/ifcfg-eth1
service network restart
- 修改用户环境变量:
su - grid
sed -i 's/ORACLE_SID=+ASM1/ORACLE_SID=+ASM2/' ~/.bash_profile
source ~/.bash_profile
su - oracle
sed -i 's/ORACLE_SID=orcl1/ORACLE_SID=orcl2/' ~/.bash_profile
source ~/.bash_profile
- 验证磁盘权限:
ls -l /dev/sd*
ls -l /dev/asm*
- 双节点时间对齐:
# 在rac2上执行,以rac1为基准对齐时间
date -s "$(ssh root@rac1 date)" && hwclock -w
# 验证双节点时间一致
date ; ssh rac1 date
- 重启rac2使所有配置生效:
reboot
3.3 配置双节点SSH互信
在rac1上执行
grid用户互信
su - grid
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id rac1
ssh-copy-id rac2
ssh-copy-id rac1-priv
ssh-copy-id rac2-priv
scp -r ~/.ssh rac2:~/
# 测试
ssh rac1 date; ssh rac2 date; ssh rac1-priv date; ssh rac2-priv date
oracle用户互信
su - oracle
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id rac1
ssh-copy-id rac2
ssh-copy-id rac1-priv
ssh-copy-id rac2-priv
scp -r ~/.ssh rac2:~/
# 测试
ssh rac1 date; ssh rac2 date; ssh rac1-priv date; ssh rac2-priv date
root用户互信
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id rac1
ssh-copy-id rac2
ssh-copy-id rac1-priv
ssh-copy-id rac2-priv
scp -r ~/.ssh rac2:~/
# 测试
ssh rac1 date; ssh rac2 date; ssh rac1-priv date; ssh rac2-priv date
四、上传和解压Oracle软件(仅在rac1执行)
mkdir -p /soft/database /soft/grid
chown -R oracle:oinstall /soft/database
chown -R grid:oinstall /soft/grid
chmod 775 /soft/database /soft/grid
4.1 解压Database软件
su - oracle
cd /soft
unzip -q p13390677_112040_Linux-x86-64_1of7.zip -d database
unzip -q p13390677_112040_Linux-x86-64_2of7.zip -d database
4.2 解压Grid Infrastructure
su - grid
cd /soft
unzip -q p13390677_112040_Linux-x86-64_3of7.zip -d grid
# 安装cvuqdisk包
su root
cd /soft/grid/grid/rpm
rpm -ivh cvuqdisk-1.0.9-1.rpm
# 同步到rac2
scp cvuqdisk-1.0.9-1.rpm rac2:/tmp/
ssh rac2 "rpm -ivh /tmp/cvuqdisk-1.0.9-1.rpm"
五、安装Oracle Grid Infrastructure
5.1 启动安装程序
本地开启X Server(如VcXsrv),在rac1以grid用户执行:
su - grid
export DISPLAY=192.168.56.1:0.0
cd /soft/grid/grid
./runInstaller
5.2 图形安装关键步骤
- 软件更新:选择「Skip software updates」
- 配置选项:选择「Install and Configure Grid Infrastructure for a Cluster」
- 安装选项:选择「Advanced Installation」
- 集群配置:集群名称
rac-cluster,SCAN名称rac-scan,端口1521,取消GNS - 节点信息:添加rac1(VIP:rac1-vip)和rac2(VIP:rac2-vip),测试SSH连通性
- 网络接口:eth0为Public,eth1为Private
- 存储选项:选择「Oracle ASM」
- 创建ASM磁盘组:名称
OCR_VOTE,冗余External,发现路径/dev/asm*,选择asm-ocr1、asm-ocr2、asm-ocr3 - ASM口令:统一设为
oracle - 操作系统组:保持默认
- 安装位置:确认
/u01/app/grid和/u01/app/11.2.0/grid - 安装前检查:忽略DNS相关警告,运行fixup脚本修复问题
- 执行root脚本:先在rac1执行两个脚本,再在rac2执行两个脚本
- 完成安装,点击Close
5.3 验证Grid安装
# 查看集群资源状态
crsctl stat res -t
# 验证OCR状态
ocrcheck
# 验证Voting Disk状态
crsctl query css votedisk
# 验证CTSS时间同步(必须为Active模式)
crsctl check ctss
# 验证ASM磁盘组
su - grid -c "asmcmd lsdg"
5.4 创建其他ASM磁盘组
su - grid
export DISPLAY=192.168.56.1:0.0
asmca
- 创建DATA磁盘组:名称
DATA,冗余External,选择/dev/asm-data - 创建ARCH磁盘组:名称
ARCH,冗余External,选择/dev/asm-arch - 验证三个磁盘组均为Mounted状态,退出asmca
六、安装Oracle Database软件
6.1 启动安装程序
在rac1以oracle用户执行:
su - oracle
export DISPLAY=192.168.56.1:0.0
cd /soft/database/database
./runInstaller
6.2 图形安装关键步骤
- 配置安全更新:取消勾选
- 下载软件更新:选择「Skip software updates」
- 配置选项:选择「Install database software only」
- 系统类:选择「Oracle Real Application Clusters database installation」
- 节点选择:全选rac1和rac2,测试SSH连通性
- 数据库版本:选择「Enterprise Edition」
- 安装位置:确认
/u01/app/oracle和/u01/app/oracle/product/11.2.0/dbhome_1 - 操作系统组:保持默认
- 安装前检查:通过所有检查
- 执行root脚本:在rac1和rac2分别执行
/u01/app/oracle/product/11.2.0/dbhome_1/root.sh - 完成安装,点击Close
6.3 设置Oracle二进制文件权限
# 以root用户在两个节点执行
/u01/app/11.2.0/grid/bin/setasmgidwrap -o /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
# 验证权限
ls -l /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
# 预期输出:-rwxr-s--x. 1 oracle asmadmin ... oracle
七、使用DBCA创建RAC数据库
7.1 启动DBCA
在rac1以oracle用户执行:
su - oracle
export DISPLAY=192.168.56.1:0.0
dbca
7.2 图形创建关键步骤
- 欢迎页:勾选「Oracle Real Application Clusters (RAC) database」
- 操作选择:选择「Create a Database」
- 数据库模板:选择「General Purpose or Transaction Processing」
- 数据库标识:
- 配置类型:Admin-Managed
- 节点选择:全选rac1、rac2
- 全局数据库名:
orcl - SID前缀:
orcl
- 管理选项:取消勾选所有EM和自动维护任务
- 数据库凭证:所有账户统一密码
oracle - 存储位置:
- 存储类型:Automatic Storage Management (ASM)
- 勾选「Use Oracle-Managed Files」
- 数据库区域:
+DATA
- 恢复配置:
- 勾选「Specify Fast Recovery Area」,位置
+ARCH - 勾选「Enable Archiving」
- 勾选「Specify Fast Recovery Area」,位置
- 数据库内容:仅保留Oracle Text和Sample Schemas
- 初始化参数:
- 内存:勾选Typical,启用AMM自动内存管理
- 字符集:选择「Use Unicode (AL32UTF8)」
- 连接模式:Dedicated Server Mode
- 创建选项:仅勾选「Create Database」
- 确认配置无误,点击Finish开始建库
7.3 验证数据库
sqlplus / as sysdba
-- 查看数据库状态
select name, open_mode from v$database;
-- 查看所有实例状态
select instance_name, status from gv$instance;
exit
7.4 安装rlwrap工具(可选)
# 在rac1执行
cd /soft
yum localinstall -y rlwrap-0.42-1.el6.x86_64.rpm
# 配置别名
su - oracle
echo "alias sqlplus='rlwrap sqlplus'" >> ~/.bashrc
echo "alias rman='rlwrap rman'" >> ~/.bashrc
source ~/.bashrc
su - grid
echo "alias sqlplus='rlwrap sqlplus'" >> ~/.bashrc
source ~/.bashrc
# 同步到rac2
scp rlwrap-0.42-1.el6.x86_64.rpm rac2:/tmp/
ssh rac2 "yum localinstall -y /tmp/rlwrap-0.42-1.el6.x86_64.rpm"
ssh oracle@rac2 "echo 'alias sqlplus=\"rlwrap sqlplus\"' >> ~/.bashrc; echo 'alias rman=\"rlwrap rman\"' >> ~/.bashrc; source ~/.bashrc"
ssh grid@rac2 "echo 'alias sqlplus=\"rlwrap sqlplus\"' >> ~/.bashrc; source ~/.bashrc"
八、集群管理与维护命令
8.1 核心管理命令
| 操作 | 命令 | 执行用户 |
|---|---|---|
| 查看集群资源状态 | crsctl stat res -t | grid |
| 启动整个集群 | crsctl start crs | root |
| 停止整个集群 | crsctl stop crs | root |
| 启动数据库 | srvctl start database -d orcl | oracle |
| 停止数据库 | srvctl stop database -d orcl | oracle |
| 查看数据库状态 | srvctl status database -d orcl | oracle |
| 查看ASM磁盘组 | asmcmd lsdg | grid |
| 查看监听状态 | lsnrctl status | grid |
| 查看节点列表 | olsnodes -n | grid |
| 查看组件版本 | select comp_name, version from dba_registry; | oracle |
| 编译无效对象 | @?/rdbms/admin/utlrp.sql | oracle |
8.2 常用维护技巧
- 关闭顺序:先停止数据库 → 再停止集群:
srvctl stop database -d orcl→crsctl stop crs - 启动顺序:先启动集群 → 集群自动启动ASM和数据库:
crsctl start crs - 核心日志路径:
- Grid日志:
$ORACLE_HOME/log/<hostname>/ - 数据库告警日志:
$ORACLE_BASE/diag/rdbms/orcl/<instance_name>/trace/alert_<instance_name>.log
- Grid日志:
- RAC参数修改:使用
alter system set parameter=value sid='*' scope=both;在所有实例生效