
简介面向需要在Linux 8.5上部署Oracle 21C数据库的运维与DBA人员这份PDF文档完整记录了单实例环境从零到可用的全过程。内容涵盖软件准备、部署规划、虚拟机创建、操作系统安装及系统参数优化等核心环节尤其对hosts配置、SELinux调整、防火墙禁用、用户目录规划、sysctl与limits参数设置、YUM源与依赖包安装等易错细节做了分步说明并附有详细的目录导航便于快速定位。资源为单份PDF文档体积仅4.53MB适合作为实操参考手册。当前已有260人学习下载属于轻量但信息密度较高的部署指南可帮助读者规避常见坑点提升安装成功率。1. Linux 8.5 与 Oracle 21C 单实例这组合到底值不值得装你手头有一台装了 Linux 8.5 的服务器内存 16G想跑一套 Oracle 21C 单实例既当测试库又想以后搬到生产。这个组合我装过不下十次结论是比 19C 更省事。21C 把不少前置检查做进了 Installer单实例又不用考虑集群节点只要把内核参数、用户目录和响应文件这三块弄对基本一路 Next 就能过。这篇文章就是给你一条可以直接照抄的路径从系统检查到建库再到常见报错和开机自启全部按 Linux 8.5 环境写。2. 装 Oracle 21C 前的系统准备内核、用户、目录一次到位在 Linux 8.5 上装 Oracle 21C真正决定成败的不是 runInstaller而是装之前的系统配置。很多新手喜欢直接把安装包拿过来就解压结果在图形界面里反复因为缺包、权限不对、内核参数不足而退回。我一般会先在命令行把下面三件事做完再做安装。2.1 确认操作系统版本与补丁别让兼容性毁掉半小时Oracle 21C 官方认证列表里Linux 8.5 属于可以直接安装的版本。但这里容易踩两个细节一是有些最小化安装的 Linux 8.5 没有安装图形库二是 glibc 版本偏旧。建议先用下面四条命令把家底摸清cat /etc/os-release uname -m free -g df -h /tmp /u01第一行看系统发行版和版本号第二行确认 CPU 架构是 x86_64第三行看物理内存和交换分区第四行确认/tmp和你要放的/u01目录剩余空间。Oracle 21C 安装要求/tmp至少 2G/u01放解压后的软件和数据库文件建议至少留 15G。如果发现/tmp太小用mount -o remount,size5G /tmp临时放大或者把TMPDIR指向一个大分区。这里有一个大多数人会忽略的参数交换分区。Oracle 官方建议 swap 大小在内存的 0.5 到 1 倍之间最低 2G。如果内存只有 4Gswap 还只有 1GDBCA 建库时很容易报 ORA-27102下面避坑章里我会专门讲。注意Linux 8.5 指 RHEL 8.5、Oracle Linux 8.5、Rocky Linux 8.5 这类同内核的发行版。后续命令在 Oracle Linux 8.5 上最稳因为 Oracle 官方测试环境基本是它。2.2 一键创建用户、主机组与目录结构可直接抄的脚本Oracle 安装需要两个 OS 组oinstall和dba还需要一个专用用户oracle。目录结构上21C 的默认习惯是 ORACLE_BASE 放在/u01/app/oracle数据库软件放在$ORACLE_BASE/product/21c/dbhome_1Inventory 目录独立放在/u01/app/oraInventory。下面这一段是我每次都会跑的初始化脚本groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle echo oracle | passwd --stdin oracle mkdir -p /u01/app/oracle/product/21c/dbhome_1 mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app脚本逻辑很简单先建组和用户-G dba让 oracle 用户同时属于两个组这样 SYSOPER/SYSDBA 权限不会缺。随后建两个目录最后把/u01/app的属主改成oracle:oinstall。chmod 775是给同组用户预留读写能力如果你不希望别的 OS 用户碰 Oracle 目录可以用750但安装时 Inventory 目录最好让 oinstall 组可写否则 root.sh 执行会失败。需要注意两点passwd --stdin在有些发行版被默认禁用如果不好使就手动passwd oracle交互输入。另外不要用-r创建系统用户因为系统用户的 uid 可能落在 999 以下部分安装脚本会因权限不足报错。2.3 内核参数和资源限制这组值为什么这么设Oracle 21C 对共享内存、信号量和文件句柄的要求与传统版本一致。我建议直接把这组参数写到/etc/sysctl.conf尾部然后sysctl -p生效cat /etc/sysctl.conf EOF kernel.semmsl 250 kernel.semmns 32000 kernel.semopm 100 kernel.semmni 128 kernel.shmall 4194304 kernel.shmmax 8589934592 fs.aio-max-nr 1048576 fs.file-max 6815744 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 4194304 EOF sysctl -p肉眼扫一眼shmmax是单个共享内存段的最大字节数我这里写 8G对应 16G 物理内存的一半shmall是共享内存页总数单位是页不是字节4194304 页乘以 4K 刚好是 16G。这两个参数合起来决定 Oracle SGA 能申请多大如果内存超过 16G请按比例重算。semmsl/semmns/semopm/semmni是信号量上限Oracle 每启动一个进程都要用信号量默认值在 8.5 里通常够用但直接抄这组最保险。fs.aio-max-nr控制异步 I/O 请求数Oracle 做数据文件读写会大量使用 AIO设太小会报 ORA-27023。ip_local_port_range放大到 9000-65500是避免监听和数据库内部连接把端口占满。除内核参数外还要配置用户资源限制。创建/etc/security/limits.d/20-oracle.confcat /etc/security/limits.d/20-oracle.conf EOF oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 3145728 oracle hard memlock 3145728 EOF这里面最容易忽略的是memlock单位为 KB3145728 也就是 3G。它允许 oracle 用户锁定 3G 内存用于 HugePages 和 Oracle 自动内存管理。如果你跑大 SGA建议把 memlock 调到 SGA 最小阈值甚至物理内存一半否则数据库启动时会收到ORA-27102: out of memory。最后别忘了检查 SELinux可以先临时setenforce 0让安装顺利跑完装完再按第 5 章的办法恢复 Enforcing。临时关闭只对本次运行有效重启后依然回到配置文件里的默认值。3. 用 runInstaller 装 Oracle 21C 数据库软件图形与静默两条路线系统准备做完就可以装数据库软件了。Oracle 21C 的安装程序叫runInstaller放在解压后的 ORACLE_HOME 目录里。这里只讲软件安装建库留给下一章因为把这两步分开出问题时更容易定位。3.1 解压安装包与检查校验和最容易被跳过的一步从 Oracle 官网下载的 21C Linux x86-64 安装包通常是一个 zip文件名类似LINUX.X64_213000_db_home.zip。第一步先做校验和避免下载损坏md5sum LINUX.X64_213000_db_home.zip然后把文件解压到之前建好的 ORACLE_HOME 目录。注意不是解压到任意目录而是直接解压到/u01/app/oracle/product/21c/dbhome_1这样 Oracle 会把该目录当作 ORACLE_HOMEsudo -u oracle mkdir -p /u01/app/oracle/product/21c/dbhome_1 sudo -u oracle unzip -q LINUX.X64_213000_db_home.zip -d /u01/app/oracle/product/21c/dbhome_1/unzip -q是安静模式几千个文件刷屏会很难受。解压完成后检查属主必须确保/u01/app下所有文件属主是oracle:oinstall否则 runInstaller 在写$ORACLE_HOME/lib时会卡住。建议再补一次chown -R oracle:oinstall /u01/app/oracle/product/21c/dbhome_1。接着让 oracle 用户的环境变量就位。编辑/home/oracle/.bash_profile加入export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/21c/dbhome_1 export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib export NLS_LANGAMERICAN_AMERICA.AL32UTF8ORACLE_BASE 和 ORACLE_HOME 是后续所有命令的地基LD_LIBRARY_PATH 指向 21C 自带的 lib 目录避免系统里没装某些兼容库时报libclntsh.so找不到NLS_LANG 则决定客户端用什么字符集连接这里统一 AL32UTF8。3.2 图形化安装的六个界面要点该勾选和该去掉的项如果你的服务器有图形桌面或配置了 X11 转发可以用图形化安装。我看到不少人在这一步翻车其实只要抓住六个界面就足够配置安全更新取消勾选“我希望通过 My Oracle Support 接收安全更新”。不取消很多时候会一直卡在联网检查。选择安装选项选“仅安装数据库软件Install database software only”不要选“创建并配置数据库”因为建库放到 DBCA 阶段更可控。数据库版本选“企业版”。如果预算或授权限制也可以选“标准版 2”但 21C 的许多新特性如原生 JSON、区块链表只有企业版才有。安装位置检查 ORACLE_BASE 和 ORACLE_HOME 是否为你设置的值。这里极容易把路径写错多一层dbhome_1少一层都会导致后续脚本找不到二进制。操作系统组OSDBA 选dbaOSOPER 选oinstall。如果你的环境里有人为错误导致组名不一致安装会在root.sh阶段失败。先决条件检查Installer 会扫描缺包、内存、内核参数。黄色 warning 可以忽略红色错误必须处理。看到红色时点击“Fix Check Again”让脚本自动修复一部分其余手工补。图形界面就够了吗千万不要跳过日志。安装过程中如果某个步骤卡住优先去看$ORACLE_BASE/oraInventory/logs/installActions*.log里面记录了每个动作的执行命令和返回值比看图猜原因快得多。3.3 静默安装响应文件参数逐行说明没有图形环境时静默安装是唯一选择。Oracle 提供了响应文件模板$ORACLE_HOME/install/response/db_install.rsp。先复制一份出来再逐段修改su - oracle cp $ORACLE_HOME/install/response/db_install.rsp /u01/db_install.rsp chmod 600 /u01/db_install.rsp响应文件关键参数按下边的写oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory 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_GROUPoinstall oracle.install.db.IS_RAC_ONE_NODEfalse oracle.install.db.IS_SMALLFILEtrue SECURITY_UPDATES_VIA_MYORACLESUPPORTfalse DECLINE_SECURITY_UPDATEStrueINSTALL_DB_SWONLY表示只装软件不建库IS_RAC_ONE_NODE对单实例来说保持 falseIS_SMALLFILE这里指用小文件表空间你可以选 false 用 bigfile但大多数业务模板都用 smallfile。最坑的一个参数是DECLINE_SECURITY_UPDATES不写 true 时静默安装会在预检查阶段直接退出报“未提供 My Oracle Support 凭据”。这属于 Oracle 的一个强制性交互没有图形界面就靠这个参数绕过。启动静默安装su - oracle -c $ORACLE_HOME/runInstaller -silent -responseFile /u01/db_install.rsp -ignoreSysPrereqs-ignoreSysPrereqs的意思是跳过系统先决条件检查只在你确定所有红字都已经手工处理才加。加上它以后安装包不再校验缺包如果后面 oracle 进程启动时报缺库退回 2.2 节补包。安装结束时屏幕上会提示需要以 root 执行两个脚本/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/21c/dbhome_1/root.sh执行这两个脚本会生成orasbtab、设置权限并注册 inventory。唯一要留意的是root.sh会问你本地监听端口和 OSDBA 组名如果之前响应文件没有指定这里直接回车默认即可。脚本完成后数据库软件安装到这里就结束了。4. 用 DBCA 创建单实例数据库从建库到监听验证软件装好实例还没创建。Oracle 21C 推荐用 DBCA 建库因为它会自动把 CDB/PDB 的目录结构、数据字典、默认表空间都建好。我一般也用静默方式方便留日志复现。4.1 DBCA 静默建库命令与参数选择先确认 ORACLE_HOME 环境变量已经生效然后运行su - oracle -c $ORACLE_HOME/bin/dbca -silent -createDatabase \ -gdbname ORCL21 \ -sid ORCL21 \ -characterSet AL32UTF8 \ -createAsContainerDatabase true \ -numberOfPDBs 1 \ -pdbName orclpdb1 \ -templateName General_Purpose.dbc \ -memoryPercentage 40 \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -emConfiguration LOCAL \ -redoLogFileSize 512 \ -useOMF true-gdbname是全局数据库名-sid是系统标识符通常保持一致后面监听和/etc/oratab都靠它识别。-characterSet AL32UTF8建议不要改21C 对多字节字符集支持得更完善但如果你要从一个 GBK 库迁移数据需要根据源库选择。-createAsContainerDatabase true是 21C 的默认行为它会创建一个 CDB 和一个 PDB后面的-numberOfPDBs 1 -pdbName orclpdb1就是指定第一个 PDB 的名字。-memoryPercentage 40表示把物理内存的 40% 分给 SGAPGA。如果你的环境内存 16G那就是约 6.4G。这个参数不要给太高要给 Linux 文件缓存留余地生产环境我通常给 30%-40%测试环境可以给 50%。如果你明确知道要多少内存可以用-totalMemory 8192替代两者不要同时写。-datafileDestination决定数据文件放哪儿-recoveryAreaDestination决定闪回恢复区建议分开放在不同磁盘方便备份。-redoLogFileSize 512是指每个联机重做日志 512M对一般 OLTP 够用。-useOMF true使用 Oracle 管理文件建表空间不用手写文件名路径省很多事。DBCA 建库会在日志里持续输出进度耗时取决于磁盘速度和内存。等它退出并返回Completed后数据库已经处于 open 状态。如果中途失败日志在$ORACLE_BASE/cfgtoollogs/dbca/ORCL21.log后面避坑章会提到最常见的卡顿原因。4.2 监听与 tnsnames.ora 配置验证连通性DBCA 在 Linux 上通常会调用 netca 自动配置一个名为LISTENER的监听但有些环境下不会自动启动。手动检查一下lsnrctl status lsnrctl start第一条命令如果显示TNS: no listener就直接执行第二条。监听默认端口是 1521协议 TCP。若你要改端口先编辑$ORACLE_HOME/network/admin/listener.ora再启动。启动后还需要一份tnsnames.ora它用于客户端和 sqlplus 解析服务名。该文件默认在$ORACLE_HOME/network/admin/内容如下ORCL21 (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST dbhost)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME ORCL21) ) )把dbhost换成你服务器的主机名或 IP。注意SERVICE_NAME和ORCL21是全局库名不是你监听器名字。Dedicated server 是每个连接一个进程的模式适合连接数少的场景如果并发大可以改成SHARED但 21C 单实例对共享服务器模式支持有限我基本不用。验证解析tnsping ORCL21返回Used TNSNAMES adapter to resolve alias就代表成功。如果解析成功但 ping 超时大概率是防火墙没放行 1521参考下一章。4.3 登录数据库并确认版本、组件与 PDB 状态建库完成后用操作系统验证登录最直接sqlplus / as sysdba这个命令走本地认证不需要口令但前提是当前 OS 用户属于dba组。登录后第一件事确认版本和 PDB 状态select BANNER_FULL from v$version; show pdbs;show pdbs会列出 CDB 下的所有 PDB。21C 默认有一个ORCLPDB1状态应该是 READY。如果 PDB 处于 MOUNTED手动打开alter pluggable database ORCLPDB1 open;连接业务用户时要切到 PDB而不是留在 CDB。你可以重建连接sqlplus systemlocalhost:1521/orclpdb1输入密码后执行select sys_context(USERENV,CON_NAME) from dual;返回ORCLPDB1就对了。很多新手在 CDB 里建了用户然后抱怨应用连不上原因就是用户建在了根容器而应用连接的是 PDB。在 21C 里业务用户和表一定要建在 PDB 里CDB 只放 Oracle 管理对象。5. 避坑指南Linux 8.5 上装 Oracle 21C 的 5 个典型报错下面这几类报错可以说是我每次给客户远程装 21C 时的高频翻车点。每一条都按“现象 → 原因 → 解决”写直接查你当前日志里对应的关键字即可。5.1 报错 ORA-12541 / 监听起不来SELinux 与防火墙现象lsnrctl status在服务器本机显示监听正常但远程机器用 PL/SQL Developer 连接时报ORA-12541: TNS: no listener或者监听启动日志里出现Permission denied。原因Linux 8.5 默认开启 firewalld 和 SELinux。即使监听端口听在 1521SELinux 没有放行 oracle 端口外部连接请求会被内核拒绝firewalld 如果不放行 1521/tcp远程包根本进不来。解决先放行防火墙再调整 SELinuxfirewall-cmd --permanent --add-port1521/tcp firewall-cmd --reloadSELinux 方面如果只是快速验证临时关闭setenforce 0。如果成功能排除再永久放行端口dnf install -y policycoreutils-python-utils semanage port -a -t oracle_port_t -p tcp 1521semanage将 1521 注册为 oracle_port_t 类型SELinux 就允许 oracle 进程监听它了。注意如果你把 Oracle 端口改成 1522需要把命令里的 1521 改成 1522否则同样连不上。5.2 找不到 libnsl.so.1RHEL 8 的兼容库坑现象runInstaller 预检查阶段报libnsl.so.1 is missing或者软件装完执行sqlplus提示error while loading shared libraries: libnsl.so.1 cannot open shared object file。原因Oracle 21C 的二进制依赖libnsl.so.1而 RHEL 8.5 默认只提供libnsl.so.2。RHEL 8 把这个老库单独拆成了兼容包默认镜像里没有安装。解决dnf install -y libnsl装完再检查ls -l /usr/lib64/libnsl.so.1。如果还缺其他库把第 2.1 节那一整组dnf install命令重跑一遍。这类问题最容易出现在最小化安装的 Linux 8.5 上桌面版一般预装较全。5.3 root.sh 执行失败INVENTORY 目录归属现象静默安装末尾提示执行 root.sh用 root 执行时输出Failed to create oracle inventory或者oraInventory目录无法写入。原因oraInventory目录要么没被创建要么属主不是 root/oinstall要么你在响应文件里指定的INVENTORY_LOCATION和实际不一致。root.sh 会写oraInst.loc和若干权限文件如果指向的路径不可写必然失败。解决在跑 root.sh 前先确认目录mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01/app/oraInventory chmod 775 /u01/app/oraInventory如果已经失败过root.sh 会生成/etc/oraInst.loc里面记录了 inventory 路径去确认它与你的目录一致。不一致时手工改掉或重新安装。还有一个小坑不要把 Inventory 目录放在 ORACLE_HOME 里面否则升级和卸载时会互相覆盖。5.4 DBCA 建库卡在 3%/dev/shm 太小现象DBCA 执行到Creating and starting Oracle instance界面一直停在 3% 左右不动日志里出现ORA-27102: out of memory或skgpspawn failed。原因Oracle 21C 的共享内存段会映射到/dev/shm这个目录在 Linux 里是 tmpfs默认只有物理内存的一半。如果虚拟机只分了 2G 内存/dev/shm可能只有 1G而 DBCA 分配 SGA 时瞬间把它打满进程无法启动。解决先看大小df -h /dev/shm如果小于 2G临时扩大到 4Gmount -o remount,size4G /dev/shm要永久生效在/etc/fstab中对应 tmpfs 行改成tmpfs /dev/shm tmpfs size4G 0 0如果是容器环境比如 Docker 或 Kubernetes需要把--shm-size调大否则宿主上的 mount 不生效。这条坑在云主机上尤其常见云厂商给的/dev/shm默认值经常比 SGA 还小。5.5 静默装完连不上环境变量和响应文件权限现象静默安装全程无报错但执行sqlplus / as sysdba出现sqlplus: command not found或者提示ORA-12162: TNS:could not resolve the connect identifier。原因环境变量没有在启动 shell 时加载PATH里没有$ORACLE_HOME/bin或者 ORACLE_SID 没有设置。另一个隐蔽问题是响应文件权限不对响应文件如果被普通用户可写runInstaller 会忽略里面部分参数导致 ORACLE_HOME 装到了奇怪的位置。解决先检查当前用户和环境whoami echo $ORACLE_HOME echo $ORACLE_SID如果是 root 却用su - oracle没有带-环境变量不会切换一定要用su - oracle。然后确认.bash_profile已经 sourcesource ~/.bash_profile export ORACLE_SIDORCL21响应文件在上传和修改时容易被ftp或者 Windows 编辑器改成不可读所以运行 runInstaller 前执行chmod 600 /u01/db_install.rsp。顺带说一句ORACLE_SID不设sqlplus 即使能启动也不知道连哪个实例中文报错经常把新手带偏。6. 安装完成后的第一件事开机自启脚本与最小备份策略数据库能连上、PDB 能打开这才是安装的起点。我见过太多同事在测试环境装完就宣布“上线”结果服务器一重启数据库起不来前端报错一堆。所以装完最好把开机自启这一步立刻做掉。常见做法是配 systemd 服务比 Oracle 自带的 dbstart 更好管理。先确认/etc/oratab里有一行ORCL21:/u01/app/oracle/product/21c/dbhome_1:Y如果没有把末尾的N改成Y。然后创建/etc/systemd/system/oracle-21c.service[Unit] DescriptionOracle 21c Database ORCL21 Afternetwork.target [Service] Useroracle Groupoinstall Typeforking RemainAfterExityes ExecStart/u01/app/oracle/product/21c/dbhome_1/bin/dbstart /u01/app/oracle/product/21c/dbhome_1 ExecStop/u01/app/oracle/product/21c/dbhome_1/bin/dbshut /u01/app/oracle/product/21c/dbhome_1 [Install] WantedBymulti-user.target启用并测试systemctl daemon-reload systemctl enable oracle-21c systemctl start oracle-21c systemctl status oracle-21cTypeforking是因为 dbstart 会后台拉起进程RemainAfterExityes保证服务停止时状态正确。这个方案的好处是开机顺序明确日志通过journalctl -u oracle-21c查看比传统/etc/rc.d脚本直观。该说备份了。21C 默认是NOARCHIVELOG模式这意味着你只能做冷备数据库挂了会丢最近一次备份后的所有数据。因此在交给业务之前至少要打开归档并做一次全备sqlplus / as sysdbaALTER DATABASE ARCHIVELOG;然后退出执行 RMANrman target /backup database plus archivelog delete input;这条命令会把数据文件和所有归档日志备份到快速恢复区并自动清除已备份的归档。第一次备份可能耗时较长但它是你之后所有恢复操作的后悔药。我自己的教训是第一次装 21C 时觉得备份可以后置结果三天后误删了一个表归档日志也没开最后只能靠 expdp 导出凑合整个过程十分痛苦。后来我养成习惯装完先开归档再全备从不例外。希望帮到你。本文还有配套的精品资源点击获取