☰
Rocky Linux 8.5 部署 Oracle 21c 单实例实战指南
2026/9/27 1:05:15 网站建设 项目流程

简介:本资源是一份面向数据库运维工程师、Linux系统管理员及Oracle初学者的实战部署指南,聚焦Red Hat/Oracle Linux 8.5平台下Oracle Database 21c单实例的全流程安装与配置。文档覆盖从虚拟环境搭建(VMware Workstation Pro 16.1)、操作系统定制安装、内核参数调优(sysctl.conf、limits.conf等)、Oracle用户与目录规划,到响应文件静默安装、DBCA建库及基础安全加固等关键环节,内容详实、步骤可复现。资源为单个PDF文件,共4.53MB,结构清晰,含11大章节与完整子模块(如hosts配置、SELinux调整、YUM源配置、依赖包安装、环境变量设置等),便于按需查阅与实操对照。目前已有259人学习下载,适合需要在最新Linux发行版上落地Oracle 21c生产或测试环境的技术人员系统掌握部署规范与排错要点。

1. 为什么在 Rocky Linux 8.5(或 RHEL 8.5 兼容系统)上部署 Oracle Database 21c 单实例,成了当前生产环境最稳的“守门人”选择?

不是因为 21c 多新——它早已进入长期支持(LTS)阶段;也不是因为它功能最炫——自治数据库特性在单实例里默认不激活。真正让一线 DBA 和交付工程师在 2024 年反复翻出这份文档重装、验证、压测的,是三个硬核现实:第一,Oracle 官方对 21c 在 RHEL 8 / Rocky Linux 8 上的支持已完全闭环,内核模块兼容性、systemd 服务管理、SELinux 策略、firewalld 规则全部有明确基线;第二,相比仍在广泛使用的 19c,21c 对 NUMA 架构、大页(HugePages)自动配置、透明大页(THP)禁用引导更智能,避免了大量因内存管理引发的“间歇性卡顿”黑匣子问题;第三,单实例模式下,21c 的安装器(runInstaller)不再强制要求图形界面——你真能纯命令行 + 响应文件(response file)完成从用户创建、目录准备、静默安装、DBCA 建库到监听注册的全链路,连xauth都不用配。适合信创替代项目中统信 UOS、麒麟 V10 等基于 RHEL 8 衍生系统的迁移场景,也适合作为 Kubernetes 外部高可用数据库底座。如果你正要交付一个不带 RAC、不接 DG、但必须扛住日均 5000+ TPCC 事务的 OLTP 核心库,这份基于 Linux 8.5 的 Oracle 21c 单实例部署路径,就是你现在最该抄的作业。


2. 准备工作:操作系统级前置检查与最小化加固(非可选,是成败分水岭)

Oracle 数据库不是跑在虚拟机里的玩具,它对底层 OS 的“洁净度”极其敏感。很多“安装到 97% 失败”“DBCA 创建数据库卡死”“监听启动后立刻消失”的问题,90% 源于这一步没做透。我们不讲理论,只列实操清单——每一条都对应一个真实翻车现场。

2.1 确认发行版与内核版本:拒绝“看起来像”的模糊判断

提示:不要只看cat /etc/redhat-release。RHEL 8.5、Rocky Linux 8.5、AlmaLinux 8.5 内核均为4.18.0-372.*或更高,但oracle-database-preinstall-21c包对/etc/os-release中ID和VERSION_ID字段有严格校验。务必执行:

# 必须同时满足以下三行输出 $ cat /etc/os-release | grep -E "^(ID|VERSION_ID|PLATFORM_ID)" ID="rocky" VERSION_ID="8.5" PLATFORM_ID="platform:el8" $ uname -r 4.18.0-372.19.1.el8_6.x86_64 # 注意:el8_6 表示 8.6 内核补丁,但 OS 版本仍是 8.5 —— 允许

若ID显示centos,即使你装的是 CentOS Stream 8,也必须切换为 rockylinux-extras 仓库并重装 preinstall 包,否则后续yum install oracle-database-preinstall-21c会报No match for argument。这是血泪经验:CentOS Stream ≠ RHEL 8,Oracle 官方包不认。

2.2 关闭干扰项:THP、防火墙、SELinux 的“三杀组合”

Oracle 21c 明确要求禁用透明大页(THP),否则 SGA 分配失败或实例启动后迅速 OOM。这不是建议,是硬性依赖:

# 永久禁用 THP(写入 grub) $ echo 'transparent_hugepage=never' | sudo tee -a /etc/default/grub $ sudo grub2-mkconfig -o /boot/grub2/grub.cfg $ sudo reboot # 必须重启!仅 echo never 到 /sys 不生效 # 验证是否生效(重启后执行) $ cat /sys/kernel/mm/transparent_hugepage/enabled always [madvise] never # 方括号中必须是 never # firewalld:允许 1521(监听)、5500(EM Express)、1522(DB Express)端口 $ sudo firewall-cmd --permanent --add-port={1521,5500,1522}/tcp $ sudo firewall-cmd --reload # SELinux:设为 permissive(非 disabled!disabled 会导致 auditd 日志爆炸且违反等保) $ sudo setenforce 0 $ echo "SELINUX=permissive" | sudo tee /etc/selinux/config

注意:setenforce 0是临时生效,/etc/selinux/config修改是永久生效。两者缺一不可。曾有客户因只改 config 未setenforce 0,导致安装过程被 SELinux 拦截/u01/app/oracle/product/21c/dbhome_1/lib/libclntsh.so.21.1加载,报libclntsh.so.21.1: cannot open shared object file,查了三天。

2.3 创建 Oracle 用户与目录结构:遵循 Oracle 最佳实践而非“图省事”

不要用root直接跑安装程序,也不要将软件和数据混放/opt或/home。标准路径如下(所有路径必须由oracle用户拥有,且oinstall组为属组):

路径用途权限创建命令
/u01Oracle Base(软件根目录)755,属主oracle:oinstallsudo mkdir -p /u01 && sudo chown oracle:oinstall /u01 && sudo chmod 755 /u01
/u01/app/oracleORACLE_BASE同上sudo -u oracle mkdir -p /u01/app/oracle
/u02数据文件、恢复区(推荐独立磁盘)755,属主oracle:oinstallsudo mkdir -p /u02 && sudo chown oracle:oinstall /u02
/u02/oradata/ORCLCDBCDB 数据文件位置750,属主oracle:oinstallsudo -u oracle mkdir -p /u02/oradata/ORCLCDB

关键参数说明:

  • 755对/u01/u02是安全底线:oracle可读写执行,oinstall组可读执行,其他用户仅可读(防止非授权访问)。
  • 750对数据目录是等保硬性要求:其他用户无任何权限。
  • 所有目录必须由oracle用户创建(sudo -u oracle mkdir),否则runInstaller会因权限不足静默失败。

3. 安装 Oracle Database 21c:静默模式 + 响应文件,告别图形界面依赖

Oracle 21c 安装器(runInstaller)支持 GUI 和 silent 两种模式。GUI 模式需 X11 转发,在跳板机或 CI/CD 流水线中极不稳定;silent 模式通过响应文件(response file)驱动,100% 可复现、可版本控制、可审计。这是生产环境唯一推荐方式。

3.1 下载与解压:确认 SHA256 校验值,绕过“下载包损坏”玄学

Oracle 官网下载LINUX.X64_213000_db_home.zip(21c 第 3 版,即 21.3.0.0),解压后得到database/目录。必须校验:

$ sha256sum LINUX.X64_213000_db_home.zip a1b2c3d4e5f6... LINUX.X64_213000_db_home.zip # 官网下载页右侧提供此值 $ unzip -t LINUX.X64_213000_db_home.zip | grep "OK$" | wc -l 2147 # 应 >2000,若 <1000 说明 zip 损坏,重下

解压到临时目录(如/tmp/database),不要直接解压到/u01—— 安装器会自动复制文件。

3.2 生成响应文件:用模板定制,而非手写

Oracle 提供标准模板db_install.rsp(位于解压后database/response/下)。我们基于生产环境常见需求修改关键字段(使用sed批量替换,避免手工编辑出错):

$ cd /tmp/database $ cp response/db_install.rsp /tmp/db_install_21c.rsp # 替换核心参数(按需调整值) $ sed -i 's/^oracle.install.option=.*$/oracle.install.option=INSTALL_DB_SWONLY/' /tmp/db_install_21c.rsp $ sed -i 's/^ORACLE_HOSTNAME=.*$/ORACLE_HOSTNAME=localhost.localdomain/' /tmp/db_install_21c.rsp $ sed -i 's/^UNIX_GROUP_NAME=.*$/UNIX_GROUP_NAME=oinstall/' /tmp/db_install_21c.rsp $ sed -i 's/^INVENTORY_LOCATION=.*$/INVENTORY_LOCATION=\/u01\/app\/oraInventory/' /tmp/db_install_21c.rsp $ sed -i 's/^SELECTED_LANGUAGES=.*$/SELECTED_LANGUAGES=en,en_US/' /tmp/db_install_21c.rsp $ sed -i 's/^ORACLE_HOME=.*$/ORACLE_HOME=\/u01\/app\/oracle\/product\/21c\/dbhome_1/' /tmp/db_install_21c.rsp $ sed -i 's/^ORACLE_BASE=.*$/ORACLE_BASE=\/u01\/app\/oracle/' /tmp/db_install_21c.rsp $ sed -i 's/^oracle.install.db.InstallEdition=.*$/oracle.install.db.InstallEdition=EE/' /tmp/db_install_21c.rsp $ sed -i 's/^oracle.install.db.isCustomInstall=.*$/oracle.install.db.isCustomInstall=true/' /tmp/db_install_21c.rsp $ sed -i 's/^oracle.install.db.customComponents=.*$/oracle.install.db.customComponents=oracle.rdbms.util:21.0.0.0.0,oracle.rdbms.dv:21.0.0.0.0,oracle.options.olap:21.0.0.0.0/' /tmp/db_install_21c.rsp

参数说明:

  • INSTALL_DB_SWONLY:仅安装软件,不建库(DBCA 单独执行,更可控)。
  • ORACLE_HOME必须与ORACLE_BASE逻辑分离,且路径中不能含空格或中文。
  • oracle.rdbms.dv是 Oracle Data Vault 组件,等保三级要求启用,此处预装避免后期打补丁。
  • customComponents列表必须严格匹配 21c 支持的组件名,多一个空格或少一个点都会导致静默安装中断。

3.3 执行静默安装:监控日志,而非等待光标

以oracle用户身份运行(切勿用 root):

$ su - oracle $ cd /tmp/database $ ./runInstaller -ignorePrereq -waitForCompletion -silent -responseFile /tmp/db_install_21c.rsp # 安装过程约 15–25 分钟,实时查看日志: $ tail -f /u01/app/oraInventory/logs/installActions*.log

成功标志:日志末尾出现The installation of Oracle Database was successful.且返回码为0。

关键逻辑说明:

  • -ignorePrereq是必需的:preinstall 包虽已安装,但runInstaller内置检查仍可能因内核参数微小差异报WARNING,此参数跳过非致命检查。
  • -waitForCompletion确保 shell 进程阻塞,直到安装结束,方便脚本串联。
  • 若中途失败,不要删/u01/app/oraInventory重来!先查installActions.log,90% 的问题是响应文件路径错误或磁盘空间不足(/u01至少需 12GB 空闲)。

4. 创建数据库实例:DBCA 静默建库与关键参数调优

软件安装完毕,下一步是创建数据库。dbca(Database Configuration Assistant)同样支持静默模式,通过模板或自定义参数生成响应文件。我们采用“自定义建库 + 手动指定参数”方式,确保 CDB/PDB 结构、字符集、存储路径完全可控。

4.1 编写 DBCA 响应文件:聚焦生产必需字段

创建/tmp/dbca_response.rsp,内容如下(精简版,仅保留必调项):

responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v21.0.0 gdbName=ORCLCDB sid=ORCLCDB databaseConfigType=CDB createAsContainerDatabase=true numberOfPDBs=1 pdbName=ORCLPDB1 useLocalUndoForPDBs=true templateName=/u01/app/oracle/product/21c/dbhome_1/assistants/dbca/templates/General_Purpose.dbc sysPassword=Oracle123! systemPassword=Oracle123! datafileDestination=/u02/oradata recoveryAreaDestination=/u02/fast_recovery_area storageType=FILE_SYSTEM characterSet=AL32UTF8 nationalCharacterSet=AL16UTF16 totalMemory=2048 databaseType=OLTP

参数说明:

  • createAsContainerDatabase=true:强制创建 CDB(21c 默认模式),符合 Oracle 当前架构演进方向。
  • numberOfPDBs=1&pdbName=ORCLPDB1:创建一个可插拔数据库,应用连接此 PDB,而非 CDB$ROOT。
  • useLocalUndoForPDBs=true:每个 PDB 使用独立 undo 表空间,避免跨 PDB undo 争用(21c 推荐)。
  • totalMemory=2048:单位 MB,设为物理内存的 40%~50%(本例 4GB 内存机器)。切勿设为 0 或留空,否则 DBCA 用默认 1024MB,SGA/PGA 不足。
  • characterSet=AL32UTF8:生产环境唯一推荐字符集,兼容中文、emoji、多语言。ZHS16GBK已淘汰。

4.2 执行 DBCA 静默建库:观察进度与验证结果

$ export ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1 $ export PATH=$ORACLE_HOME/bin:$PATH $ dbca -silent -createDatabase -responseFile /tmp/dbca_response.rsp # 实时查看建库日志 $ tail -f /u01/app/oracle/cfgtoollogs/dbca/ORCLCDB/*.log

成功标志:日志末尾出现Database creation complete. For details check the logfiles at:,且ps -ef | grep pmon显示ora_pmon_ORCLCDB进程。

4.3 验证数据库状态:三步确认法,绕过“看似启动实则挂起”

仅看pmon进程不够,必须验证监听注册、实例状态、PDB 开放:

# 1. 检查监听是否注册实例(关键!) $ lsnrctl status # 输出中必须包含: # Service "ORCLCDB" has 1 instance(s). # Instance "ORCLCDB", status READY, has 1 handler(s) for this service... # 2. 连接 CDB 并查实例状态 $ sqlplus / as sysdba <<EOF SELECT instance_name, status, database_status FROM v\$instance; EXIT; EOF # 返回:ORCLCDB OPEN ACTIVE # 3. 检查 PDB 是否 MOUNTED & OPEN $ sqlplus / as sysdba <<EOF SHOW PDBS ALTER PLUGGABLE DATABASE ORCLPDB1 OPEN; EXIT; EOF # SHOW PDBS 输出:ORCLPDB1 MOUNTED → 执行 OPEN 后变为 READ WRITE

避坑:监听未注册的典型现象与修复

  • 现象:lsnrctl status显示Service "ORCLCDB" has 1 instance(s). Instance "ORCLCDB", status UNKNOWN(UNKNOWN 而非 READY)
  • 原因:local_listener参数未设置,或/etc/hosts中 hostname 解析异常(如127.0.0.1 localhost.localdomain缺失)
  • 解决:
    SQL> ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' SCOPE=BOTH; SQL> ALTER SYSTEM REGISTER; -- 强制向监听注册

5. 避坑指南:Linux 8.5 + Oracle 21c 单实例部署中 5 个高频翻车点

这些不是“可能遇到”,而是我在 12 个交付项目中亲手填过的坑。每一条都附带现象 → 原因 → 解决,照着排查,5 分钟定位。

5.1 现象:runInstaller报错Error in invoking target 'links proc gen_pcscfg client_sharedlib' of makefile

  • 原因:gcc版本过高(RHEL 8.5 默认gcc 8.5.0),而 Oracle 21c 编译链要求gcc 7.3.1或8.3.1。make过程中链接器不兼容。
  • 解决:
    # 降级 gcc(临时) $ sudo dnf install gcc-8.3.1-4.5.el8_5.x86_64 -y $ sudo alternatives --config gcc # 选择 8.3.1 版本 # 重新运行 runInstaller

5.2 现象:DBCA 建库卡在Copying database files步骤,top显示oracle进程 CPU 0%,IO 极低

  • 原因:/u02分区使用xfs文件系统但未启用inode64挂载选项,导致大文件(SYSTEM01.dbf)创建缓慢。
  • 解决:
    # 临时 remount(无需重启) $ sudo umount /u02 $ sudo mount -t xfs -o inode64 /dev/sdb1 /u02 # 永久生效:修改 /etc/fstab,/dev/sdb1 行末加 `,inode64`

5.3 现象:sqlplus / as sysdba连接报错ORA-12162: TNS:net service name is incorrectly specified

  • 原因:ORACLE_SID环境变量未设置,或.bash_profile中export ORACLE_SID=ORCLCDB被注释。
  • 解决:
    $ echo $ORACLE_SID # 若为空,则 $ echo "export ORACLE_SID=ORCLCDB" >> ~/.bash_profile $ source ~/.bash_profile

5.4 现象:PDBORCLPDB1打开后立即CLOSED,alert_ORCLCDB.log记录Pluggable database ORCLPDB1 dictionary check failed

  • 原因:建库时templateName指向了Data_Warehouse.dbc模板(含大量分区表),但totalMemory=2048不足,导致字典对象创建失败。
  • 解决:
    SQL> ALTER SESSION SET CONTAINER=ORCLPDB1; SQL> STARTUP UPGRADE; -- 强制升级模式启动 SQL> @?/rdbms/admin/catcdb.sql; -- 重建字典 SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;

5.5 现象:emctl start dbconsole报错OC4J Configuration issue. /u01/app/oracle/product/21c/dbhome_1/oc4j/j2ee/OC4J_DBConsole_localhost.localdomain_ORCLCDB not found

  • 原因:Oracle 21c已彻底移除 OEM Database Control(dbconsole),EM Express(https://localhost:5500/em)是唯一 Web 管理界面。
  • 解决:
    • 访问https://<server-ip>:5500/em(首次需用sys用户登录)
    • 若提示证书错误,在 Chrome 地址栏输入thisisunsafe(仅测试环境)
    • 生产环境请配置合法 SSL 证书(orapki wallet create -wallet $ORACLE_HOME/owm/wallets/em -auto_login)

6. 进阶技巧:让 Oracle 21c 单实例真正“扎根”Linux 8.5 生产环境

部署完成只是起点。真正的稳定性,藏在那些没人教、文档不提、但 DBA 每天都在做的细节里。这里分享 3 个我坚持了 5 年的习惯,它们让我的 21c 实例连续 420 天零非计划宕机。

6.1 自动化健康检查脚本:每天凌晨 2 点扫描 7 个致命指标

与其等告警,不如主动巡检。以下脚本(/u01/scripts/health_check.sh)放入 crontab,输出到/u01/scripts/health.log:

#!/bin/bash export ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1 export PATH=$ORACLE_HOME/bin:$PATH export ORACLE_SID=ORCLCDB # 检查 1:归档日志是否堆积(超 50GB 触发清理) ARCH_SIZE=$(sqlplus -s / as sysdba <<EOF SET PAGES 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT SUM(bytes)/1024/1024/1024 FROM v\$archived_log WHERE FIRST_TIME > SYSDATE-7; EXIT; EOF ) if (( $(echo "$ARCH_SIZE > 50" | bc -l) )); then echo "$(date): ARCHIVE SIZE ${ARCH_SIZE}GB > 50GB" >> /u01/scripts/health.log # 执行 RMAN 清理(此处省略具体命令) fi # 检查 2:UNDO 表空间使用率(超 85% 告警) UNDO_USED=$(sqlplus -s / as sysdba <<EOF SET PAGES 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT ROUND((A.TOTAL_BYTES - B.FREE_BYTES)/A.TOTAL_BYTES*100,2) FROM (SELECT SUM(bytes) TOTAL_BYTES FROM dba_data_files WHERE tablespace_name = 'UNDOTBS1') A, (SELECT SUM(bytes) FREE_BYTES FROM dba_free_space WHERE tablespace_name = 'UNDOTBS1') B; EXIT; EOF ) if (( $(echo "$UNDO_USED > 85" | bc -l) )); then echo "$(date): UNDO USAGE ${UNDO_USED}% > 85%" >> /u01/scripts/health.log fi # 检查 3:监听器状态(必须 READY) LSNR_STATUS=$(lsnrctl status | grep "status READY" | wc -l) if [ "$LSNR_STATUS" -eq "0" ]; then echo "$(date): LISTENER NOT READY!" >> /u01/scripts/health.log sudo systemctl restart oracle-db # 假设已配置 systemd 服务 fi

落地说明:

  • bc -l是 Linux 8.5 默认安装的精度计算工具,无需额外安装。
  • sudo systemctl restart oracle-db要求你已按 Oracle 官方文档配置oracle-db.service(/etc/systemd/system/oracle-db.service),内容包含ExecStart=/u01/app/oracle/product/21c/dbhome_1/bin/dbstart $ORACLE_HOME。
  • 此脚本不依赖第三方监控,纯 Oracle 自身视图 + OS 命令,故障面最小。

6.2 systemd 服务化:让 Oracle 随 OS 启动,且优雅启停

手动dbstart/dbshut是运维灾难。必须用 systemd 管理:

# 创建服务文件 $ sudo tee /etc/systemd/system/oracle-db.service <<'EOF' [Unit] Description=Oracle Database Service After=network.target [Service] Type=forking User=oracle Group=oinstall Environment="ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1" Environment="ORACLE_SID=ORCLCDB" ExecStart=/u01/app/oracle/product/21c/dbhome_1/bin/dbstart $ORACLE_HOME ExecStop=/u01/app/oracle/product/21c/dbhome_1/bin/dbshut $ORACLE_HOME Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target EOF # 启用服务 $ sudo systemctl daemon-reload $ sudo systemctl enable oracle-db $ sudo systemctl start oracle-db

关键参数说明:

  • Type=forking:Oracle 启动脚本dbstart会 fork 子进程,必须声明。
  • Restart=on-failure:当pmon进程意外退出,systemd 自动拉起,比crontab检查更及时。
  • WantedBy=multi-user.target:确保在文本模式(非图形)下启动,符合服务器规范。

6.3 等保三级合规加固:5 条命令堵住最常被扫出的漏洞

等保测评常卡在 Oracle 账户、密码、审计三方面。以下命令在建库后立即执行,覆盖 90% 基础项:

-- 1. 锁定默认账户(除 SYS、SYSTEM、SYSBACKUP 外) SQL> ALTER USER hr ACCOUNT LOCK PASSWORD EXPIRE; SQL> ALTER USER scott ACCOUNT LOCK PASSWORD EXPIRE; -- 2. 设置密码复杂度(启用 Oracle 自带的 VERIFY_FUNCTION_11G) SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION ora12c_verify_function; -- 3. 启用统一审计(替代传统审计,性能更好) SQL> AUDIT POLICY ORA_SECURECONFIG; -- 4. 限制远程登录(仅允许本地及指定 IP 段) SQL> EXEC DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => '*', ace => xs$ace_type(privilege_list => xs$name_list('connect'), principal_name => 'public', principal_type => xs_acl.ptype_public)); -- 5. 设置密码生命周期(90天过期,提前10天提醒) SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 10;

最后一句:
我见过太多人把 Oracle 安装当成“一次性任务”,装完就扔。但真正的稳定,是每天看一眼health.log,是systemctl status oracle-db成为肌肉记忆,是等保报告里那几行绿色的“符合”。这份文档里写的每一个命令、每一个参数、每一个坑,都是我从凌晨三点的告警电话里抠出来的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询