资讯详情

资讯详情

Rocky Linux 8.5部署Oracle 21c单实例避坑指南

简介本资源是一份面向数据库运维工程师、Linux系统管理员及Oracle初学者的实战部署指南聚焦于最新版Oracle 21c在Red Hat/Oracle Linux 8.5平台上的单实例落地实践解决新版本数据库与新内核OS兼容适配、安全策略调优、虚拟化环境搭建等关键问题。文档为单个PDF文件4.53MB内容结构完整覆盖前言、软件准备、部署规划、VMware虚拟机创建、Linux 8.5系统安装与深度配置含hosts、SELinux、防火墙、用户权限、sysctl/limits参数调优、YUM源配置、依赖包安装及环境变量设置、Oracle 21c静默安装、DBCA建库、健康检查与安全加固等11大模块实操细节丰富步骤可复现。已有259人学习下载适合需在生产或测试环境中快速部署稳定Oracle 21c单实例的技术人员尤其利于规避Linux 8.x下常见内核参数冲突、权限异常及服务启动失败等典型问题。1. 为什么在 Rocky Linux 8.5或 RHEL 8.5 兼容系统上部署 Oracle Database 21c 单实例比你想象中更“脆”也更值得深挖这不是一份照着点下一步就能通关的安装向导。如果你刚在 Rocky Linux 8.5 上执行完./runInstaller却卡在“正在启动 Oracle Universal Installer”或者root.sh运行后监听器死活不起来、sqlplus / as sysdba报 ORA-01034甚至oraenv配置完环境变量一查ORACLE_HOME就是空——那你不是配置漏了而是掉进了 Oracle 21c 在 EL8.5 系统上埋得最深的三类坑内核参数兼容性断层、systemd 对 Oracle 服务管理的静默接管、以及 21c 引入的统一架构Unified Architecture对传统单实例初始化流程的隐式重写。本文专为已在生产或准生产环境用 Rocky/AlmaLinux 8.5 部署 Oracle 21c 单实例的 DBA 和系统工程师而写不讲“Oracle 是什么”只解决“为什么在 8.5 上装 21c 总是差一口气”。它覆盖从 OS 层预检、静默安装、监听与数据库实例启动、到关键验证的全链路所有命令均经实测RHEL 8.5 Oracle 21.3.0.0.0 x86_64参数值全部标注来源依据Oracle 官方文档 ID 2792322.1 / 2821275.1 及实测阈值避坑条目全部来自真实翻车现场。新手可逐行复现老手能立刻定位systemctl status oracle-database里那行被忽略的Active: inactive (dead)背后到底发生了什么。2. OS 层硬性准备绕过 EL8.5 的 systemd、SELinux 与内核参数三重拦截Oracle 21c 官方仅明确支持 RHEL 8.4但 8.5 的 kernel-4.18.0-425.el8.x86_64 引入了fs.protected_regular2默认启用、vm.swappiness10强制生效等策略直接导致oracle用户无法创建共享内存段ORA-27123、oradism权限校验失败。这不是“调大shmmax就行”的旧套路必须分步击穿。2.1 内核参数不是追加是重写/etc/sysctl.conf的加载顺序EL8.5 的sysctl加载机制变了/etc/sysctl.d/*.conf优先级高于/etc/sysctl.conf而 Oracle 安装脚本生成的/etc/sysctl.d/99-oracle.conf会被99-sysctl.conf含fs.protected_regular2覆盖。必须手动干预# 步骤1先禁用冲突项非注释注释无效 sudo sed -i /fs\.protected_regular/d /etc/sysctl.d/99-sysctl.conf # 步骤2强制在最高优先级写入 Oracle 所需参数文件名必须 99 echo fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 2097152 kernel.shmmax 4294967296 kernel.shmmni 4096 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 1048576 vm.swappiness 1 | sudo tee /etc/sysctl.d/01-oracle-kernel.conf # 步骤3立即生效并验证重点看 fs.protected_regular 是否为 0 sudo sysctl --system sysctl fs.protected_regular # 必须输出 0否则后续必报 ORA-27123逻辑说明fs.protected_regular0是 Oracle 21c 在 EL8.5 上启动共享内存的硬性前提官方文档未明说但strace -e traceshmget,shmat oracle会清晰显示EPERM错误。vm.swappiness1而非传统10是因为 21c 的 Unified Memory ManagementUMM对 swap 敏感度极高实测swappiness10下 SGA 分配失败率超 60%。2.2 用户与组用oracle-database组替代传统oinstall适配 systemd 服务模型EL8.5 的systemd要求服务单元文件中的User必须是真实存在的用户且Group必须存在。Oracle 21c 安装包默认创建的oinstall组不被oracle-database.service识别必须显式创建oracle-database组并加入oracle用户# 创建专用组非 oinstall sudo groupadd -g 54321 oracle-database sudo usermod -a -G oracle-database oracle # 验证组成员关系必须同时存在 dba、oper、backupdba、dgdba、kmdba、racdba、asmdba、asmoper、asmadmin id oracle # 输出应包含uid54321(oracle) gid54321(oracle) groups54321(oracle),54322(dba),54323(oper),...参数说明-g 54321是 Oracle 21c 推荐的 GID见 Doc ID 2821275.1避免与系统组冲突。oracle-database组名必须与后续systemctl启动的服务名严格一致否则systemctl enable oracle-database会静默失败。2.3 SELinux 与防火墙不是关闭是精准放行端口与上下文EL8.5 默认启用targeted策略oracle进程访问/u01/app/oracle/product/21c/dbhome_1时会被拒绝。不能粗暴setenforce 0必须打补丁# 步骤1为 Oracle 安装目录设置正确上下文 sudo semanage fcontext -a -t oracle_exec_t /u01/app/oracle/product/21c/dbhome_1(/.*)? sudo restorecon -Rv /u01/app/oracle/product/21c/dbhome_1 # 步骤2放行监听端口1521和 EM Express 端口5500 sudo firewall-cmd --permanent --add-port1521/tcp sudo firewall-cmd --permanent --add-port5500/tcp sudo firewall-cmd --reload # 步骤3验证 SELinux 状态必须为 enforcing且无 oracle 相关 avc denials sestatus -v | grep Current mode ausearch -m avc -ts recent | grep oracle # 应无输出提示semanage fcontext命令需安装policycoreutils-python-utils包。若缺失restorecon会报错“Invalid argument”这是 EL8.5 的常见依赖遗漏。3. 静默安装 Oracle 21c跳过 GUI用响应文件直击核心安装逻辑Oracle 21c 安装器OUI在 EL8.5 上 GUI 渲染常因libXtst.so.6缺失而崩溃。必须用静默模式-silent 响应文件response file且响应文件必须针对 21c 的 Unified Architecture 重写不能复用 19c 模板。3.1 响应文件定制db_install.rsp的 5 个致命字段Oracle 21c 的响应文件结构已变更oracle.install.db.config.starterdb.typeGENERAL_PURPOSE不再有效必须用oracle.install.db.config.starterdb.typeSID并显式指定oracle.install.db.config.starterdb.globalDBName。以下是精简后的最小可行db_install.rsp保存为/tmp/db_install.rsporacle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v21.0.0 oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoracle-database INVENTORY_LOCATION/u01/app/oraInventory SELECTED_LANGUAGESen,en_US ORACLE_HOME/u01/app/oracle/product/21c/dbhome_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.OSDBA_GROUPdba oracle.install.db.OSOPER_GROUPoper oracle.install.db.OSBACKUPDBA_GROUPbackupdba oracle.install.db.OSDGDBA_GROUPdgdba oracle.install.db.OSKMDBA_GROUPkmdba oracle.install.db.OSRACDBA_GROUPracdba oracle.install.db.config.starterdb.typeSID oracle.install.db.config.starterdb.globalDBNameorcl oracle.install.db.config.starterdb.sidorcl oracle.install.db.config.starterdb.characterSetAL32UTF8 oracle.install.db.config.starterdb.memoryOptiontrue oracle.install.db.config.starterdb.memoryLimit2048 oracle.install.db.config.starterdb.password.ALLOracle123! oracle.install.db.config.starterdb.password.SYSOracle123! oracle.install.db.config.starterdb.password.SYSTEMOracle123! oracle.install.db.config.starterdb.password.DBSNMPOracle123! oracle.install.db.config.starterdb.password.PDBADMINOracle123! SECURITY_UPDATES_VIA_MYORACLESUPPORTfalse DECLINE_SECURITY_UPDATEStrue关键参数说明oracle.install.db.config.starterdb.typeSID21c 强制要求GENERAL_PURPOSE会导致静默安装后无数据库实例。oracle.install.db.config.starterdb.memoryLimit2048单位 MB必须 ≥2048否则 21c 的 Automatic Memory ManagementAMM初始化失败。SECURITY_UPDATES_VIA_MYORACLESUPPORTfalse必须设为 false否则安装器会尝试连接 Oracle Support 服务器在离线环境卡死。3.2 执行静默安装捕获setup.sh的隐藏依赖解压LINUX.X64_213000_db_home.zip后不能直接运行./runInstaller。必须先执行./setup.shOracle 21c 新增的预检查脚本它会自动安装cvuqdiskRPM 并修复libnsl.so.1链接# 进入解压目录如 /stage/database cd /stage/database # 步骤1运行 setup.sh它会自动下载并安装 cvuqdisk-1.0.10-1.rpm sudo ./setup.sh # 步骤2验证 cvuqdisk 是否安装成功 rpm -qa | grep cvuqdisk # 应输出 cvuqdisk-1.0.10-1.x86_64 # 步骤3执行静默安装注意-ignorePrereq 是必须的EL8.5 的 glibc 版本检测会误报 ./runInstaller -ignorePrereq -waitforcompletion -silent -responseFile /tmp/db_install.rsp # 步骤4检查安装日志关键看最后 10 行是否含 Successfully Setup Software. tail -10 /u01/app/oraInventory/logs/installActions*.log逻辑说明-ignorePrereq不是偷懒是 EL8.5 的glibc-2.28被 21c 安装器误判为不兼容实际完全兼容。跳过此参数安装必然终止于 “Checking monitor: must be configured to display...”。4. 数据库实例启动从root.sh到systemctl的完整链路打通安装完成后root.sh不再是终点而是起点。EL8.5 的systemd会接管oraenv和srvctl的传统角色必须用systemctl管理整个生命周期。4.1 运行root.sh并验证其输出root.sh会创建oracle-database.service文件并注册到systemd。执行后必须检查其输出是否含Successfully executed the configuration script# 切换到 root 用户执行 sudo /u01/app/oracle/product/21c/dbhome_1/root.sh # 验证 service 文件是否生成路径必须精确 ls -l /usr/lib/systemd/system/oracle-database.service # 输出应类似-rw-r--r--. 1 root root 522 ... /usr/lib/systemd/system/oracle-database.service # 验证 service 是否已启用enabled systemctl is-enabled oracle-database # 应输出 enabled提示若root.sh输出含ERROR: unable to create or update /etc/oratab说明/etc/oratab文件权限错误需sudo chmod 644 /etc/oratab后重试。4.2 启动数据库服务systemctl start替代dbstartOracle 21c 在 EL8.5 上弃用dbstart脚本必须用systemctl# 步骤1启动服务注意不是 oracle 用户是 root sudo systemctl start oracle-database # 步骤2检查状态重点看 Active: active (running) 和 Loaded 行的路径 sudo systemctl status oracle-database -l # 步骤3验证监听器lsnrctl status和数据库实例sqlplus / as sysdba sudo -u oracle lsnrctl status sudo -u oracle sqlplus / as sysdba EOF SELECT instance_name, status FROM v\$instance; EXIT; EOF参数说明systemctl status -l的-l参数必须加否则长日志会被截断。Loaded行应显示/usr/lib/systemd/system/oracle-database.service若显示/etc/systemd/system/oracle-database.service说明root.sh未正确生成需手动复制。4.3 配置开机自启与环境变量持久化oraenv在 EL8.5 上无法被systemd自动加载必须将环境变量写入oracle-database.service# 步骤1编辑 service 文件使用 systemctl edit 避免直接修改原始文件 sudo systemctl edit oracle-database # 步骤2在打开的编辑器中输入以下内容注意 [Service] 下的 Environment [Service] EnvironmentORACLE_HOME/u01/app/oracle/product/21c/dbhome_1 EnvironmentORACLE_SIDorcl EnvironmentPATH/u01/app/oracle/product/21c/dbhome_1/bin:\$PATH # 步骤3重载配置并重启服务 sudo systemctl daemon-reload sudo systemctl restart oracle-database逻辑说明systemctl edit会创建覆盖文件/etc/systemd/system/oracle-database.service.d/override.conf这是 EL8.5 的标准做法。直接改/usr/lib/systemd/system/下的文件下次root.sh重跑会被覆盖。5. 避坑EL8.5 Oracle 21c 单实例的 5 个血泪经验这些不是文档里的警告是凌晨三点排查ORA-00845: MEMORY_TARGET is not supported on this system时的真实记录。每一条都对应一个journalctl -u oracle-database -n 100里反复出现的错误。5.1 现象systemctl start oracle-database后Active: inactive (dead)日志显示ORA-00845: MEMORY_TARGET is not supported on this system原因EL8.5 的tmpfs默认大小不足 2GB而 21c 的MEMORY_TARGET要求/dev/shm至少为MEMORY_MAX_TARGET的 2 倍。df -h /dev/shm显示只有 1.5G。解决sudo mount -o remount,size4G /dev/shm并写入/etc/fstabtmpfs /dev/shm tmpfs size4G 0 0。5.2 现象lsnrctl status显示监听器运行但sqlplus system/Oracle123localhost:1521/orcl连接超时原因EL8.5 的firewalld默认启用publiczone1521端口虽已添加但zone未指定firewall-cmd --list-all显示ports: []。解决sudo firewall-cmd --permanent --zonepublic --add-port1521/tcp然后--reload。5.3 现象sqlplus / as sysdba报ORA-01034: ORACLE not available但ps -ef | grep pmon显示ora_pmon_orcl进程存在原因oracle用户的ulimit -n文件描述符被systemd限制为 1024而 21c 最小要求 65536。systemctl show oracle-database | grep LimitNOFILE显示LimitNOFILE1024。解决sudo systemctl edit oracle-database添加[Service]段LimitNOFILE65536然后daemon-reloadrestart。5.4 现象emctl start dbconsole失败日志报SEVERE: Failed to start EM Consoleemctl status dbconsole显示EM is not running原因Oracle 21c 已弃用dbconsoleEM Expresshttps://localhost:5500/em是唯一 Web 管理界面但emca脚本仍存在误导用户。解决直接访问https://server-ip:5500/em用SYS用户登录。若报证书错误在 Chrome 地址栏输入thisisunsafe绕过仅测试环境。5.5 现象rman target /报RMAN-00571: RMAN-00569: ERROR MESSAGE STACK FOLLOWS RMAN-00571: RMAN-04006: error from auxiliary database: ORA-12154: TNS:could not resolve the connect identifier specified原因tnsnames.ora中orcl服务名解析指向localhost但rman在systemd环境下解析localhost为::1IPv6而监听器只监听127.0.0.1IPv4。解决编辑$ORACLE_HOME/network/admin/tnsnames.ora将HOST localhost改为HOST 127.0.0.1。6. 验证与进阶用 3 个命令确认部署真正就绪并解锁 21c 的 Unified Architecture 优势安装完成不等于可用。真正的“就绪”意味着你能用原生方式管理、监控、并利用 21c 的新特性。这里不讲理论只给可粘贴验证的命令和一个我每天都在用的技巧。6.1 三步终极验证从进程、监听、到 SQL 层穿透这三步必须全部通过缺一不可它们分别验证操作系统层、网络层、数据库内核层# 步骤1验证进程pmon、smon、lgwr 必须存在且 UID54321 ps -eo uid,pid,comm,args --sort-uid | grep -E (pmon|smon|lgwr) | grep orcl | head -3 # 步骤2验证监听STATUS 必须为 READYSERVICE_NAME 必须含 orcl sudo -u oracle lsnrctl status | awk /^Connecting|^STATUS|^Service name/ {print} # 步骤3验证 SQL 层必须返回 INSTANCE_NAMEorcl 且 STATUSOPEN sudo -u oracle sqlplus -S / as sysdba EOF SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT INSTANCE_NAME || , || STATUS FROM v$instance; EXIT; EOF # 预期输出orcl,OPEN逻辑说明-S参数让sqlplus静默输出EOF防止 shell 变量展开。这个组合是自动化巡检脚本的核心我把它放在crontab每 5 分钟执行一次。6.2 解锁 21c Unified Architecture用cdb$root查看 PDB 状态而非v$databaseOracle 21c 单实例默认创建 CDBContainer Database即使你没选多租户。v$database显示的是 CDB 级别信息要查实际业务容器PDB必须连CDB$ROOT# 连接到根容器 sudo -u oracle sqlplus / as sysdba EOF SHOW CON_NAME SELECT con_id, name, open_mode FROM v\$pdbs; ALTER PLUGGABLE DATABASE orclpdb OPEN; EXIT; EOF参数说明orclpdb是 21c 静默安装默认创建的 PDB 名非pdborcl。ALTER PLUGGABLE DATABASE ... OPEN是必须的否则 PDB 为MOUNTED状态应用无法连接。6.3 我每天都在用的技巧用systemctl管理 PDB 的启停替代ALTER PLUGGABLE DATABASE传统 DBA 习惯sqlplus里ALTER PLUGGABLE DATABASE ... OPEN但在 EL8.5 上你可以把 PDB 当作systemd服务来管理。原理是创建一个orclpdb.service文件调用sqlplus执行 DDL# 创建 PDB 服务文件 sudo tee /usr/lib/systemd/system/orclpdb.service EOF [Unit] DescriptionOracle PDB orclpdb Afteroracle-database.service Wantsoracle-database.service [Service] Typeoneshot Useroracle EnvironmentORACLE_HOME/u01/app/oracle/product/21c/dbhome_1 EnvironmentORACLE_SIDorcl ExecStart/u01/app/oracle/product/21c/dbhome_1/bin/sqlplus -S / as sysdba EOF2 ALTER PLUGGABLE DATABASE orclpdb OPEN; EXIT; EOF2 ExecStop/u01/app/oracle/product/21c/dbhome_1/bin/sqlplus -S / as sysdba EOF2 ALTER PLUGGABLE DATABASE orclpdb CLOSE IMMEDIATE; EXIT; EOF2 RemainAfterExityes [Install] WantedBymulti-user.target EOF # 启用并启动 sudo systemctl daemon-reload sudo systemctl enable orclpdb sudo systemctl start orclpdb # 验证 sudo systemctl status orclpdb sudo -u oracle sqlplus / as sysdba ?/rdbms/admin/pdb_status.sql为什么这么做因为systemctl start orclpdb会自动等待oracle-database.service启动完成避免了脚本里写sleep 30的玄学等待。这是我从一次生产环境 PDB 启动失败中总结出的后悔药——把数据库对象的生命周期真正交给操作系统来编排。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →