在企业服务器运维场景中,openEuler 22.03LTS凭借轻量、安全、高兼容性的特性,成为无图形桌面服务器的主流操作系统;Oracle 19c作为长期支持版本(LTS),是承载企业核心业务的首选数据库。传统手动安装需逐行配置系统依赖、内核参数、实例初始化等十余项操作,易出错且耗时,为此笔者编写了自动化安装脚本,实现全程无图形界面、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. 前置准备
在服务器上创建
/soft目录,用于存放安装所需的所有RPM包;将Oracle 19c EE安装包、依赖包等上传至
/soft目录(本次所需RPM包清单见文末附件);确保服务器已配置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五、注意事项
安装完成后请立即修改Oracle管理员默认密码(本次默认密码:oracle,12!),避免安全风险;
脚本仅适配 openEuler 22.03 LTS系统,其他版本需自行测试;
建议安装前备份服务器重要数据,避免操作失误导致数据丢失。
六、版权声明
本文所提供的自动化安装脚本及相关配置,均为笔者基于生产环境实践编写,仅供学习和企业内部运维使用。未经授权,禁止将脚本用于商业用途,禁止篡改后二次分发。如因未遵循最佳实践或擅自修改脚本导致的系统问题,笔者不承担相关责任。
七、下载链接
总结
本次实现了openEuler 22.03无图形桌面下Oracle 19c的全自动化RPM部署,覆盖系统加固、内核参数配置、实例初始化等全流程;
验证环节需重点检查数据库连接、监听状态及服务开机自启配置,确保生产环境可用性;
脚本使用前需完成前置目录和安装包准备,生产环境需调整内核参数至最优状态。
评论区