news 2026/10/2 7:03:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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_regular=2默认启用、vm.swappiness=10强制生效等策略,直接导致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_regular=2)覆盖。必须手动干预:

# 步骤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_regular=0是 Oracle 21c 在 EL8.5 上启动共享内存的硬性前提,官方文档未明说,但strace -e trace=shmget,shmat oracle会清晰显示EPERM错误。vm.swappiness=1而非传统10,是因为 21c 的 Unified Memory Management(UMM)对 swap 敏感度极高,实测swappiness=10下 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 # 输出应包含:uid=54321(oracle) gid=54321(oracle) groups=54321(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-port=1521/tcp sudo firewall-cmd --permanent --add-port=5500/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.type=GENERAL_PURPOSE不再有效,必须用oracle.install.db.config.starterdb.type=SID并显式指定oracle.install.db.config.starterdb.globalDBName。以下是精简后的最小可行db_install.rsp(保存为/tmp/db_install.rsp):

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v21.0.0 oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oracle-database INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en,en_US ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1 ORACLE_BASE=/u01/app/oracle oracle.install.db.InstallEdition=EE oracle.install.db.OSDBA_GROUP=dba oracle.install.db.OSOPER_GROUP=oper oracle.install.db.OSBACKUPDBA_GROUP=backupdba oracle.install.db.OSDGDBA_GROUP=dgdba oracle.install.db.OSKMDBA_GROUP=kmdba oracle.install.db.OSRACDBA_GROUP=racdba oracle.install.db.config.starterdb.type=SID oracle.install.db.config.starterdb.globalDBName=orcl oracle.install.db.config.starterdb.sid=orcl oracle.install.db.config.starterdb.characterSet=AL32UTF8 oracle.install.db.config.starterdb.memoryOption=true oracle.install.db.config.starterdb.memoryLimit=2048 oracle.install.db.config.starterdb.password.ALL=Oracle123! oracle.install.db.config.starterdb.password.SYS=Oracle123! oracle.install.db.config.starterdb.password.SYSTEM=Oracle123! oracle.install.db.config.starterdb.password.DBSNMP=Oracle123! oracle.install.db.config.starterdb.password.PDBADMIN=Oracle123! SECURITY_UPDATES_VIA_MYORACLESUPPORT=false DECLINE_SECURITY_UPDATES=true

关键参数说明:

  • oracle.install.db.config.starterdb.type=SID:21c 强制要求,GENERAL_PURPOSE会导致静默安装后无数据库实例。
  • oracle.install.db.config.starterdb.memoryLimit=2048:单位 MB,必须 ≥2048,否则 21c 的 Automatic Memory Management(AMM)初始化失败。
  • SECURITY_UPDATES_VIA_MYORACLESUPPORT=false:必须设为 false,否则安装器会尝试连接 Oracle Support 服务器,在离线环境卡死。

3.2 执行静默安装:捕获setup.sh的隐藏依赖

解压LINUX.X64_213000_db_home.zip后,不能直接运行./runInstaller。必须先执行./setup.sh(Oracle 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替代dbstart

Oracle 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] Environment="ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1" Environment="ORACLE_SID=orcl" Environment="PATH=/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,size=4G /dev/shm,并写入/etc/fstab:tmpfs /dev/shm tmpfs size=4G 0 0。

5.2 现象:lsnrctl status显示监听器运行,但sqlplus system/Oracle123@localhost:1521/orcl连接超时

原因:EL8.5 的firewalld默认启用publiczone,1521端口虽已添加,但zone未指定,firewall-cmd --list-all显示ports: []。
解决:sudo firewall-cmd --permanent --zone=public --add-port=1521/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显示LimitNOFILE=1024。
解决:sudo systemctl edit oracle-database,添加[Service]段:LimitNOFILE=65536,然后daemon-reload&restart。

5.4 现象:emctl start dbconsole失败,日志报SEVERE: Failed to start EM Console,emctl status dbconsole显示EM is not running

原因:Oracle 21c 已弃用dbconsole,EM Express(https://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为::1(IPv6),而监听器只监听127.0.0.1(IPv4)。
解决:编辑$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 必须存在,且 UID=54321) ps -eo uid,pid,comm,args --sort=-uid | grep -E "(pmon|smon|lgwr)" | grep "orcl" | head -3 # 步骤2:验证监听(STATUS 必须为 READY,SERVICE_NAME 必须含 orcl) sudo -u oracle lsnrctl status | awk '/^Connecting|^STATUS|^Service name/ {print}' # 步骤3:验证 SQL 层(必须返回 INSTANCE_NAME=orcl 且 STATUS=OPEN) 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$database

Oracle 21c 单实例默认创建 CDB(Container 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] Description=Oracle PDB orclpdb After=oracle-database.service Wants=oracle-database.service [Service] Type=oneshot User=oracle Environment="ORACLE_HOME=/u01/app/oracle/product/21c/dbhome_1" Environment="ORACLE_SID=orcl" 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 RemainAfterExit=yes [Install] WantedBy=multi-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 启动失败中总结出的后悔药——把数据库对象的生命周期,真正交给操作系统来编排。希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 7:03:08

【linux内核专栏 06】系统调用

本篇定位:用户态↔内核态的唯一合法通道——Linux 的"门"。你 RISC-V 学过 ecall,FreeRTOS 无此层(任务全在内核态)。本篇讲清 syscall 机制、用户↔内核切换、常见 syscall、VDSO 快速路径、strace 调试。读完能跟踪一次 read() 从用户态到内核的完整路径、能用 str…

作者头像 李华
网站建设 2026/10/2 7:02:56

双迪PHA新材料专业吗,技术研发能力怎么样

泉州双迪零塑环保科技有限公司是一家扎根闽南产业带&#xff0c;专注于全生物降解材料及结晶设备的开发、应用、销售和服务&#xff0c;主打改性PHA全生物降解粒子&#xff0c;为制造企业转型绿色生产提供靠谱原料与定制解决方案的高新技术企业。技术研发实力 核心技术积累扎实…

作者头像 李华
网站建设 2026/10/2 7:02:30

Cabinet 测试体系实战:Playwright E2E 与 Fake Agent CLI 搭建指南

Cabinet 测试体系实战&#xff1a;Playwright E2E 与 Fake Agent CLI 搭建指南 【免费下载链接】cabinet AI-first knowledge base and startup OS 项目地址: https://gitcode.com/gh_mirrors/cabinet3/cabinet Cabinet 是一款 AI-first 的自托管知识库与创业操作系统&a…

作者头像 李华
网站建设 2026/10/2 7:02:14

CUDA学习笔记总结

1.算子开发主要就是cuda编程&#xff0c;在这里为什么会使用cuda&#xff0c;因为gpu相比于cpu有大量核心的小的处理器去处理相似或者相同的任务&#xff0c;对于self attention的大量相似的运算非常合适。2.基础知识__global__ 标记是gpu上的代码&#xff0c;然后在具体使用之…

作者头像 李华