oracle linux8.8一键部署oracle 11g

需要上传的安装包

脚本内容:

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 "========================================="
相关推荐
lolo大魔王1 小时前
Go语言数据库操作之GORM框架从入门到生产实战(完整版)
开发语言·数据库·golang
2303_821287381 小时前
Redis如何监控系统QPS的变化趋势
jvm·数据库·python
dinglu1030DL1 小时前
uni-app怎么接极光推送 uni-app消息推送App端接入【教程】
jvm·数据库·python
神明9311 小时前
Go语言如何用logrus_Go语言logrus日志框架教程【技巧】
jvm·数据库·python
数据库小学妹1 小时前
企业级数据库迁移实践:从Oracle到国产数据库的兼容性与实施策略
数据库·mysql·oracle·dba
2301_779622411 小时前
PHP处理Codex安全漏洞检测【解答】
jvm·数据库·python
一 乐1 小时前
学院教学工作量统计|基于java+ vue学院教学工作量统计管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·学院教学工作量统计系统
六月雨滴1 小时前
Oracle 安全架构概述
数据库·oracle·dba·安全架构
迷藏4941 小时前
【无标题】
java·数据库·oracle