暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle linux8.8一键部署Oracle 11g

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。

关注公众号,技术道路不迷路

 

需要上传的安装包

脚本内容:
#!/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 "========================================="

参考文章:https://www.modb.pro/db/1743464109273325568

 



END
往期文章回顾

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论