CentOS 7 Oracle 11g RAC+DataGuard 分阶段静默部署脚本
说明
- 脚本分为 6 个核心阶段,按顺序在对应节点执行,支持静默安装(无需图形化)。
- 所有脚本需用
root权限执行,执行前需修改脚本中的 环境变量(如 IP、密码、存储路径等)。 - 脚本路径统一规划为
/opt/oracle-scripts,所有安装包放在/opt/oracle-software。 - 适用环境:CentOS 7.9 x86_64 + Oracle 11.2.0.4(p13390677)。
前期准备:创建目录与上传文件
1. 所有节点执行(root 用户)
# 创建脚本目录和软件目录
mkdir -p /opt/oracle-scripts /opt/oracle-software
chmod 755 /opt/oracle-scripts /opt/oracle-software# 上传Oracle安装包到/opt/oracle-software(所有节点)
# 需上传文件:p13390677_112040_Linux-x86-64_1of7.zip、p13390677_112040_Linux-x86-64_2of7.zip阶段一:操作系统初始化脚本(所有节点执行)
脚本名称:/opt/oracle-scripts/1_os_init.sh
#!/bin/bash
# 环境变量配置(根据实际环境修改)
export RAC1_PUB_IP="192.168.1.10"
export RAC1_PRIV_IP="10.0.0.10"
export RAC1_VIP="192.168.1.13"
export RAC2_PUB_IP="192.168.1.11"
export RAC2_PRIV_IP="10.0.0.11"
export RAC2_VIP="192.168.1.14"
export DG1_PUB_IP="192.168.1.12"
export SCAN_IP="192.168.1.15"
export GRID_PASS="grid123456"
export ORACLE_PASS="oracle123456"
export SYS_PASS="sys123456"
export ASM_PASS="asm123456"# 关闭防火墙和SELinux
echo "=== 关闭防火墙和SELinux ==="
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 配置yum源并安装依赖包
echo "=== 配置yum源并安装依赖包 ==="
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache
yum install -y binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel# 配置内核参数
echo "=== 配置内核参数 ==="
cat >> /etc/sysctl.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 8589934592
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 = 1048576
EOF
sysctl -p# 配置用户限制
echo "=== 配置用户限制 ==="
cat >> /etc/security/limits.conf << EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
grid hard stack 32768
EOF# 配置PAM认证
echo "=== 配置PAM认证 ==="
cat >> /etc/pam.d/login << EOF
session required /lib64/security/pam_limits.so
session required pam_limits.so
EOF# 创建用户和组
echo "=== 创建用户和组 ==="
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 asmadmin
groupadd -g 54325 asmdba
groupadd -g 54326 asmoper
useradd -u 54321 -g oinstall -G asmadmin,asmdba,asmoper,dba grid
useradd -u 54322 -g oinstall -G dba,oper,asmdba oracle
echo "$GRID_PASS" | passwd --stdin grid
echo "$ORACLE_PASS" | passwd --stdin oracle# 创建安装目录
echo "=== 创建安装目录 ==="
mkdir -p /u01/app/11.2.0/grid
mkdir -p /u01/app/grid
mkdir -p /u01/app/oracle
chown -R grid:oinstall /u01/app/grid /u01/app/11.2.0/grid
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/# 配置hosts文件
echo "=== 配置hosts文件 ==="
cat >> /etc/hosts << EOF
# 公网IP
$RAC1_PUB_IP rac1
$RAC2_PUB_IP rac2
$DG1_PUB_IP dg1
# 私有IP
$RAC1_PRIV_IP rac1-priv
$RAC2_PRIV_IP rac2-priv
# VIP
$RAC1_VIP rac1-vip
$RAC2_VIP rac2-vip
# SCAN IP
$SCAN_IP scan-rac
EOF# 配置SSH免密(仅RAC节点执行)
CURRENT_HOST=$(hostname)
if [ "$CURRENT_HOST" = "rac1" ] || [ "$CURRENT_HOST" = "rac2" ]; thenecho "=== 配置SSH免密登录 ==="# Grid用户免密su - grid -c "ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa"su - grid -c "ssh-copy-id -o StrictHostKeyChecking=no rac1"su - grid -c "ssh-copy-id -o StrictHostKeyChecking=no rac2"# Oracle用户免密su - oracle -c "ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa"su - oracle -c "ssh-copy-id -o StrictHostKeyChecking=no rac1"su - oracle -c "ssh-copy-id -o StrictHostKeyChecking=no rac2"
fiecho "=== 操作系统初始化完成 ==="执行命令(所有节点)
chmod +x /opt/oracle-scripts/1_os_init.sh
/opt/oracle-scripts/1_os_init.sh阶段二:RAC 节点共享存储配置脚本(仅 RAC 节点执行)
脚本名称:/opt/oracle-scripts/2_asm_disk.sh
#!/bin/bash
# 环境变量(根据实际磁盘WWID修改,通过/usr/lib/udev/scsi_id -g -u /dev/sd*获取)
export ASM_OCR_WWID="14f504e46494c455257687a6a702020202034633938" # OCR/VOTING磁盘WWID
export ASM_DATA_WWID="14f504e46494c455257687a6a702020202034633939" # DATA磁盘WWID
export ASM_FRA_WWID="14f504e46494c455257687a6a70202020203463393a" # FRA磁盘WWID# 配置udev规则
echo "=== 配置udev规则 ==="
cat > /etc/udev/rules.d/99-oracle-asm.rules << EOF
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u \$devnode", RESULT=="$ASM_OCR_WWID", SYMLINK+="asm-ocr1", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u \$devnode", RESULT=="$ASM_DATA_WWID", SYMLINK+="asm-data1", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u \$devnode", RESULT=="$ASM_FRA_WWID", SYMLINK+="asm-fra1", OWNER="grid", GROUP="asmadmin", MODE="0660"
EOF# 生效udev规则
udevadm control --reload-rules
udevadm trigger --type=devices --action=change# 验证ASM磁盘
echo "=== 验证ASM磁盘 ==="
ls -l /dev/asm-*
if [ $? -eq 0 ]; thenecho "ASM磁盘配置成功"
elseecho "ASM磁盘配置失败,请检查WWID是否正确"exit 1
fi执行命令(rac1、rac2 节点)
chmod +x /opt/oracle-scripts/2_asm_disk.sh
/opt/oracle-scripts/2_asm_disk.sh阶段三:Grid Infrastructure 静默安装脚本(仅 rac1 节点执行)
3.1 生成 Grid 响应文件
脚本名称:/opt/oracle-scripts/3_grid_response.sh
#!/bin/bash
# 环境变量
export GRID_HOME="/u01/app/11.2.0/grid"
export GRID_BASE="/u01/app/grid"
export CLUSTER_NAME="rac-cluster"
export SCAN_NAME="scan-rac"
export SCAN_PORT="1521"
export RAC1_HOST="rac1"
export RAC2_HOST="rac2"
export PUBLIC_NIC="eth0"
export PRIVATE_NIC="eth1"
export ASM_DISKGROUP_OCR="OCR_VOTING"
export ASM_DISK_OCR="/dev/asm-ocr1"
export ASM_SYS_PASS="asm123456"
export ASM_ASM_PASS="asm123456"
export ROOT_PASS="root123456" # 服务器root密码# 生成响应文件
cat > /opt/oracle-scripts/grid_install.rsp << EOF
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v11_2_0
ORACLE_HOSTNAME=$RAC1_HOST
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_BASE=$GRID_BASE
ORACLE_HOME=$GRID_HOME
oracle.install.option=CRS_CONFIG
ORACLE_SID=+ASM1 # rac1节点为+ASM1,rac2为+ASM2
ORACLE_UNQNAME=+ASM
INSTALL_TYPE=Advanced
ASSEMBLY_LOCATION=
ORACLE_CRS_HOME=$GRID_HOME
CLUSTER_NAME=$CLUSTER_NAME
SCAN_NAME=$SCAN_NAME
SCAN_PORT=$SCAN_PORT
NODE_NAMES=$RAC1_HOST,$RAC2_HOST
PUBLIC_NIC_NAMES=$PUBLIC_NIC
PRIVATE_NIC_NAMES=$PRIVATE_NIC
VIP_NAMES=$RAC1_HOST-vip,$RAC2_HOST-vip
VIP_NETWORKS=192.168.1.0/255.255.255.0
ORACLE_USER=grid
ORACLE_GROUP=oinstall
DBA_GROUP=dba
OPER_GROUP=oper
ASM_GROUP=asmadmin
ASMDBA_GROUP=asmdba
ASMOPER_GROUP=asmoper
BOOTSTRAP_GROUP=oinstall
MONITORING_GROUP=oinstall
oracle.install.crs.config.storageOption=ASM_STORAGE
oracle.install.crs.config.sharedStorage.type=ASM
oracle.install.crs.config.sharedStorage.asm.diskGroup.name=$ASM_DISKGROUP_OCR
oracle.install.crs.config.sharedStorage.asm.diskGroup.redundancy=NORMAL
oracle.install.crs.config.sharedStorage.asm.diskGroup.disks=$ASM_DISK_OCR
oracle.install.crs.config.sharedStorage.asm.diskGroup.diskDiscoveryPath=/dev
oracle.install.crs.config.sharedStorage.asm.oracleHome=$GRID_HOME
oracle.install.crs.config.sharedStorage.asm.ocrStorageSize=50
oracle.install.crs.config.sharedStorage.asm.votingDiskStorageSize=50
oracle.install.crs.config.sharedStorage.asm.sysPassword=$ASM_SYS_PASS
oracle.install.crs.config.sharedStorage.asm.asmPassword=$ASM_ASM_PASS
oracle.install.crs.config.sharedStorage.asm.dbaGroup=asmdba
oracle.install.crs.config.sharedStorage.asm.operGroup=asmoper
oracle.install.crs.config.sharedStorage.asm.adminGroup=asmadmin
oracle.install.crs.config.networkInterfaceList=$PUBLIC_NIC:$RAC1_PUB_IP:public,$PRIVATE_NIC:$RAC1_PRIV_IP:private
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcIp=
oracle.install.crs.config.ipmi.bmcUser=
oracle.install.crs.config.ipmi.bmcPassword=
oracle.install.crs.config.autoConfigureClusterNodeVIP=false
oracle.install.crs.config.ignoreDownNodes=false
oracle.install.crs.config.storageOption=ASM_STORAGE
oracle.install.crs.config.sharedStorage.type=ASM
oracle.install.crs.config.sharedStorage.asm.diskGroup.name=$ASM_DISKGROUP_OCR
oracle.install.crs.config.sharedStorage.asm.diskGroup.redundancy=NORMAL
oracle.install.crs.config.sharedStorage.asm.diskGroup.disks=$ASM_DISK_OCR
oracle.install.crs.config.sharedStorage.asm.diskGroup.diskDiscoveryPath=/dev
oracle.install.crs.config.sharedStorage.asm.oracleHome=$GRID_HOME
oracle.install.crs.config.sharedStorage.asm.ocrStorageSize=50
oracle.install.crs.config.sharedStorage.asm.votingDiskStorageSize=50
oracle.install.crs.config.sharedStorage.asm.sysPassword=$ASM_SYS_PASS
oracle.install.crs.config.sharedStorage.asm.asmPassword=$ASM_ASM_PASS
oracle.install.crs.config.sharedStorage.asm.dbaGroup=asmdba
oracle.install.crs.config.sharedStorage.asm.operGroup=asmoper
oracle.install.crs.config.sharedStorage.asm.adminGroup=asmadmin
oracle.install.crs.config.networkInterfaceList=$PUBLIC_NIC:$RAC1_PUB_IP:public,$PRIVATE_NIC:$RAC1_PRIV_IP:private
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcIp=
oracle.install.crs.config.ipmi.bmcUser=
oracle.install.crs.config.ipmi.bmcPassword=
oracle.install.crs.config.autoConfigureClusterNodeVIP=false
oracle.install.crs.config.ignoreDownNodes=false
EOF3.2 Grid 静默安装脚本
脚本名称:/opt/oracle-scripts/3_grid_install.sh
#!/bin/bash
# 环境变量
export GRID_HOME="/u01/app/11.2.0/grid"
export GRID_ZIP1="/opt/oracle-software/p13390677_112040_Linux-x86-64_1of7.zip"
export GRID_ZIP2="/opt/oracle-software/p13390677_112040_Linux-x86-64_2of7.zip"# 解压Grid安装包
echo "=== 解压Grid安装包 ==="
su - grid -c "unzip -q $GRID_ZIP1 -d /u01/app/grid/"
su - grid -c "unzip -q $GRID_ZIP2 -d /u01/app/grid/"# 静默安装Grid
echo "=== 静默安装Grid Infrastructure ==="
su - grid -c "$GRID_HOME/runInstaller -silent -responseFile /opt/oracle-scripts/grid_install.rsp -ignorePrereqErrors"# 执行root脚本(rac1节点)
echo "=== 执行rac1节点root脚本 ==="
$GRID_HOME/root.sh# 执行rac2节点root脚本(远程执行)
echo "=== 执行rac2节点root脚本 ==="
ssh root@rac2 "$GRID_HOME/root.sh"# 验证Grid集群状态
echo "=== 验证Grid集群状态 ==="
su - grid -c "crsctl check cluster -all"
su - grid -c "crsctl status resource -t"# 创建DATA和FRA磁盘组
echo "=== 创建DATA和FRA磁盘组 ==="
su - grid -c "asmca -silent -createDiskGroup -diskGroupName DATA -diskList /dev/asm-data1 -redundancy NORMAL"
su - grid -c "asmca -silent -createDiskGroup -diskGroupName FRA -diskList /dev/asm-fra1 -redundancy NORMAL"echo "=== Grid Infrastructure安装完成 ==="执行命令(rac1 节点)
chmod +x /opt/oracle-scripts/3_grid_response.sh /opt/oracle-scripts/3_grid_install.sh
/opt/oracle-scripts/3_grid_response.sh
/opt/oracle-scripts/3_grid_install.sh阶段四:Oracle 11g RAC 主库静默安装脚本(仅 rac1 节点执行)
4.1 生成 Oracle 响应文件
脚本名称:/opt/oracle-scripts/4_oracle_response.sh
#!/bin/bash
# 环境变量
export ORACLE_BASE="/u01/app/oracle"
export ORACLE_HOME="$ORACLE_BASE/product/11.2.0/dbhome_1"
export DB_NAME="racdb"
export DB_UNIQUE_NAME="racdb"
export SYS_PASS="sys123456"
export SYSTEM_PASS="sys123456"
export SYSMAN_PASS="sys123456"
export DBSNMP_PASS="sys123456"
export ORACLE_USER="oracle"
export ORACLE_GROUP="oinstall"
export DBA_GROUP="dba"
export OPER_GROUP="oper"# 生成软件安装响应文件
cat > /opt/oracle-scripts/db_install.rsp << EOF
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=rac1
UNIX_GROUP_NAME=$ORACLE_GROUP
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_BASE=$ORACLE_BASE
ORACLE_HOME=$ORACLE_HOME
ORACLE_SID=racdb1
ORACLE_UNQNAME=$DB_UNIQUE_NAME
INSTALL_TYPE=Enterprise Edition
oracle.install.db.InstallEdition=EE
oracle.install.db.isCustomInstall=false
oracle.install.db.customComponents=oracle.server:11.2.0.4.0,oracle.sysman.ccr:10.2.7.0.0,oracle.xdk:11.2.0.4.0,oracle.rdbms.oci:11.2.0.4.0,oracle.network:11.2.0.4.0,oracle.network.listener:11.2.0.4.0,oracle.rdbms:11.2.0.4.0,oracle.options:11.2.0.4.0,oracle.rdbms.partitioning:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac:11.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0
oracle.install.db.DBA_GROUP=$DBA_GROUP
oracle.install.db.OPER_GROUP=$OPER_GROUP
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=$DB_NAME.example.com
oracle.install.db.config.starterdb.SID=$DB_NAME
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=8192
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=true
oracle.install.db.config.starterdb.password.ALL=$SYS_PASS
oracle.install.db.config.starterdb.password.SYS=$SYS_PASS
oracle.install.db.config.starterdb.password.SYSTEM=$SYSTEM_PASS
oracle.install.db.config.starterdb.password.SYSMAN=$SYSMAN_PASS
oracle.install.db.config.starterdb.password.DBSNMP=$DBSNMP_PASS
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.dbcontrol.enableEmailNotification=false
oracle.install.db.config.starterdb.dbcontrol.emailAddress=
oracle.install.db.config.starterdb.dbcontrol.SMTPServer=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=ASM
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.starterdb.asm.storageASMDataPath=+DATA
oracle.install.db.config.starterdb.asm.storageASMRecoveryPath=+FRA
oracle.install.db.config.starterdb.asm.asmDiskGroup=DATA
oracle.install.db.config.starterdb.asm.asmPassword=$ASM_PASS
oracle.install.db.config.starterdb.asm.asmUser=grid
oracle.install.db.config.starterdb.asm.asmDBAUser=asmdba
oracle.install.db.config.starterdb.asm.asmOPERUser=asmoper
oracle.install.db.config.starterdb.rac.nodeList=rac1,rac2
oracle.install.db.config.starterdb.rac.instanceNameList=racdb1,racdb2
oracle.install.db.config.starterdb.rac.serviceName=$DB_NAME.example.com
oracle.install.db.config.starterdb.rac.loadBalancerName=
oracle.install.db.config.starterdb.rac.scanName=scan-rac
oracle.install.db.config.starterdb.rac.scanPort=1521
oracle.install.db.config.starterdb.rac.vipNameList=rac1-vip,rac2-vip
oracle.install.db.config.starterdb.rac.vipNetwork=192.168.1.0/255.255.255.0
oracle.install.db.config.starterdb.rac.privateNetwork=10.0.0.0/255.255.255.0
EOF# 生成数据库创建响应文件
cat > /opt/oracle-scripts/db_create.rsp << EOF
[GENERAL]
RESPONSEFILE_VERSION = "11.2.0"
OPERATION_TYPE = "createDatabase"[CREATEDATABASE]
GDBNAME = "$DB_NAME.example.com"
SID = "$DB_NAME"
TEMPLATENAME = "General_Purpose.dbc"
SYSPASSWORD = "$SYS_PASS"
SYSTEMPASSWORD = "$SYSTEM_PASS"
SYSMANPASSWORD = "$SYSMAN_PASS"
DBSNMPPASSWORD = "$DBSNMP_PASS"
STORAGETYPE = "ASM"
ASM_DISKGROUP = "DATA"
RECOVERY_DISKGROUP = "FRA"
CHARACTERSET = "AL32UTF8"
NATIONALCHARACTERSET = "AL16UTF16"
MEMORYPERCENTAGE = "50"
TOTALMEMORY = "8192"
ARCHIVELOGMODE = "TRUE"
ARCHIVELOGDESTINATION = "+FRA"
STANDBYLOGFILESIZE = "50"
STANDBYLOGFILEGROUPS = "3"
EOF4.2 Oracle RAC 静默安装脚本
脚本名称:/opt/oracle-scripts/4_oracle_install.sh
#!/bin/bash
# 环境变量
export ORACLE_BASE="/u01/app/oracle"
export ORACLE_HOME="$ORACLE_BASE/product/11.2.0/dbhome_1"
export DB_NAME="racdb"
export ORACLE_ZIP1="/opt/oracle-software/p13390677_112040_Linux-x86-64_1of7.zip"
export ORACLE_ZIP2="/opt/oracle-software/p13390677_112040_Linux-x86-64_2of7.zip"# 解压Oracle安装包
echo "=== 解压Oracle安装包 ==="
su - oracle -c "unzip -q $ORACLE_ZIP1 -d $ORACLE_BASE/"
su - oracle -c "unzip -q $ORACLE_ZIP2 -d $ORACLE_BASE/"# 配置Oracle环境变量
echo "=== 配置Oracle环境变量 ==="
su - oracle -c "cat >> ~/.bash_profile << EOF
export ORACLE_BASE=$ORACLE_BASE
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=${DB_NAME}1
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF"
su - oracle -c "source ~/.bash_profile"# 静默安装Oracle软件
echo "=== 静默安装Oracle软件 ==="
su - oracle -c "$ORACLE_HOME/runInstaller -silent -responseFile /opt/oracle-scripts/db_install.rsp -ignorePrereqErrors"# 执行root脚本
echo "=== 执行rac1节点root脚本 ==="
$ORACLE_HOME/root.sh
echo "=== 执行rac2节点root脚本 ==="
ssh root@rac2 "$ORACLE_HOME/root.sh"# 配置rac2节点环境变量
echo "=== 配置rac2节点Oracle环境变量 ==="
ssh oracle@rac2 "cat >> ~/.bash_profile << EOF
export ORACLE_BASE=$ORACLE_BASE
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=${DB_NAME}2
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF"
ssh oracle@rac2 "source ~/.bash_profile"# 静默创建RAC数据库
echo "=== 静默创建RAC数据库 ==="
su - oracle -c "dbca -silent -createDatabase -responseFile /opt/oracle-scripts/db_create.rsp"# 验证RAC数据库状态
echo "=== 验证RAC数据库状态 ==="
su - oracle -c "srvctl status database -d $DB_NAME"
su - oracle -c "sqlplus / as sysdba << EOF
select instance_name, status from v\$instance;
exit;
EOF"echo "=== Oracle 11g RAC主库安装完成 ==="执行命令(rac1 节点)
chmod +x /opt/oracle-scripts/4_oracle_response.sh /opt/oracle-scripts/4_oracle_install.sh
/opt/oracle-scripts/4_oracle_response.sh
/opt/oracle-scripts/4_oracle_install.sh阶段五:DataGuard 备库静默配置脚本(主库 rac1 + 备库 dg1 执行)
5.1 主库配置脚本(rac1 节点执行)
脚本名称:/opt/oracle-scripts/5_dg_primary.sh
#!/bin/bash
# 环境变量
export DB_NAME="racdb"
export DG_DB_UNIQUE_NAME="racdb_dg"
export DG_HOST="dg1"
export SYS_PASS="sys123456"# 主库配置强制日志和备用日志
echo "=== 主库配置强制日志和备用日志 ==="
su - oracle -c "sqlplus / as sysdba << EOF
alter database force logging;
alter database add standby logfile group 4 ('+DATA') size 50m;
alter database add standby logfile group 5 ('+DATA') size 50m;
alter database add standby logfile group 6 ('+DATA') size 50m;
select force_logging from v\$database;
select group#, status from v\$standby_log;
exit;
EOF"# 配置主库tnsnames.ora
echo "=== 配置主库tnsnames.ora ==="
su - oracle -c "cat >> \$ORACLE_HOME/network/admin/tnsnames.ora << EOF
$DB_NAME\_PRIMARY =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = $DB_NAME.example.com)))$DB_NAME\_STANDBY =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = $DG_HOST)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = $DG_DB_UNIQUE_NAME.example.com)))
EOF"# 重启主库监听
su - oracle -c "lsnrctl stop"
su - oracle -c "lsnrctl start"# 生成备库控制文件和备份
echo "=== 生成备库控制文件和全量备份 ==="
su - oracle -c "sqlplus / as sysdba << EOF
alter database create standby controlfile as '/tmp/standby_control.ctl';
exit;
EOF"su - oracle -c "rman target / << EOF
backup database format '/tmp/${DB_NAME}_full_%U.bak';
backup archivelog all format '/tmp/${DB_NAME}_arch_%U.bak';
exit;
EOF"# 复制文件到备库
echo "=== 复制文件到备库 ==="
scp /tmp/standby_control.ctl root@$DG_HOST:/u01/app/oracle/oradata/$DG_DB_UNIQUE_NAME/
scp /tmp/${DB_NAME}_full_*.bak root@$DG_HOST:/tmp/
scp /tmp/${DB_NAME}_arch_*.bak root@$DG_HOST:/tmp/
scp $ORACLE_HOME/network/admin/tnsnames.ora root@$DG_HOST:$ORACLE_HOME/network/admin/echo "=== 主库DataGuard配置完成 ==="5.2 备库配置脚本(dg1 节点执行)
脚本名称:/opt/oracle-scripts/5_dg_standby.sh
#!/bin/bash
# 环境变量
export DB_NAME="racdb"
export DG_DB_UNIQUE_NAME="racdb_dg"
export ORACLE_BASE="/u01/app/oracle"
export ORACLE_HOME="$ORACLE_BASE/product/11.2.0/dbhome_1"
export ORACLE_SID="$DG_DB_UNIQUE_NAME"
export SYS_PASS="sys123456"
export DATA_DIR="/u01/app/oracle/oradata/$DG_DB_UNIQUE_NAME/datafile"
export LOG_DIR="/u01/app/oracle/oradata/$DG_DB_UNIQUE_NAME/onlinelog"
export ARCH_DIR="/u01/app/oracle/flash_recovery_area/$DG_DB_UNIQUE_NAME/archivelog"# 创建备库目录
echo "=== 创建备库目录 ==="
mkdir -p $DATA_DIR $LOG_DIR $ARCH_DIR
chown -R oracle:oinstall $ORACLE_BASE/oradata $ORACLE_BASE/flash_recovery_area# 配置Oracle环境变量
echo "=== 配置Oracle环境变量 ==="
su - oracle -c "cat >> ~/.bash_profile << EOF
export ORACLE_BASE=$ORACLE_BASE
export ORACLE_HOME=\$ORACLE_HOME
export ORACLE_SID=$ORACLE_SID
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
EOF"
su - oracle -c "source ~/.bash_profile"# 配置listener.ora
echo "=== 配置listener.ora ==="
su - oracle -c "cat >> \$ORACLE_HOME/network/admin/listener.ora << EOF
SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(GLOBAL_DBNAME = $DG_DB_UNIQUE_NAME.example.com)(ORACLE_HOME = $ORACLE_HOME)(SID_NAME = $ORACLE_SID)))LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))
EOF"# 启动监听
su - oracle -c "lsnrctl start"
su - oracle -c "lsnrctl status"# 创建密码文件
echo "=== 创建密码文件 ==="
su - oracle -c "orapwd file=\$ORACLE_HOME/dbs/orapw$ORACLE_SID password=$SYS_PASS entries=10"# 创建pfile
echo "=== 创建pfile ==="
su - oracle -c "cat >> \$ORACLE_HOME/dbs/init$ORACLE_SID.ora << EOF
db_name='$DB_NAME'
db_unique_name='$DG_DB_UNIQUE_NAME'
instance_name='$ORACLE_SID'
service_names='$DG_DB_UNIQUE_NAME.example.com'
control_files='/u01/app/oracle/oradata/$DG_DB_UNIQUE_NAME/standby_control.ctl'
db_files=1024
memory_target=8G
processes=1500
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
log_archive_format='%t_%s_%r.arc'
log_archive_dest_1='LOCATION=$ARCH_DIR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=$DG_DB_UNIQUE_NAME'
log_archive_dest_2='SERVICE=${DB_NAME}_primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=$DB_NAME'
log_archive_dest_state_1='ENABLE'
log_archive_dest_state_2='ENABLE'
standby_file_management='AUTO'
fal_server='${DB_NAME}_primary'
fal_client='${DB_NAME}_standby'
db_file_name_convert='+DATA/$DB_NAME/datafile/', '$DATA_DIR/'
log_file_name_convert='+DATA/$DB_NAME/onlinelog/', '$LOG_DIR/'
EOF"# 启动备库到nomount状态
echo "=== 启动备库到nomount状态 ==="
su - oracle -c "sqlplus / as sysdba << EOF
startup nomount pfile='$ORACLE_HOME/dbs/init$ORACLE_SID.ora';
exit;
EOF"# RMAN duplicate恢复备库
echo "=== RMAN duplicate恢复备库 ==="
su - oracle -c "rman target sys/$SYS_PASS@${DB_NAME}_primary auxiliary / << EOF
duplicate target database for standby from active database nofilenamecheck;
exit;
EOF"# 启动备库日志应用
echo "=== 启动备库日志应用 ==="
su - oracle -c "sqlplus / as sysdba << EOF
alter database mount standby database;
alter database recover managed standby database using current logfile disconnect from session;
select database_role, open_mode from v\$database;
select status from v\$managed_standby;
exit;
EOF"echo "=== DataGuard备库配置完成 ==="执行命令
- rac1 节点执行主库配置:
chmod +x /opt/oracle-scripts/5_dg_primary.sh /opt/oracle-scripts/5_dg_primary.sh - dg1 节点执行备库配置:
chmod +x /opt/oracle-scripts/5_dg_standby.sh /opt/oracle-scripts/5_dg_standby.sh阶段六:DataGuard 验证与切换测试脚本(可选)
脚本名称:
/opt/oracle-scripts/6_dg_test.sh#!/bin/bash # 环境变量 export DB_NAME="racdb" export DG_DB_UNIQUE_NAME="racdb_dg" export SYS_PASS="sys123456"# 主备同步验证 echo "=== 主备同步验证 ===" echo "主库插入测试数据..." su - oracle -c "sqlplus / as sysdba << EOF create table test_dg (id number, name varchar2(20)); insert into test_dg values (1, 'rac_dg_test'); commit; alter system switch logfile; exit; EOF"sleep 30echo "备库查询测试数据..." ssh oracle@dg1 "sqlplus / as sysdba << EOF alter database recover managed standby database cancel; alter database open read only; select * from test_dg; alter database recover managed standby database using current logfile disconnect from session; exit; EOF"# 主备切换测试(Switchover) echo "=== 主备切换测试 ===" echo "主库检查切换条件..." su - oracle -c "sqlplus / as sysdba << EOF select switchover_status from v\$database; alter database commit to switchover to physical standby with session shutdown; shutdown immediate; startup mount; alter database recover managed standby database using current logfile disconnect from session; select database_role from v\$database; exit; EOF"echo "备库切换为主库..." ssh oracle@dg1 "sqlplus / as sysdba << EOF select switchover_status from v\$database; alter database commit to switchover to primary with session shutdown; alter database open; select database_role, open_mode from v\$database; exit; EOF"echo "=== 主备切换测试完成 ==="执行命令(rac1 节点)
chmod +x /opt/oracle-scripts/6_dg_test.sh /opt/oracle-scripts/6_dg_test.sh关键注意事项
- 所有脚本执行前必须修改 环境变量(IP、密码、磁盘 WWID 等),否则会导致安装失败。
- 静默安装过程中若出现错误,查看日志文件:
- Grid 日志:
/u01/app/oraInventory/logs/installActions*.log - Oracle 日志:
/u01/app/oraInventory/logs/installActions*.log - 数据库日志:
$ORACLE_BASE/diag/rdbms/*/*/trace/alert*.log
- Grid 日志:
- 确保所有节点之间网络互通(SSH、1521 端口、私有网络)。
- ASM 磁盘 WWID 必须通过
usr/lib/udev/scsi_id -g -u /dev/sd*实际查询,不可直接复制示例。 - 生产环境建议增加 补丁安装步骤(Oracle 11.2.0.4 最新补丁 p34419443)。
