Rocky Linux 8.5 部署 Oracle 21c 单实例实战指南
简介本资源是一份面向数据库运维工程师、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 规则全部有明确基线第二相比仍在广泛使用的 19c21c 对 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) IDrocky VERSION_ID8.5 PLATFORM_IDplatform: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 8Oracle 官方包不认。2.2 关闭干扰项THP、防火墙、SELinux 的“三杀组合”Oracle 21c 明确要求禁用透明大页THP否则 SGA 分配失败或实例启动后迅速 OOM。这不是建议是硬性依赖# 永久禁用 THP写入 grub $ echo transparent_hugepagenever | 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监听、5500EM Express、1522DB Express端口 $ sudo firewall-cmd --permanent --add-port{1521,5500,1522}/tcp $ sudo firewall-cmd --reload # SELinux设为 permissive非 disableddisabled 会导致 auditd 日志爆炸且违反等保 $ sudo setenforce 0 $ echo SELINUXpermissive | 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.zip21c 第 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.optionINSTALL_DB_SWONLY/ /tmp/db_install_21c.rsp $ sed -i s/^ORACLE_HOSTNAME.*$/ORACLE_HOSTNAMElocalhost.localdomain/ /tmp/db_install_21c.rsp $ sed -i s/^UNIX_GROUP_NAME.*$/UNIX_GROUP_NAMEoinstall/ /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_LANGUAGESen,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.InstallEditionEE/ /tmp/db_install_21c.rsp $ sed -i s/^oracle.install.db.isCustomInstall.*$/oracle.install.db.isCustomInstalltrue/ /tmp/db_install_21c.rsp $ sed -i s/^oracle.install.db.customComponents.*$/oracle.install.db.customComponentsoracle.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.log90% 的问题是响应文件路径错误或磁盘空间不足/u01至少需 12GB 空闲。4. 创建数据库实例DBCA 静默建库与关键参数调优软件安装完毕下一步是创建数据库。dbcaDatabase Configuration Assistant同样支持静默模式通过模板或自定义参数生成响应文件。我们采用“自定义建库 手动指定参数”方式确保 CDB/PDB 结构、字符集、存储路径完全可控。4.1 编写 DBCA 响应文件聚焦生产必需字段创建/tmp/dbca_response.rsp内容如下精简版仅保留必调项responseFileVersion/oracle/assistants/rspfmt_dbca_response_schema_v21.0.0 gdbNameORCLCDB sidORCLCDB databaseConfigTypeCDB createAsContainerDatabasetrue numberOfPDBs1 pdbNameORCLPDB1 useLocalUndoForPDBstrue templateName/u01/app/oracle/product/21c/dbhome_1/assistants/dbca/templates/General_Purpose.dbc sysPasswordOracle123! systemPasswordOracle123! datafileDestination/u02/oradata recoveryAreaDestination/u02/fast_recovery_area storageTypeFILE_SYSTEM characterSetAL32UTF8 nationalCharacterSetAL16UTF16 totalMemory2048 databaseTypeOLTP参数说明createAsContainerDatabasetrue强制创建 CDB21c 默认模式符合 Oracle 当前架构演进方向。numberOfPDBs1pdbNameORCLPDB1创建一个可插拔数据库应用连接此 PDB而非 CDB$ROOT。useLocalUndoForPDBstrue每个 PDB 使用独立 undo 表空间避免跨 PDB undo 争用21c 推荐。totalMemory2048单位 MB设为物理内存的 40%~50%本例 4GB 内存机器。切勿设为 0 或留空否则 DBCA 用默认 1024MBSGA/PGA 不足。characterSetAL32UTF8生产环境唯一推荐字符集兼容中文、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 UNKNOWNUNKNOWN 而非 READY原因local_listener参数未设置或/etc/hosts中 hostname 解析异常如127.0.0.1 localhost.localdomain缺失解决SQL ALTER SYSTEM SET local_listener(ADDRESS(PROTOCOLTCP)(HOSTlocalhost)(PORT1521)) SCOPEBOTH; 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 版本 # 重新运行 runInstaller5.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 行末加 ,inode645.3 现象sqlplus / as sysdba连接报错ORA-12162: TNS:net service name is incorrectly specified原因ORACLE_SID环境变量未设置或.bash_profile中export ORACLE_SIDORCLCDB被注释。解决$ echo $ORACLE_SID # 若为空则 $ echo export ORACLE_SIDORCLCDB ~/.bash_profile $ source ~/.bash_profile5.4 现象PDBORCLPDB1打开后立即CLOSEDalert_ORCLCDB.log记录Pluggable database ORCLPDB1 dictionary check failed原因建库时templateName指向了Data_Warehouse.dbc模板含大量分区表但totalMemory2048不足导致字典对象创建失败。解决SQL ALTER SESSION SET CONTAINERORCLPDB1; 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 ControldbconsoleEM Expresshttps://localhost:5500/em是唯一 Web 管理界面。解决访问https://server-ip:5500/em首次需用sys用户登录若提示证书错误在 Chrome 地址栏输入thisisunsafe仅测试环境生产环境请配置合法 SSL 证书orapki wallet create -wallet $ORACLE_HOME/owm/wallets/em -auto_login6. 进阶技巧让 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_SIDORCLCDB # 检查 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 # 检查 2UNDO 表空间使用率超 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] DescriptionOracle Database Service Afternetwork.target [Service] Typeforking Useroracle Groupoinstall EnvironmentORACLE_HOME/u01/app/oracle/product/21c/dbhome_1 EnvironmentORACLE_SIDORCLCDB ExecStart/u01/app/oracle/product/21c/dbhome_1/bin/dbstart $ORACLE_HOME ExecStop/u01/app/oracle/product/21c/dbhome_1/bin/dbshut $ORACLE_HOME Restarton-failure RestartSec10 [Install] WantedBymulti-user.target EOF # 启用服务 $ sudo systemctl daemon-reload $ sudo systemctl enable oracle-db $ sudo systemctl start oracle-db关键参数说明TypeforkingOracle 启动脚本dbstart会 fork 子进程必须声明。Restarton-failure当pmon进程意外退出systemd 自动拉起比crontab检查更及时。WantedBymulti-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成为肌肉记忆是等保报告里那几行绿色的“符合”。这份文档里写的每一个命令、每一个参数、每一个坑都是我从凌晨三点的告警电话里抠出来的。希望帮到你。本文还有配套的精品资源点击获取