需要上传的安装包

脚本内容:
bash
#!/bin/bash
#==============================================================#
# Oracle 11g R2 (11.2.0.4) 单机一键安装 - Oracle Linux 8
# 支持断点续传
#==============================================================#
set -euo pipefail
LOG_FILE="/var/log/oracle_11g_ol8_install.log"
exec > >(tee -a "$LOG_FILE") 2>&1
# ---------------------- 参数配置 ----------------------
SOFTWARE_DIR="/soft"
ORACLE_BASE="/u01/app/oracle"
ORACLE_HOME="${ORACLE_BASE}/product/11.2.0/dbhome_1"
ORACLE_SID="orcl"
HOSTNAME="oracle-db"
CHARACTERSET="AL32UTF8"
NCHARACTERSET="AL16UTF16"
ORACLE_PASSWD="oracle"
SYS_PASSWD="oracle"
OPATCH_FILE="p6880880_112000_Linux-x86-64.zip"
PSU_FILE="p33477185_112040_Linux-x86-64.zip"
COMPAT_FILE="p33991024_11204220118_Generic.zip"
LOCAL_IP=$(hostname -I | awk '{print $1}')
[ "$(id -u)" -ne 0 ] && echo "请使用 root 用户执行" && exit 1
# 检查操作系统版本
OS_VER=$(cat /etc/oracle-release 2>/dev/null || cat /etc/redhat-release)
echo "操作系统版本: $OS_VER"
[[ "$OS_VER" =~ 8\. ]] || { echo "本脚本仅支持 Oracle Linux 8 / RHEL 8"; exit 1; }
# 检查必需文件
declare -A REQUIRED_FILES=(
["$SOFTWARE_DIR/p13390677_112040_Linux-x86-64_1of7.zip"]="DB安装包1"
["$SOFTWARE_DIR/p13390677_112040_Linux-x86-64_2of7.zip"]="DB安装包2"
["$SOFTWARE_DIR/$OPATCH_FILE"]="OPatch升级包"
["$SOFTWARE_DIR/$PSU_FILE"]="PSU补丁"
["$SOFTWARE_DIR/$COMPAT_FILE"]="OL8兼容补丁"
)
for file in "${!REQUIRED_FILES[@]}"; do
[ -f "$file" ] || { echo "缺少文件: $file (${REQUIRED_FILES[$file]})"; exit 1; }
done
#============================= 1. 系统环境准备 =============================#
echo ">>> 步骤1:系统环境准备"
# 1.1 配置 YUM 源(若未配置)
if ! yum repolist 2>/dev/null | grep -q "AppStream"; then
mount /dev/sr0 /mnt 2>/dev/null || { echo "请挂载 Oracle Linux 8 ISO 到 /dev/sr0"; exit 1; }
rm -rf /etc/yum.repos.d/*.repo
cat > /etc/yum.repos.d/local.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
EOF
dnf makecache || yum makecache
fi
# 1.2 安装依赖包(强制重试,确保 gcc 等工具可用)
echo "安装编译工具及依赖包..."
for i in {1..3}; do
dnf install -y \
gcc gcc-c++ \
bc binutils \
compat-openssl10 \
elfutils-libelf elfutils-libelf-devel \
glibc glibc-devel \
ksh libaio libaio-devel \
libXrender libX11 libXau libXi libXtst \
libgcc libstdc++ libstdc++-devel \
libnsl libxcb libibverbs \
make policycoreutils policycoreutils-python-utils \
smartmontools sysstat unzip \
java-1.8.0-openjdk-devel \
--skip-broken && break || sleep 10
done
# 确保 gcc 命令可用
if ! command -v gcc &>/dev/null; then
echo "错误:gcc 未能安装,请检查 YUM 源!"
exit 1
fi
# 创建 libnsl 软链接(解决 -lnsl 错误)
[ ! -f /usr/lib64/libnsl.so ] && ln -sf /usr/lib64/libnsl.so.2 /usr/lib64/libnsl.so
# 1.3 内核参数(幂等)
echo "配置内核参数..."
cat > /etc/sysctl.d/99-oracle.conf <<-EOF
kernel.shmmni = 4096
fs.aio-max-nr = 1048576
fs.file-max = 6815744
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 = 1048586
vm.swappiness = 10
kernel.shmmax = $(( $(awk '/MemTotal/{print $2}' /proc/meminfo) * 1024 * 85 / 100 ))
kernel.shmall = $(( $(awk '/MemTotal/{print $2}' /proc/meminfo) * 1024 * 85 / 100 / 4096 ))
EOF
sysctl -p /etc/sysctl.d/99-oracle.conf 2>/dev/null || true
cat > /etc/security/limits.d/oracle.conf <<-EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
* soft memlock $(awk '/MemTotal/{print int($2*0.9*1024)}' /proc/meminfo)
* hard memlock $(awk '/MemTotal/{print int($2*0.9*1024)}' /proc/meminfo)
EOF
# 关闭 SELinux 和防火墙
setenforce 0 2>/dev/null || true
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl disable firewalld --now 2>/dev/null || true
# 禁用透明大页
if ! grep -q "transparent_hugepage=never" /etc/default/grub; then
cp /etc/default/grub /etc/default/grub.bak
sed -i 's/quiet/quiet transparent_hugepage=never/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
fi
# 1.4 创建用户和目录
echo "创建用户和目录..."
groupadd -g 54321 oinstall 2>/dev/null || true
groupadd -g 54322 dba 2>/dev/null || true
groupadd -g 54323 oper 2>/dev/null || true
if ! id oracle &>/dev/null; then
useradd -u 54321 -g oinstall -G dba,oper oracle
echo "$ORACLE_PASSWD" | passwd --stdin oracle
fi
mkdir -p $ORACLE_HOME /u01/app/oraInventory /oradata /archivelog /backup
chown -R oracle:oinstall /u01 /oradata /archivelog /backup $SOFTWARE_DIR
chmod -R 775 /u01 /oradata /archivelog /backup $SOFTWARE_DIR
hostnamectl set-hostname $HOSTNAME
grep -q "$LOCAL_IP $HOSTNAME" /etc/hosts || echo "$LOCAL_IP $HOSTNAME" >> /etc/hosts
# 1.5 用户环境变量
echo "配置 oracle 环境变量..."
cat > /home/oracle/.bash_profile <<-EOF
export TMP=/tmp
export LANG=en_US
export TMPDIR=\$TMP
export ORACLE_UNQNAME=orcl
export ORACLE_SID=${ORACLE_SID}
export ORACLE_BASE=${ORACLE_BASE}
export ORACLE_HOME=${ORACLE_HOME}
export ORACLE_TERM=xterm
export NLS_DATE_FORMAT="yyyy-mm-dd HH24:MI:SS"
export NLS_LANG=AMERICAN_AMERICA.${CHARACTERSET}
export PATH=\$PATH:\$ORACLE_HOME/bin:\$ORACLE_HOME/OPatch
export THREADS_FLAG=native
umask 022
EOF
chown oracle:oinstall /home/oracle/.bash_profile
#============================= 2. 安装 Oracle 软件 =============================#
echo ">>> 步骤2:安装 Oracle 数据库软件"
# 判断软件是否已安装(root.sh 存在即视为安装完成)
if [ ! -f "$ORACLE_HOME/root.sh" ]; then
echo "Oracle 软件未安装,开始全新安装..."
# 清理可能的残留
pkill -f runInstaller 2>/dev/null || true
rm -rf $ORACLE_HOME /u01/app/oraInventory
# 解压安装包
su - oracle -c "
cd $SOFTWARE_DIR
unzip -oq p13390677_112040_Linux-x86-64_1of7.zip
unzip -oq p13390677_112040_Linux-x86-64_2of7.zip
"
# 生成静默响应文件
cat > $SOFTWARE_DIR/db_install.rsp <<-EOF
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=${HOSTNAME}
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=${ORACLE_HOME}
ORACLE_BASE=${ORACLE_BASE}
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
DECLINE_SECURITY_UPDATES=true
oracle.installer.autoupdates.option=SKIP_UPDATES
EOF
# 执行静默安装(使用 -waitForCompletion 确保完成)
echo "开始静默安装 Oracle 软件,请等待..."
su - oracle -c "
export CV_ASSUME_DISTID=OL7
$SOFTWARE_DIR/database/runInstaller -silent -noconfig -ignorePrereq -waitForCompletion -responseFile $SOFTWARE_DIR/db_install.rsp -jreLoc /usr/lib/jvm/java-1.8.0-openjdk
"
# 检查安装结果
if [ ! -f "$ORACLE_HOME/root.sh" ]; then
echo "错误:软件安装失败,root.sh 未生成!"
exit 1
fi
echo "Oracle 软件安装成功。"
else
echo "Oracle 软件已安装(检测到 root.sh),跳过安装。"
fi
# 执行 root 脚本(如果尚未执行,可重复执行无影响)
echo "执行 root 脚本..."
/u01/app/oraInventory/orainstRoot.sh 2>/dev/null || true
$ORACLE_HOME/root.sh
#============================= 3. 应用补丁 =============================#
echo ">>> 步骤3:升级 OPatch 并安装补丁"
# 强制升级 OPatch 到新版本
echo "升级 OPatch..."
su - oracle -c "
rm -rf $ORACLE_HOME/OPatch
cd $SOFTWARE_DIR
unzip -oq $OPATCH_FILE
mv OPatch $ORACLE_HOME/
opatch version
"
# 检查 OPatch 版本是否满足要求
OPATCH_VER=$(su - oracle -c "opatch version" | grep "OPatch Version" | awk -F: '{print $2}' | tr -d ' ')
if [[ "$OPATCH_VER" < "11.2.0.3.41" ]]; then
echo "OPatch 升级失败,当前版本 $OPATCH_VER"
exit 1
fi
echo "OPatch 版本: $OPATCH_VER"
# 补丁应用函数(自动确认,跳过已安装补丁)
apply_patch() {
local patch_name=$1 patch_dir=$2
if su - oracle -c "opatch lspatches | grep -w '$patch_name'" >/dev/null 2>&1; then
echo "补丁 $patch_name 已安装,跳过"
else
echo "正在应用补丁 $patch_name ..."
su - oracle -c "
source /home/oracle/.bash_profile
cd $SOFTWARE_DIR/$patch_dir
yes | $ORACLE_HOME/OPatch/opatch apply
" || { echo "补丁 $patch_name 应用失败!"; exit 1; }
fi
}
# 应用 PSU 补丁 33477185
echo "[1/2] 应用 PSU 补丁..."
su - oracle -c "cd $SOFTWARE_DIR && unzip -oq $PSU_FILE"
apply_patch "33477185" "33477185"
# 应用 OL8 兼容性补丁 33991024
echo "[2/2] 应用 OL8 兼容性补丁..."
su - oracle -c "cd $SOFTWARE_DIR && unzip -oq $COMPAT_FILE"
apply_patch "33991024" "33991024"
#============================= 4. 执行 relink all(补丁后必须) =============================#
echo ">>> 步骤4:执行 relink all 修复二进制文件"
# 再次确认 gcc 可用(防止之前环境变化)
if ! command -v gcc &>/dev/null; then
echo "gcc 缺失,再次安装..."
dnf install -y gcc gcc-c++ || yum install -y gcc gcc-c++
fi
# 修复可能的 libaio 冲突
cd $ORACLE_HOME/lib/stubs
[ -f libaio.so.1 ] && mv -f libaio.so.1 libaio.so.1.bak
ln -sf /usr/lib64/libaio.so.1 libaio.so.1
su - oracle -c "$ORACLE_HOME/bin/relink all"
# 关键检查:relink 后 oracle 文件必须有效
if ! file $ORACLE_HOME/bin/oracle | grep -q "ELF"; then
echo "错误:relink 后 oracle 二进制仍然无效!"
exit 1
fi
echo "补丁列表:"
su - oracle -c "$ORACLE_HOME/OPatch/opatch lspatches"
#============================= 5. 创建监听 =============================#
echo ">>> 步骤5:创建监听器"
if ! su - oracle -c "lsnrctl status" 2>/dev/null | grep -q "LISTENER"; then
echo "创建监听..."
su - oracle -c "netca -silent -responseFile $ORACLE_HOME/assistants/netca/netca.rsp"
else
echo "监听已存在,跳过。"
fi
#============================= 6. 创建数据库 =============================#
echo ">>> 步骤6:创建数据库"
if ! su - oracle -c "ps -ef | grep -q '[o]ra_pmon_${ORACLE_SID}'"; then
echo "创建数据库实例 $ORACLE_SID ..."
MEM_MB=$(( $(awk '/MemTotal/{print $2}' /proc/meminfo) * 8 / 10 / 1024 ))
su - oracle -c "
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname $ORACLE_SID \
-sid $ORACLE_SID \
-sysPassword $SYS_PASSWD \
-systemPassword $SYS_PASSWD \
-redoLogFileSize 1024 \
-storageType FS \
-datafileDestination /oradata \
-characterSet $CHARACTERSET \
-nationalCharacterSet $NCHARACTERSET \
-emConfiguration NONE \
-automaticMemoryManagement false \
-totalMemory $MEM_MB \
-databaseType OLTP
"
else
echo "数据库实例 $ORACLE_SID 已运行,跳过建库。"
fi
#============================= 7. 优化与自启动 =============================#
echo ">>> 步骤7:优化数据库参数并配置开机自启动"
su - oracle -c "
sqlplus -S / as sysdba <<-EOF
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER SYSTEM SET AUDIT_TRAIL=NONE SCOPE=SPFILE;
ALTER SYSTEM SET PROCESSES=2000 SCOPE=SPFILE;
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE;
ALTER SYSTEM SET \"_optimizer_cartesian_enabled\"=FALSE;
ALTER SYSTEM SET RESULT_CACHE_MAX_SIZE=0;
ALTER SYSTEM SET DB_CREATE_FILE_DEST='/oradata';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/archivelog';
SHUTDOWN IMMEDIATE;
STARTUP;
EXIT;
EOF
" || echo "优化步骤执行有误,可手动调整。"
# 配置开机自启
sed -i 's/db:N/db:Y/' /etc/oratab
sed -i "s/ORACLE_HOME_LISTNER=\$1/ORACLE_HOME_LISTNER=\$ORACLE_HOME/" $ORACLE_HOME/bin/dbstart
if ! grep -q "OracleBegin" /etc/rc.d/rc.local; then
cat >> /etc/rc.d/rc.local <<-EOF
# OracleBegin
su oracle -lc "$ORACLE_HOME/bin/lsnrctl start"
su oracle -lc "$ORACLE_HOME/bin/dbstart"
EOF
chmod +x /etc/rc.d/rc.local
fi
echo "========================================="
echo " Oracle 11g R2 安装部署完成!"
echo " SID: $ORACLE_SID"
echo " 系统密码: $SYS_PASSWD"
echo " 监听端口: 1521"
echo " 连接: sqlplus system/$SYS_PASSWD@$LOCAL_IP:1521/$ORACLE_SID"
echo "========================================="
