侧边栏壁纸
  • 累计撰写 11 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

openEuler系统无图形桌面RPM方式安装Oracle 19c(附一键安装脚本 + 完整运行日志)

自留地
2026-03-07 / 0 评论 / 0 点赞 / 163 阅读 / 0 字

在企业服务器运维场景中,openEuler 22.03LTS凭借轻量、安全、高兼容性的特性,成为无图形桌面服务器的主流操作系统;Oracle 19c作为长期支持版本(LTS),是承载企业核心业务的首选数据库。传统手动安装需逐行配置系统依赖、内核参数、实例初始化等十余项操作,易出错且耗时,为此笔者编写了自动化安装脚本,实现全程无图形界面、RPM方式静默部署,以下是真实生产环境的完整实操日志。

一、环境说明

配置项

详情

系统版本

openEuler 22.03 LTS(无图形桌面最小化安装)

数据库版本

Oracle 19c EE(RPM 安装包)

服务器配置

8 核 CPU、9664488 KB 物理内存

实例配置

实例名 orcl、字符集 ZHS16GBK、关闭 CDB 模式

日志路径

/var/log/oracle_install_20260307.log

部署方式

自动化脚本、无图形界面、RPM 静默安装

二、脚本完整运行日志

[root@localhost /]# cat /var/log/oracle_install_20260307.log
===== Oracle 19c 生产环境安装日志 - 2026年 03月 07日 星期六 18:40:14 CST =====
主机名: localhost
CPU核心数: 8
Oracle实例名: orcl
物理内存: 9664488 KB (SHMMAX: 6927504998 B)

===== 【1/10】生产环境前置检查 =====
✅ 所有前置检查通过
📌 环境信息:CPU=8核 | 实例名=orcl | 日志=/var/log/oracle_install_20260307.log

===== 【2/10】系统基础加固 =====
OS                                              473 kB/s | 3.4 MB     00:07
everything                                      3.3 MB/s |  17 MB     00:05
EPOL                                            152 kB/s | 4.7 MB     00:31
debuginfo                                       136 kB/s | 4.0 MB     00:30
source                                           61 kB/s | 1.8 MB     00:30
update                                          4.0 MB/s |  91 MB     00:22
update-source                                    70 kB/s | 2.2 MB     00:31
Last metadata expiration check: 0:00:01 ago on 2026年03月07日 星期六 18时43分05秒.
Package bc-1.07.1-12.oe2203sp3.x86_64 is already installed.
Package psmisc-23.5-2.oe2203sp3.x86_64 is already installed.
Dependencies resolved.
================================================================================
 Package             Arch        Version                  Repository       Size
================================================================================
Installing:
 libaio-devel        x86_64      0.3.113-9.oe2203sp3      OS               10 k
 libnsl              x86_64      2.34-170.oe2203sp3       update           39 k
 libnsl2-devel       x86_64      2.0.0-5.oe2203sp3        everything       18 k
 net-tools           x86_64      2.10-4.oe2203sp3         update          195 k
Upgrading:
 glibc               x86_64      2.34-170.oe2203sp3       update          2.9 M
 glibc-common        x86_64      2.34-170.oe2203sp3       update          2.7 M
Installing dependencies:
 libtirpc-devel      x86_64      1.3.2-4.oe2203sp3        everything       46 k

Transaction Summary
================================================================================
Install  5 Packages
Upgrade  2 Packages

Total download size: 5.9 M
Downloading Packages:
(1/7): libaio-devel-0.3.113-9.oe2203sp3.x86_64. 6.8 kB/s |  10 kB     00:01
(2/7): libnsl-2.34-170.oe2203sp3.x86_64.rpm     363 kB/s |  39 kB     00:00
(3/7): net-tools-2.10-4.oe2203sp3.x86_64.rpm    1.4 MB/s | 195 kB     00:00
(4/7): glibc-2.34-170.oe2203sp3.x86_64.rpm      6.9 MB/s | 2.9 MB     00:00
(5/7): glibc-common-2.34-170.oe2203sp3.x86_64.r  10 MB/s | 2.7 MB     00:00
(6/7): libnsl2-devel-2.0.0-5.oe2203sp3.x86_64.r 5.5 kB/s |  18 kB     00:03
(7/7): libtirpc-devel-1.3.2-4.oe2203sp3.x86_64.  13 kB/s |  46 kB     00:03
--------------------------------------------------------------------------------
Total                                           1.4 MB/s | 5.9 MB     00:04
retrieving repo key for OS unencrypted from http://repo.openeuler.org/openEuler-22.03-LTS-SP3/OS/x86_64/RPM-GPG-KEY-openEuler
OS                                              9.0 kB/s | 3.0 kB     00:00
Importing GPG key 0xB675600B:
 Userid     : "openeuler <openeuler@compass-ci.com>"
 Fingerprint: 8AA1 6BF9 F2CA 5244 010D CA96 3B47 7C60 B675 600B
 From       : http://repo.openeuler.org/openEuler-22.03-LTS-SP3/OS/x86_64/RPM-GPG-KEY-openEuler
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Upgrading        : glibc-common-2.34-170.oe2203sp3.x86_64                 1/9
  Running scriptlet: glibc-2.34-170.oe2203sp3.x86_64                        2/9
  Upgrading        : glibc-2.34-170.oe2203sp3.x86_64                        2/9
  Running scriptlet: glibc-2.34-170.oe2203sp3.x86_64                        2/9
  Installing       : libtirpc-devel-1.3.2-4.oe2203sp3.x86_64                3/9
  Installing       : libnsl2-devel-2.0.0-5.oe2203sp3.x86_64                 4/9
  Installing       : libnsl-2.34-170.oe2203sp3.x86_64                       5/9
  Installing       : net-tools-2.10-4.oe2203sp3.x86_64                      6/9
  Running scriptlet: net-tools-2.10-4.oe2203sp3.x86_64                      6/9
  Installing       : libaio-devel-0.3.113-9.oe2203sp3.x86_64                7/9
  Cleanup          : glibc-2.34-143.oe2203sp3.x86_64                        8/9
  Cleanup          : glibc-common-2.34-143.oe2203sp3.x86_64                 9/9
  Running scriptlet: glibc-common-2.34-143.oe2203sp3.x86_64                 9/9
  Running scriptlet: glibc-common-2.34-170.oe2203sp3.x86_64                 9/9
  Running scriptlet: glibc-common-2.34-143.oe2203sp3.x86_64                 9/9
  Running scriptlet: glibc-common-2.34-170.oe2203sp3.x86_64                 9/9
  Verifying        : libaio-devel-0.3.113-9.oe2203sp3.x86_64                1/9
  Verifying        : libnsl2-devel-2.0.0-5.oe2203sp3.x86_64                 2/9
  Verifying        : libtirpc-devel-1.3.2-4.oe2203sp3.x86_64                3/9
  Verifying        : libnsl-2.34-170.oe2203sp3.x86_64                       4/9
  Verifying        : net-tools-2.10-4.oe2203sp3.x86_64                      5/9
  Verifying        : glibc-2.34-170.oe2203sp3.x86_64                        6/9
  Verifying        : glibc-2.34-143.oe2203sp3.x86_64                        7/9
  Verifying        : glibc-common-2.34-170.oe2203sp3.x86_64                 8/9
  Verifying        : glibc-common-2.34-143.oe2203sp3.x86_64                 9/9

Upgraded:
  glibc-2.34-170.oe2203sp3.x86_64     glibc-common-2.34-170.oe2203sp3.x86_64
Installed:
  libaio-devel-0.3.113-9.oe2203sp3.x86_64
  libnsl-2.34-170.oe2203sp3.x86_64
  libnsl2-devel-2.0.0-5.oe2203sp3.x86_64
  libtirpc-devel-1.3.2-4.oe2203sp3.x86_64
  net-tools-2.10-4.oe2203sp3.x86_64

Complete!
success
success
✅ 系统基础加固完成

===== 【3/10】配置内核参数 =====
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
kernel.shmmax = 6927504998
kernel.shmall = 1691285
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
fs.file-max = 6815744
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 9000 65500
net.ipv4.tcp_tw_reuse = 1
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 6
net.ipv4.tcp_keepalive_intvl = 5
fs.aio-max-nr = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
✅ 内核参数配置并加载成功

===== 【4/10】配置资源限制 =====
✅ 资源限制配置写入成功

===== 【5/10】安装Oracle 19c RPM包 =====
警告:compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
compat-libstdc++-33-3.2.3-72.el7      ########################################
✅ compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm 安装成功
警告:compat-libcap1-1.10-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
compat-libcap1-1.10-7.el7             ########################################
✅ compat-libcap1-1.10-7.el7.x86_64.rpm 安装成功
警告:oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
oracle-database-preinstall-19c-1.0-1.e########################################
✅ oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm 安装成功
警告:oracle-database-ee-19c-1.0-1.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
Verifying...                          ########################################
准备中...                          ########################################
正在升级/安装...
oracle-database-ee-19c-1.0-1          ########################################
[INFO] Executing post installation scripts...
[INFO] Oracle home installed successfully and ready to be configured.
To configure a sample Oracle Database you can execute the following service configuration script as root: /etc/init.d/oracledb_ORCLCDB-19c configure
✅ oracle-database-ee-19c-1.0-1.x86_64.rpm 安装成功
✅ 所有Oracle RPM包安装完成

===== 【6/10】配置pam.d/login =====
✅ pam.d/login 配置成功

===== 【7/10】配置环境变量 =====
✅ 全局profile配置生效
✅ oracle用户环境变量配置成功

===== 【8/10】配置实例参数与密码 =====
更改用户 oracle 的密码 。
passwd:所有的身份验证令牌已经成功更新。
✅ oracle用户密码设置成功
✅ 实例初始化文件配置成功:/etc/init.d/oracledb_ORCL-19c
   - 实例名: orcl | 字符集: ZHS16GBK | CDB模式: 关闭

===== 【9/10】创建目录与配置文件 =====
✅ 配置文件复制完成:/etc/sysconfig/oracledb_orcl-19c.conf
✅ 归档日志目录创建成功
✅ 数据文件目录创建成功

===== 【10/10】初始化Oracle 19c实例 =====
📝 初始化开始,详细日志请查看:/var/log/oracle_install_20260307.log

===== 【实例初始化开始】- 2026年 03月 07日 星期六 18:50:39 CST =====
Configuring Oracle Database orcl.
准备执行数据库操作
已完成 10%
复制数据库文件
已完成 40%
正在创建并启动 Oracle 实例
已完成 42%
已完成 46%
已完成 50%
已完成 54%
已完成 60%
正在进行数据库创建
已完成 66%
已完成 70%
执行配置后操作
已完成 100%
数据库创建完成。有关详细信息, 请查看以下位置的日志文件:
 /opt/oracle/cfgtoollogs/dbca/orcl。
数据库信息:
全局数据库名:orcl
系统标识符 (SID):orcl
有关详细信息, 请参阅日志文件 "/opt/oracle/cfgtoollogs/dbca/orcl/orcl.log"。

Database configuration completed successfully. The passwords were auto generated, you must change them by connecting to the database using 'sqlplus / as sysdba' as the oracle user.
oracledb_ORCL-19c.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable oracledb_ORCL-19c

======================================================================
✅ Oracle 19c 在 openEuler 上安装初始化成功!
======================================================================
📌 连接信息:
   SID: orcl
   字符集: ZHS16GBK
   管理员密码: oracle.J!3
📌 验证命令:
   su - oracle -c 'sqlplus / as sysdba'
   su - oracle -c 'lsnrctl status'
📌 服务管理命令:
   systemctl start oracledb_ORCL-19c
   systemctl status oracledb_ORCL-19c
======================================================================

===== 【安装完成】- 2026年 03月 07日 星期六 19:10:13 CST =====

三、关键验证步骤

安装完成后,建议通过以下命令验证Oracle 19c服务及实例的可用性:

1. 验证数据库连接

切换至oracle用户,通过sqlplus验证本地连接:

su - oracle -c 'sqlplus / as sysdba'

正常输出应包含Connected to:字样,表明实例连接正常。

2. 检查监听状态

验证Oracle监听服务是否正常运行:

su - oracle -c 'lsnrctl status'

正常输出应显示LISTENER is running,且包含orcl实例的监听信息。

3. 服务生命周期管理

通过systemctl管理Oracle服务(支持开机自启):

# 启动Oracle服务
systemctl start oracledb_ORCL-19c

# 查看服务运行状态
systemctl status oracledb_ORCL-19c

# 设置开机自启(生产环境推荐)
systemctl enable oracledb_ORCL-19c

# 停止服务(仅维护时使用)
systemctl stop oracledb_ORCL-19c

四、自动化安装脚本使用说明

1. 前置准备

  1. 在服务器上创建/soft目录,用于存放安装所需的所有RPM包;

  2. 将Oracle 19c EE安装包、依赖包等上传至/soft目录(本次所需RPM包清单见文末附件);

  3. 确保服务器已配置openEuler官方源,且网络可正常访问。

2. 脚本部署

创建并编辑安装脚本:

vi /soft/oracle_install.sh 将以下内容粘贴进去,保存退出

完整脚本

#!/bin/bash
# Oracle 19c 自动化安装脚本(openEuler 专用·最终版OK)
# 适配系统:openEuler 20.03 LTS / 22.03 LTS
# 前置条件:/soft 目录已存在,且存放所有RPM包;必须以ROOT用户执行
# 修复内容:
# 1. 解决.bash_profile不存在导致的权限错误
# 2. 修复PIPESTATUS兼容性问题
# 3. 解决初始化脚本名实不符、多实例冲突问题
# 4. 新增RPM安装等待逻辑,避免异步风险
# 5. 动态计算内核参数,适配不同内存服务器
# 6. 初始化实例显示进度,开机自启仅保留systemctl

set -o pipefail

# ==================== 配置项(可修改)====================
ORACLE_RPM_NAME="oracle-database-ee-19c-1.0-1.x86_64.rpm"
ORACLE_RPM_PATH="/soft/${ORACLE_RPM_NAME}"
ORACLE_SID="orcltest"
ORACLE_PWD="oracle,12!"
# 依赖包名称(确保在/soft目录下)
COMPAT_LIBSTDCPP="compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm"
COMPAT_LIBCAP1="compat-libcap1-1.10-7.el7.x86_64.rpm"
ORACLE_PREINSTALL="oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm"
# =================================================================

# 全局变量(核心修复:拆分原始脚本和自定义脚本变量)
INSTALL_LOG="/var/log/oracle_install_$(date +%Y%m%d).log"
HOSTNAME=$(hostname -s)
CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
ORACLE_BASE="/opt/oracle"
ORACLE_HOME="/opt/oracle/product/19c/dbhome_1"
# 原始默认初始化脚本(RPM生成)
ORACLE_INIT_FILE_ORIG="/etc/init.d/oracledb_ORCLCDB-19c"
# 自定义实例初始化脚本(匹配ORACLE_SID)
ORACLE_INIT_FILE="/etc/init.d/oracledb_${ORACLE_SID^^}-19c"
# 目标配置文件(orcl实例专用)
ORACLE_CONF_FILE="/etc/sysconfig/oracledb_${ORACLE_SID,,}-19c.conf"
# 动态计算内核参数(物理内存的70%,单位字节)
PHYS_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
PHYS_MEM_B=$((PHYS_MEM_KB * 1024))
SHMMAX=$((PHYS_MEM_B * 7 / 10))  # 70%物理内存

# 颜色输出函数
red() { echo -e "\033[31m$1\033[0m" | tee -a ${INSTALL_LOG}; }
green() { echo -e "\033[32m$1\033[0m" | tee -a ${INSTALL_LOG}; }
yellow() { echo -e "\033[33m$1\033[0m" | tee -a ${INSTALL_LOG}; }
blue() { echo -e "\033[34m$1\033[0m" | tee -a ${INSTALL_LOG}; }
cyan() { echo -e "\033[36m$1\033[0m" | tee -a ${INSTALL_LOG}; }

# 进度条函数
show_progress() {
    local rpm_name=$1
    local pid=$2
    local delay=0.5
    local spin='|/-\'
    local i=0
    echo -n "🔄 正在安装 ${rpm_name}:["

    while kill -0 $pid 2>/dev/null; do
        i=$(( (i+1) % 4 ))
        echo -ne "\b${spin:$i:1}"
        sleep $delay
    done

    wait $pid
    local ret=$?
    echo -e "\b] "
    if [ $ret -eq 0 ]; then
        green "✅ ${rpm_name} 安装成功"
    else
        yellow "⚠ ${rpm_name} 已安装或无需安装"
    fi
}

# ==================== 初始化与前置检查 ====================
# 初始化日志
mkdir -p $(dirname ${INSTALL_LOG}) >> ${INSTALL_LOG} 2>&1
echo -e "===== Oracle 19c 生产环境安装日志 - $(date) =====" > ${INSTALL_LOG}
echo "主机名: ${HOSTNAME}" >> ${INSTALL_LOG}
echo "CPU核心数: ${CPU_CORES}" >> ${INSTALL_LOG}
echo "Oracle实例名: ${ORACLE_SID}" >> ${INSTALL_LOG}
echo "物理内存: ${PHYS_MEM_KB} KB (SHMMAX: ${SHMMAX} B)" >> ${INSTALL_LOG}

blue "\n===== 【1/10】生产环境前置检查 ====="
if [ "$(id -u)" != "0" ]; then
    red "错误:必须以ROOT用户执行!"
    exit 1
fi

if [ ! -d "/soft" ]; then
    red "错误:/soft目录不存在,请先手动创建并放入RPM包!"
    exit 1
fi

if [ ! -f "${ORACLE_RPM_PATH}" ]; then
    red "错误:主RPM包不存在,请检查路径:${ORACLE_RPM_PATH}"
    exit 1
fi

# 检查依赖包完整性
for pkg in ${COMPAT_LIBSTDCPP} ${COMPAT_LIBCAP1} ${ORACLE_PREINSTALL}; do
    if [ ! -f "/soft/${pkg}" ]; then
        red "错误:依赖包不存在:/soft/${pkg}"
        exit 1
    fi
done

green "✅ 所有前置检查通过"
green "📌 环境信息:CPU=${CPU_CORES}核 | 实例名=${ORACLE_SID} | 日志=${INSTALL_LOG}"

# ==================== 系统基础加固 ====================
blue "\n===== 【2/10】系统基础加固 ====="
# 使用dnf安装核心依赖
dnf install -y libnsl.x86_64 libnsl2-devel bc libaio-devel net-tools psmisc >> ${INSTALL_LOG} 2>&1
if [ $? -ne 0 ]; then
    red "错误:基础依赖包安装失败!"
    exit 1
fi

# SELinux设为permissive(生产环境推荐,而非直接关闭)
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config >> ${INSTALL_LOG} 2>&1
setenforce 0 > /dev/null 2>&1 || yellow "⚠ SELinux可能已禁用"

# 开放1521端口(替代关闭防火墙,生产环境更安全)
firewall-cmd --permanent --add-port=1521/tcp >> ${INSTALL_LOG} 2>&1
firewall-cmd --reload >> ${INSTALL_LOG} 2>&1 || {
    yellow "⚠ 防火墙配置失败,已直接关闭防火墙"
    systemctl stop firewalld > /dev/null 2>&1 || true
    systemctl disable firewalld > /dev/null 2>&1 || true
}

green "✅ 系统基础加固完成"

# ==================== 配置内核参数 ====================
blue "\n===== 【3/10】配置内核参数 ====="
cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%Y%m%d) >> ${INSTALL_LOG} 2>&1

grep -q "^kernel.shmmax = ${SHMMAX}" /etc/sysctl.conf || {
    cat >> /etc/sysctl.conf << EOF
# Oracle 19c 内核配置(openEuler 专用)
kernel.shmmax = ${SHMMAX}
kernel.shmall = $((SHMMAX / 4096))
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
fs.file-max = 6815744
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 9000 65500
net.ipv4.tcp_tw_reuse = 1
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 6
net.ipv4.tcp_keepalive_intvl = 5
fs.aio-max-nr = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
EOF

    sysctl -p 2>&1 | grep -v "deprecated" >> ${INSTALL_LOG}
    ret=$?
    if [ $ret -eq 0 ] || [ $ret -eq 1 ]; then
        green "✅ 内核参数配置并加载成功"
    else
        red "错误:内核参数加载失败!"
        exit 1
    fi
} || {
    sysctl -p 2>&1 | grep -v "deprecated" >> ${INSTALL_LOG}
    yellow "⚠ 内核参数已存在,已重新加载"
}

# ==================== 配置资源限制 ====================
blue "\n===== 【4/10】配置资源限制 ====="
grep -q "^oracle   soft   nofile    1024" /etc/security/limits.conf || {
    cat >> /etc/security/limits.conf << 'EOF'
oracle   soft   nofile    1024
oracle   hard   nofile    65536
oracle   soft   nproc    16384
oracle   hard   nproc    16384
oracle   soft   stack    10240
oracle   hard   stack    32768
oracle   hard   memlock    134217728
oracle   soft   memlock    134217728
EOF
    green "✅ 资源限制配置写入成功"
} || {
    yellow "⚠ 资源限制配置已存在"
}

# ==================== 安装Oracle RPM包 ====================
blue "\n===== 【5/10】安装Oracle 19c RPM包 ====="
cd /soft >> ${INSTALL_LOG} 2>&1
if [ $? -ne 0 ]; then
    red "错误:切换到/soft目录失败!"
    exit 1
fi

# 安装依赖包(后台运行+进度条+等待)
rpm -ivh ${COMPAT_LIBSTDCPP} >> ${INSTALL_LOG} 2>&1 &
PID1=$!
show_progress "${COMPAT_LIBSTDCPP}" ${PID1}

rpm -ivh ${COMPAT_LIBCAP1} >> ${INSTALL_LOG} 2>&1 &
PID2=$!
show_progress "${COMPAT_LIBCAP1}" ${PID2}

# 预安装包强制忽略依赖(openEuler兼容关键)
rpm -ivh ${ORACLE_PREINSTALL} --nodeps >> ${INSTALL_LOG} 2>&1 &
PID3=$!
show_progress "${ORACLE_PREINSTALL}" ${PID3}

# 安装主包
rpm -ivh ${ORACLE_RPM_NAME} >> ${INSTALL_LOG} 2>&1 &
PID4=$!
show_progress "${ORACLE_RPM_NAME}" ${PID4}

# 等待所有RPM安装完成
wait ${PID1} ${PID2} ${PID3} ${PID4}
green "✅ 所有Oracle RPM包安装完成"

# ==================== 配置PAM与环境变量 ====================
blue "\n===== 【6/10】配置pam.d/login ====="
grep -q "^session required pam_limits.so" /etc/pam.d/login || {
    echo 'session required pam_limits.so' >> /etc/pam.d/login
    green "✅ pam.d/login 配置成功"
} || {
    yellow "⚠ pam.d/login 配置已存在"
}

blue "\n===== 【7/10】配置环境变量 ====="
# 全局profile配置
grep -q "^if [ \$USER = \"oracle\" ]; then" /etc/profile || {
    cat >> /etc/profile << 'EOF'
if [ $USER = "oracle" ]; then
   if [ $SHELL = "/bin/ksh" ]; then
  ulimit -p 16384
  ulimit -n 65536
  else
  ulimit -u 16384 -n 65536
   fi
fi
EOF
    source /etc/profile >> ${INSTALL_LOG} 2>&1
    green "✅ 全局profile配置生效"
}

# Oracle用户专属环境变量(修复:先确保文件存在)
ORACLE_BASH_PROFILE="/home/oracle/.bash_profile"
if [ ! -f "${ORACLE_BASH_PROFILE}" ]; then
    touch ${ORACLE_BASH_PROFILE}
    chown oracle:oinstall ${ORACLE_BASH_PROFILE}
fi

grep -q "^export ORACLE_HOME=" ${ORACLE_BASH_PROFILE} || {
    cat >> ${ORACLE_BASH_PROFILE} << EOF
export TMP=/tmp
export TMPDIR=\$TMP  # 赋值为TMP,保证临时目录有效
export ORACLE_BASE=${ORACLE_BASE}
export ORACLE_HOME=${ORACLE_HOME}
export ORACLE_SID=${ORACLE_SID}
export PATH=\$ORACLE_HOME/bin:/usr/local/bin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/home/oracle/bin
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/usr/lib64:\$LD_LIBRARY_PATH  # 补充/usr/lib64(兼容openEuler)
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
EOF
    chown oracle:oinstall ${ORACLE_BASH_PROFILE} >> ${INSTALL_LOG} 2>&1
    green "✅ oracle用户环境变量配置成功"
}

# ==================== 配置实例初始化脚本 ====================
blue "\n===== 【8/10】配置实例参数与密码 ====="
# 设置oracle密码
echo "${ORACLE_PWD}" | passwd --stdin oracle >> ${INSTALL_LOG} 2>&1
if [ $? -eq 0 ]; then
    green "✅ oracle用户密码设置成功"
else
    red "错误:oracle密码设置失败!"
    exit 1
fi

# 检查默认初始化文件是否存在
if [ ! -f "${ORACLE_INIT_FILE_ORIG}" ]; then
    red "错误:RPM默认初始化文件不存在!路径:${ORACLE_INIT_FILE_ORIG}"
    ls -l /etc/init.d/oracledb*
    exit 1
fi

# 复制默认脚本为实例专属脚本(核心修复)
cp ${ORACLE_INIT_FILE_ORIG} ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1
# 备份新脚本
cp ${ORACLE_INIT_FILE} ${ORACLE_INIT_FILE}.bak.$(date +%Y%m%d) >> ${INSTALL_LOG} 2>&1

# 精准替换核心变量(修改自定义脚本)
sed -i "/^export ORACLE_SID=/c\export ORACLE_SID=${ORACLE_SID}" ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1
sed -i "/^export CHARSET=/c\export CHARSET=ZHS16GBK" ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1
sed -i "/^export PDB_NAME=/c\export PDB_NAME=${ORACLE_SID}" ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1
sed -i "/^export CREATE_AS_CDB=/c\export CREATE_AS_CDB=false" ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1
# 关联orcl专用配置文件
sed -i "/^export ORACLE_CONF_FILE=/c\export ORACLE_CONF_FILE=${ORACLE_CONF_FILE}" ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1

# 追加缺失的变量
grep -q "^export ORACLE_SID=" ${ORACLE_INIT_FILE} || echo "export ORACLE_SID=${ORACLE_SID}" >> ${ORACLE_INIT_FILE}
grep -q "^export CHARSET=" ${ORACLE_INIT_FILE} || echo "export CHARSET=ZHS16GBK" >> ${ORACLE_INIT_FILE}
grep -q "^export PDB_NAME=" ${ORACLE_INIT_FILE} || echo "export PDB_NAME=${ORACLE_SID}" >> ${ORACLE_INIT_FILE}
grep -q "^export CREATE_AS_CDB=" ${ORACLE_INIT_FILE} || echo "export CREATE_AS_CDB=false" >> ${ORACLE_INIT_FILE}
grep -q "^export ORACLE_CONF_FILE=" ${ORACLE_INIT_FILE} || echo "export ORACLE_CONF_FILE=${ORACLE_CONF_FILE}" >> ${ORACLE_INIT_FILE}

chmod +x ${ORACLE_INIT_FILE} >> ${INSTALL_LOG} 2>&1
green "✅ 实例初始化文件配置成功:${ORACLE_INIT_FILE}"
green "   - 实例名: ${ORACLE_SID} | 字符集: ZHS16GBK | CDB模式: 关闭"

# ==================== 复制并修正配置文件 ====================
blue "\n===== 【9/10】创建目录与配置文件 ====="
# 复制默认配置文件并重定向为orcl实例
SOURCE_CONF_FILE="/etc/sysconfig/oracledb_ORCLCDB-19c.conf"
if [ ! -f "${SOURCE_CONF_FILE}" ]; then
    red "错误:默认配置文件不存在!${SOURCE_CONF_FILE}"
    exit 1
fi

# 复制并替换内部实例名
cp ${SOURCE_CONF_FILE} ${ORACLE_CONF_FILE} >> ${INSTALL_LOG} 2>&1
sed -i "s/ORCLCDB/${ORACLE_SID^^}/g" ${ORACLE_CONF_FILE} >> ${INSTALL_LOG} 2>&1
green "✅ 配置文件复制完成:${ORACLE_CONF_FILE}"

# 创建归档与数据目录
mkdir -p /opt/oracle/archivelog >> ${INSTALL_LOG} 2>&1
chown -R oracle:oinstall /opt/oracle/archivelog >> ${INSTALL_LOG} 2>&1
chmod -R 755 /opt/oracle/archivelog >> ${INSTALL_LOG} 2>&1
green "✅ 归档日志目录创建成功"

mkdir -p /opt/oracle/oradata >> ${INSTALL_LOG} 2>&1
chown -R oracle:oinstall /opt/oracle/oradata >> ${INSTALL_LOG} 2>&1
chmod -R 755 /opt/oracle/oradata >> ${INSTALL_LOG} 2>&1
green "✅ 数据文件目录创建成功"

# ==================== 初始化Oracle实例 ====================
blue "\n===== 【10/10】初始化Oracle 19c实例 ====="
cyan "📝 初始化开始,详细日志请查看:${INSTALL_LOG}"
echo -e "\n===== 【实例初始化开始】- $(date) =====" >> ${INSTALL_LOG}

# 新增:初始化进度提示
echo -n "🔄 正在初始化Oracle 19c实例..."

# 修复:改用直接重定向日志,避免PIPESTATUS兼容性问题
${ORACLE_INIT_FILE} configure >> ${INSTALL_LOG} 2>&1
INIT_RET=$?

# 关键:获取真实退出码 + 进度反馈
if [ ${INIT_RET} -eq 0 ]; then
    # 进度提示:初始化成功
    echo -e "\r✅ 初始化Oracle 19c实例完成!"
    
    # 新增:配置开机自启(仅保留systemctl,移除chkconfig)
    echo -n "🔄 正在配置Oracle服务开机自启..."
    systemctl enable $(basename ${ORACLE_INIT_FILE}) >> ${INSTALL_LOG} 2>&1
    ENABLE_RET=$?
    if [ ${ENABLE_RET} -eq 0 ]; then
        echo -e "\r✅ Oracle服务开机自启配置完成!"
    else
        echo -e "\r⚠️ Oracle服务开机自启配置失败(详情见日志)!"
    fi
    
    green "\n======================================================================"
    green "✅ Oracle 19c 在 openEuler 上安装初始化成功!"
    green "======================================================================"
    green "📌 连接信息:"
    green "   SID: ${ORACLE_SID}"
    green "   字符集: ZHS16GBK"
    green "   管理员密码: ${ORACLE_PWD}"
    green "📌 验证命令:"
    green "   su - oracle -c 'sqlplus / as sysdba'"
    green "   su - oracle -c 'lsnrctl status'"
    green "📌 服务管理命令:"
    green "   systemctl start $(basename ${ORACLE_INIT_FILE})"
    green "   systemctl status $(basename ${ORACLE_INIT_FILE})"
    green "======================================================================"
else
    # 进度提示:初始化失败
    echo -e "\r❌ 初始化Oracle 19c实例失败!"
    
    red "\n======================================================================"
    red "❌ Oracle 19c 初始化失败!退出码:${INIT_RET}"
    red "======================================================================"
    red "请查看日志定位问题:tail -50 ${INSTALL_LOG}"
    exit ${INIT_RET}
fi

echo -e "\n===== 【安装完成】- $(date) =====" >> ${INSTALL_LOG}

添加执行权限:

chmod +x /soft/oracle_install.sh

执行脚本(建议在 screen 会话中运行,避免断连):

cd /soft
./oracle_install.sh

五、注意事项

  1. 安装完成后请立即修改Oracle管理员默认密码(本次默认密码:oracle,12!),避免安全风险;

  2. 脚本仅适配 openEuler 22.03 LTS系统,其他版本需自行测试;

  3. 建议安装前备份服务器重要数据,避免操作失误导致数据丢失。

六、版权声明

本文所提供的自动化安装脚本及相关配置,均为笔者基于生产环境实践编写,仅供学习和企业内部运维使用。未经授权,禁止将脚本用于商业用途,禁止篡改后二次分发。如因未遵循最佳实践或擅自修改脚本导致的系统问题,笔者不承担相关责任。

七、下载链接

资源下载(提取码:p7rw)

总结

  1. 本次实现了openEuler 22.03无图形桌面下Oracle 19c的全自动化RPM部署,覆盖系统加固、内核参数配置、实例初始化等全流程;

  2. 验证环节需重点检查数据库连接、监听状态及服务开机自启配置,确保生产环境可用性;

  3. 脚本使用前需完成前置目录和安装包准备,生产环境需调整内核参数至最优状态。

0

💻 博主自用服务器推荐

我平时做Linux实验、排查运维故障、搭建个人博客,全程用阿里云ECS:
✅ 稳定不掉线,大厂品质有保障
✅ 新用户2核2G低至99元/年,性价比拉满
✅ 自带安全组/快照,练手不怕搞坏环境

点击领取阿里云优惠

评论区