Oracle 21C单实例在Linux 8.5上的安装部署与避坑指南

发布时间:2026/10/11 14:20:11
Oracle 21C单实例在Linux 8.5上的安装部署与避坑指南 简介面向数据库管理员与运维工程师针对Linux 8.5环境下安装部署Oracle 21C单实例的详细指南。文档基于VMware Workstation Pro 16.1虚拟化环境覆盖软件准备、硬件与网络规划、虚拟机创建、操作系统安装、关键系统配置、数据库软件安装、实例初始化、验证优化及备份安全等完整流程。特别是对hosts文件、SELinux策略、防火墙、oracle用户与/u01目录结构、sysctl.conf与limits.conf参数配置均有明确操作说明可帮助读者规避常见安装陷阱。压缩包内仅有1个PDF文档大小约4.53MB目录层级完整适合按步骤边看边做。当前已有260人学习下载是有意尝试Oracle 21C与Linux 8.5组合部署时的实用参考资料。1. 一份能照着跑完的 Oracle 21C 单实例安装文档Linux8.5 下的完整路径Oracle 21C 单实例在 Linux8.5 上的安装部署真正卡人的往往不是安装器本身而是它落地之前的那堆系统准备SELinux 状态、共享内存参数、依赖包缺失、目录权限归属。这份文档我拆过一遍作者在 VMware Workstation 16.1 里把整个流程完整跑了五次以上从创建虚拟机一路写到远端连通性测试正好把最容易劝退新手的环节都用实际操作验证过。适合第一次在 Linux 上装 Oracle 的初学者也适合装过 19C、18C 但没碰过 21C 的运维——拿它当检查清单能少翻很多次官方手册。2. 装库先改系统hosts、SELinux、内核参数与资源限制2.1 hosts 文件先让主机名解析固定下来装数据库之前第一件事是让本机的主机名解析不再依赖 DNS。Oracle 安装器的前置检查里有一项是本地主机名解析如果/etc/hosts里没有本机 IP 和主机名的对应关系runInstaller 会在检查页面直接标红不用等装到一半再回头。文档里的部署规划是主机名oracle21c、域名oracle21c.com、IP192.168.31.101这一段配置要和规划完全一致。# 按部署规划表替换 IP、FQDN 和短主机名三列顺序不要写反 echo 192.168.31.101 oracle21c.com oracle21c /etc/hosts这里第一列是 IP第二列是完整域名FQDN第三列是短主机名。Oracle 解析主机名时先查/etc/hosts再走 DNS两个源返回不一致就会报PRVF-0002之类的错误。注意不要把短主机名写到第二列否则后面监听注册时服务名解析会绕弯路。2.2 SELinux 与防火墙测试环境别在安全策略上反复横跳文档明确把 SELinux 禁用、防火墙禁用写进了规划表。原因是数据库进程要监听 1521 端口、要写/u01/app/oracle目录SELinux 默认策略在这种单实例测试场景里容易误伤排查成本比收益高得多。这里有个常见误区只改配置文件不执行setenforce 0当前内核还是 enforcing 状态等于白改。# 永久关闭 SELinux修改 config 文件重启后依然保持 sed -i s/^SELINUXenforcing.*/SELINUXdisabled/ /etc/selinux/config # 当前会话立即生效避免等重启 setenforce 0 # 确认状态输出 Disabled 才算真正关闭 getenforcegetenforce输出Disabled或Permissive都算通过如果还是Enforcing说明配置没刷进去检查一下config文件里是不是有多行SELINUX、注释行把生效行盖住了。SELinux 设成Permissive虽然不拦截但会持续写 AVC 审计日志后面排错时日志噪音很大建议直接disabled。防火墙的处理逻辑一样停掉服务和禁用开机自启要一起做systemctl stop firewalld systemctl disable firewalld systemctl status firewalldstop只关当前会话disable关掉开机自启两个都要执行否则虚拟机一重启防火墙又回来了。生产环境不该这么干但文档定位是学习环境先把安全策略从变量里拿掉后面连通性测试才不受干扰。2.3 内核参数一页纸sysctl 就是 Oracle 的生存底线Oracle 对共享内存、信号量、文件句柄有硬性要求这些都在/etc/sysctl.conf里定义。文档用的虚拟机是 4C/8G下面这组参数就是按 8G 内存算的。kernel.shmmax设成物理内存的一半字节kernel.shmall设成物理内存按 4K 分页后的页数这两个是 SGA 能不能分配出来的关键。参数建议值8G 内存作用kernel.shmmax4294967296单个共享内存段上限SGA 不能超过它kernel.shmall2097152系统可用的共享内存页总数kernel.sem250 32000 100 128信号量参数Oracle 进程间通信靠它fs.file-max6815744全局最大文件句柄数fs.aio-max-nr1048576异步 I/O 请求上限net.ipv4.ip_local_port_range9000 65500客户端连接可用的端口范围net.core.rmem/wmem262144 ~ 4194304网络收发缓冲区大小cat /etc/sysctl.conf EOF fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.sem 250 32000 100 128 kernel.shmall 2097152 kernel.shmmax 4294967296 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 EOF # 让参数立即生效顺便检查有没有语法错误 sysctl -psysctl -p执行后如果没有任何报错参数就进当前内核了。这里提醒一句如果虚拟机内存不是 8Gshmmax和shmall别照抄shmmax用内存字节数除以 2shmall用总内存字节数除以 4096算不然 SGA 分不满足需求建库时容易触发 ORA-27102。2.4 limits.conf 与 login 文件进程数和文件数一起封顶内核参数解决的是共享内存问题进程级还有一层限制叫limits.conf。Oracle 进程数一多文件描述符数不够数据库连接就会断断续续表现像是网络问题实际上是被nofile卡住了。文档给 oracle 用户配的是nproc2047/16384、nofile1024/65536 这组经典值。cat /etc/security/limits.conf EOF oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 EOFsoft是普通会话默认值hard是上限stack是栈大小。这里容易忽略的是/etc/profile里的ulimit设置limits.conf只对登录会话生效但某些登录方式不会读它。文档里两步都写了只改limits.conf不改 profilesu - oracle之后ulimit -u输出的还是默认值。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这一段逻辑是区分 ksh 和 bash 的写法bash 用-u限制进程数、-n限制文件描述符数。改完以后用su - oracle重新登录执行ulimit -u和ulimit -n确认变成 16384 和 65536。四组配置全做完建议重启一次虚拟机再继续让 SELinux、内核参数都处于一个干净状态后面装数据库软件时才不会被半生效的配置绊住。3. 用户、依赖包与环境变量安装前的三个关键前置3.1 oracle 用户与 /u01 目录权限在前安装在后Oracle 不允许直接用 root 跑安装器能跑但后续维护会乱套必须建一个专用用户加两个组。文档的规划是用户oracle、密码xaosky2108组是oinstall和dba目录结构遵循 OFA 规范也就是/u01/app/oracle这种可预测的路径。OFA 的好处是后续补丁、换主机、备份恢复时路径不会变来变去。groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle echo xaosky2108 | passwd --stdin oracle mkdir -p /u01/app/oracle mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app-g oinstall是主组-G dba是附加组安装时 OUI 会检查 oracle 用户是否属于这两个组。oraInventory目录单独建它是 Oracle 的中央清单库记录装了哪些组件卸载和打补丁都靠它。chown -R oracle:oinstall这步漏掉的话安装器会在写 inventory 时报权限错误而且这种错误不会给明确提示只会在日志里留一行“Permission denied”。密码按文档规划写就行实际生产环境换成自己定的注意别和其他系统共用。3.2 依赖包缺一个都是安装器卡住的理由Oracle 21C 依赖的 RPM 包清单很长安装器的前置检查会逐一验证缺了就在检查页面列出来。麻烦在于它只告诉你缺什么不告诉你从哪补而且 Oracle Linux 8 的 AppStream 模块流有时会把兼容包裁掉。文档里第 6.8 节列了完整依赖清单下面这组是 21C 单实例在 Linux8.5 上最常见的必备包包名用途bc安装脚本调用的计算工具binutils二进制工具链compat-libcap1libcap 兼容层compat-libstdc-33旧版 C 运行时库gcc、gcc-c编译器和 C 编译器glibc、glibc-devel基础 C 库及开发头文件kshOracle 脚本依赖的 Korn Shelllibaio、libaio-devel异步 I/O 库及开发头文件libgcc、libstdc、libstdc-develC/C 运行时库libX11-develX11 开发库图形安装器需要sysstat系统性能监控工具unixODBC、unixODBC-develODBC 驱动支持# 8.x 系列默认包管理器是 dnfyum 命令在这里同样可用 dnf -y install bc binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc libstdc-devel libX11-devel sysstat unixODBC unixODBC-devel装完以后用rpm -q抽查几个关键包确认版本存在。如果dnf报Unable to find a match: compat-libstdc-33通常是源的问题——安装系统时没挂载本地 DVD 镜像源或者 AppStream 模块没有启用先去dnf repolist看源列表把本地源启用了再重试。依赖包是最不值得省时间的一步缺包装到一半再去补安装器重跑时依旧从头检查。3.3 环境变量与 umask写在哪个文件里决定了 su 过去能不能用环境变量这一段新手翻车率很高。文档给出的规划是ORACLE_BASE/u01/app/oracle、ORACLE_HOME/u01/app/oracle/21c/db_1、ORACLE_SIDorcl这四个变量必须落在 oracle 用户的环境里而不是 root 的。装完数据库后用su - oracle执行sqlplus如果报command not found问题基本都出在这。cat /home/oracle/.bash_profile EOF export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/21c/db_1 export ORACLE_SIDorcl export PATH$ORACLE_HOME/bin:$PATH umask 022 EOFORACLE_SID是大小写敏感的文档规划里是小写orcl建库时实例名也是orcl两处要保持一致。umask 022是 Oracle 安装器的硬性要求它保证创建出来的文件权限带读写组权限漏掉的话安装器会在预检查阶段报umask警告。写在/home/oracle/.bash_profile而不写/etc/profile是因为 root 不需要背着 ORACLE_HOME 跑命令全局变量越少越干净。改完先source ~/.bash_profile再echo $ORACLE_HOME确认路径拼写正确这一步排查成本几乎为零。4. runInstaller 与 dbca装软件和建库两步的分工与参数4.1 runInstaller先装软件别急着建库Oracle 数据库安装分成两步第一步用runInstaller装数据库软件第二步用dbca建实例。很多新手图省事在安装器里直接勾“创建并配置数据库”一旦建库失败软件和实例绑在一起排查范围就被放大了。文档走的是分离路线先只装软件验证过了再建库这是单实例环境里最稳的节奏。# 把下载好的安装介质解压到规划的 ORACLE_HOME 目录包名按实际下载文件来 mkdir -p /u01/app/oracle/21c/db_1 chown -R oracle:oinstall /u01/app/oracle/21c/db_1 su - oracle -c cd /u01/app/oracle/21c/db_1 ./runInstaller安装介质解压目录就是后续的 ORACLE_HOME这点和 19C 的套路一致。runInstaller启动图形界面后第一屏选择“仅安装数据库软件”Install database software onlyOracle Base 填/u01/app/oracleOracle Home 位置保持/u01/app/oracle/21c/db_1数据库版本类型选企业版OSDBA 组选dba。走到最后OUI 会提示有两个 root 脚本需要执行此时界面会停在等待状态。4.2 两个 root 脚本orainstRoot.sh 与 root.sh 的顺序不能乱OUI 安装过程中会在/u01/app/oraInventory下生成orainstRoot.sh在 ORACLE_HOME 下生成root.sh。这两个脚本必须用 root 执行顺序也固定先orainstRoot.sh后root.sh。前者把 inventory 目录的属主改成 root后者把 $ORACLE_HOME/bin 下的几个二进制程序设置 root 属主Oracle 实例启动时才能获得必要的权限。# 切到 root 执行两个脚本都会输出 Completed 字样 /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/21c/db_1/root.shroot.sh执行到一半会问/usr/local/bin目录默认直接回车。脚本执行完回到安装界面点“确定”数据库软件安装阶段就结束了。顺序反过来的话root.sh会在设置属主时听到“insufficient permission”的抱怨虽然多数时候能硬着头皮装完但没必要给自己留这个隐患。4.3 dbca 建库SGA、字符集与归档三处最值得盯软件装完下一步用dbca创建数据库。文档规划里实例名orcl、监听端口 1521、字符集AL32UTF8、EM 端口 5500这四项在建库界面里逐一对应。字符集是最容易忽略的一项界面默认值是WE8MSWIN1252这是西文字符集中文数据存进去迟早乱码必须手动改成AL32UTF8。# 静默方式建库普通参数按文档规划密码替换成自己的强密码 dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl -sid orcl \ -sysPassword 替换为强密码 \ -systemPassword 替换为强密码 \ -memoryPercentage 40 \ -characterSet AL32UTF8 \ -emConfiguration LOCAL-memoryPercentage 40是给数据库分配可用内存的百分比8G 的虚拟机分 40% 给 Oracle留足系统余量避免 OOM。12c 以上版本对密码复杂度有硬性要求至少一个大写字母、一个小写字母加一个数字密码太简单 dbca 会直接拒绝。-emConfiguration LOCAL对应文档里的 EM 地址https://192.168.31.101:5500/em。建库过程在虚拟机上大概要二十分钟到四十分钟日志写在$ORACLE_BASE/cfgtoollogs/dbca/trace.log进度卡住或者报错第一站就去看这个文件别盲目重启。5. 避坑清单五次实操里最常见的五个翻车点5.1 前置检查报缺包不是版本问题是源没挂全现象runInstaller 前置检查页面列出compat-libstdc-33等包缺失dnf install时也报Unable to find a match。原因Oracle Linux 8 的 AppStream 模块默认没启用这部分兼容包或者安装系统时没挂载本地 DVD 源导致仓库里根本搜不到这些包。解决先dnf repolist确认当前源列表有本地 DVD 镜像就挂载并启用对应仓库没有本地源就检查网络源能否访问。补完所有包后重新运行runInstaller它会重新执行前置检查缺包列表会变短直到消失。5.2 内存检查不过8G 机器 swap 给太少判断会出偏差现象前置检查提示This test checks whether the system has at least 8 GB of RAM失败但free -h明明显示物理内存 8G。原因Oracle 的检查逻辑会把 swap 计入可用内存池VMware 默认给 8G 虚拟机的 swap 分区往往只有 1G 甚至没有判定结果就是不合格。解决加一块 swap 再重跑检查。# 使用 swapfile 补足 swap适合虚拟机扩容场景 fallocate -l 4G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo /swapfile swap swap defaults 0 0 /etc/fstabfallocate创建文件后必须chmod 600否则swapon会警告不安全权限。补完 swap 后用free -h确认生效再重跑安装器。如果物理内存确实吃紧也可以加-ignorePrereq参数跳过但那是给自己埋雷SGA 分不出来的时候报错更痛苦。5.3 SELinux 改了没重启建库报 ORA-27102 是它在背后捣乱现象数据库软件装完dbca 创建实例时报ORA-27102: out of memory但free -h显示内存充足。原因/etc/selinux/config改成SELINUXdisabled后没重启当前内核依然 enforcingOracle 分配共享内存段的动作被 SELinux 拦截报错却伪装成内存不足。解决先getenforce看输出只要不是Disabled立即setenforce 0然后重启虚拟机再继续建库。这一步的教训是SELinux 配置改完必须重启别省这一步直接往下装后面出问题会怀疑到内存参数上排查方向直接偏掉。5.4 sqlplus 找不着变量写错了文件现象su - oracle后执行sqlplus报bash: sqlplus: command not found但 root 用户下sqlplus能正常执行。原因ORACLE_HOME 和 PATH 写进了 root 的.bash_profileoracle 用户根本没继承到或者写进了/etc/profile.d/但 oracle 用户登录时环境没有正确加载。解决把环境变量按第 3.3 节的方式写进/home/oracle/.bash_profile然后重新登录验证。su - oracle source ~/.bash_profile echo $ORACLE_HOME which sqlplusecho $ORACLE_HOME输出/u01/app/oracle/21c/db_1、which sqlplus能找到 bin 目录下的可执行文件这两个验证过了再往下走。变量写错位置这件事在安装阶段不爆发往往到第一次重启后才发作那时候再排查会多绕一圈。5.5 监听正常但连不上库实例没注册到监听现象lsnrctl status显示监听正在 LISTEN1521 端口通但远端sqlplus连接报ORA-12514: service not known。原因数据库实例建好后没有注册到监听器上常见原因是手动改过listener.ora后没reload监听或者local_listener参数没指向正确端口。解决先lsnrctl services看有没有orcl服务没有就登录数据库手工注册。SQL show parameter local_listener; SQL alter system set local_listener(ADDRESS(PROTOCOLTCP)(HOST192.168.31.101)(PORT1521)) scopeboth; SQL alter system register;alter system register是让实例立即向监听发起注册不用傻等动态注册的默认周期。执行完再lsnrctl services能看到orcl的服务名和实例名远端连接就通了。这类问题在文档第 9 章连通性测试里反复出现是单实例环境里最常见的“装完了连不上”原因。6. 交付前的验证从 lsnrctl 到远端连接的四步检查6.1 本地三连监听、解析、登录数据库交付给别人之前我习惯在服务器上先做三个本地验证lsnrctl status确认监听活着tnsping orcl确认服务名能解析sqlplus / as sysdba确认数据库本体能登进去。这三个连招能在十秒内定位八成问题。lsnrctl status tnsping orcl sqlplus / as sysdbalsnrctl status看输出里Service orcl has 1 instance(s)说明实例注册正常tnsping通过只代表监听能应答不代表数据库能登录所以第三步sqlplus才是见真章。本地验证通过后顺手查一下数据库名SQL select name, open_mode from v$database;输出ORCL和READ WRITE说明数据库已经打开可以进入远端验证环节了。6.2 远端验证MobaXterm 与 Easy Connect 连接串文档连接工具用的是 MobaXterm换成任意终端都行。远端验证最简单的方式是 Easy Connect 字符串不用建 tnsnames.ora格式是IP:端口/服务名sqlplus system/密码192.168.31.101:1521/orcl这里orcl是服务名不是 SID写 SID 会报ORA-12505。如果公司网络环境要求固定配置再考虑在客户端写 tnsnames.ora学习环境里用 Easy Connect 就够了。这一步能验证监听、注册、防火墙、账号密码四个环节是交付前最值得跑的测试。6.3 交付前的最后检查服务注册与 alert 日志远端登录通了还要看两个细节才算交付。一个是lsnrctl services确认服务处理器是DEDICATED专用模式另一个是看 alert 日志末尾有没有隐藏的 ORA- 错误。日志路径按文档规划是$ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.logtail -50 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.logalert 日志里没有新的 ORA- 报错实例启动和关闭记录正常这次部署才算真正过关。我从那以后每次装完 Oracle交付前都强制走一遍本地三连加远端登录加服务注册检查缺一项都不算完。这套验证流程在 19C 和 21C 上都适用区别只在安装器界面叫法略有变化验证逻辑从来没变过。希望帮到你。本文还有配套的精品资源点击获取