资讯详情

Linux 8.5安装Oracle 21C单实例:完整部署与避坑指南

📅 2026/10/11 14:52:07 | 华诺云谱 👁 阅读
Linux 8.5安装Oracle 21C单实例:完整部署与避坑指南
简介基于Linux 8.5环境部署Oracle 21C单实例的完整实操手册面向DBA、运维工程师及数据库学习者系统解决新版数据库与最新Linux发行版结合时的环境兼容与配置难题。文档从软件准备、部署规划、VMware Workstation Pro 16.1虚拟机创建到操作系统安装再到hosts、SELinux、防火墙、oracle用户/目录、sysctl.conf、limits.conf等系统配置完整覆盖数据库软件安装、DBCA建库、实例初始化、验证优化、RMAN备份恢复与安全加固等全部环节。尤为细致的是DBCA建库时的模板选择、内存与表空间规划、角色权限配置以及安装后通过oifcfg、crsctl、srvctl等工具做健康检查与参数调优的思路。压缩包内为1个PDF文件大小4.53MB目录分级明确适合边看边操作也适合作为企业环境部署的参照基准。目前已有260人学习下载是快速掌握Oracle 21C在Linux8.5上单实例安装的实用参考资料。1. Linux 8.5 装 Oracle 21C 单实例安装部署没想象中顺手在 Linux 8.5 上装 Oracle 21C 单实例与其说是“下一步、下一步”的向导式操作不如说是一场依赖包与内核参数的排雷战。很多人拿 19C 的经验直接套 21C结果卡在 libnsl 缺失、/dev/shm太小、vm.max_map_count不达标这类新报错上。这篇要讲的 Oracle 21C 单实例安装部署是一套从环境准备、用户规划、静默安装软件到 DBCA 建库、最后验证和避坑的完整流程。它能解决一件事在一台干净的 Red Hat Enterprise Linux 8.5 或 Oracle Linux 8.5 机器上从零跑出一个能连、能建表、能拿来迁移演练的单实例数据库。适合三类人想评估 21C 新特性的 DBA、给应用做兼容性验证的测试工程师、准备把老库往 21C 迁移前先练手的人。提醒一句21C 是创新版本支持期比 19C 短真要为生产环境选型还是优先 19C但既然要碰 21C这篇的参数和命令可以直接抄。2. 环境准备让 Linux 8.5 达到 Oracle 21C 的安装门槛2.1 内存、swap 与磁盘空间先看是不是“低配劝退”Oracle 21C 官方要求物理内存最低 2GB但实际装过的人都知道2GB 跑起来非常勉强预检能过、建库也顺利一跑负载就卡。我一般建议 4GB 起步8GB 以上才敢在上面做实验。装之前先把家底摸清楚free -h df -h /u01 /tmp grep MemTotal /proc/meminfofree -h看内存和 swapdf -h确认/u01和/tmp的剩余空间。21C 的安装介质解压后接近 10GBORACLE_HOME装完也接近 8GB加上数据库文件/u01至少预留 20GB。/tmp也别忽略解压和 OUI 运行时的临时文件都往这里写少于 3GB 容易在中途报磁盘空间不足。swap 的配置有个常见参考物理内存 2GB 时 swap 给 3GB4GB 内存给 4GB8GB 给 6GB16GB 以上给 8GB 基本够用。不是越大越好尤其现在服务器内存普遍 32GB 往上swap 反而容易拖慢性能。检查当前 swap 用free -h的 Swap 行不够就通过mkswap加一个 swap 文件临时顶住。注意如果跑在虚拟机或云主机上还要看一眼/dev/shm大小。这个坑后面专门讲很多 21C 启动报错都跟它有关。2.2 依赖包与 yum 源libnsl 是 21C 特有的坎Linux 8.5 自带的 glibc 版本是 2.28满足 21C 的编译要求但系统默认不会装齐 Oracle 需要的所有库。最容易翻车的是libnsl——RHEL 8 默认仓库里叫libnsl和libnsl2旧的 libnsl.so.1 默认不安装而 21C 的二进制还依赖它。在 Red Hat 8.5 上先把常用依赖一把装齐yum install -y binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc libstdc-devel libnsl libnsl2 \ libnsl.i686 libnsl2.i686 libXext libXext.i686 libXtst libXtst.i686 \ make sysstat unixODBC unixODBC-devel这条命令里libnsl和libnsl2是 21C 特有的装的时候留意 yum 的输出确认没有“No match for argument”之类的提示。compat-libstdc-33在 RHEL 8 的默认源里可能没有缺了预检会报 warning但不一定会中断安装实在装不上先跳过去后面看预检日志再决定。如果用的是 Oracle Linux 8.5有更省事的做法直接安装预检包依赖会被一次性拉齐。yum install -y oracle-database-preinstall-21c这个包会把用户、组、内核参数、依赖包全部配好省掉后面一半的手动操作。但它只存在于 Oracle Linux 的 yum 源里RHEL 8 没有红帽系还得手动一步步来。装完依赖后用rpm -q binutils libnsl ...逐个核对也行但更靠谱的方式是直接跑一遍 OUI 的预检缺什么它会明确列出来。2.3 内核参数、SELinux 与防火墙三处系统级配置一次做对21C 对内核参数的调整比 19C 多一处vm.max_map_count。官方文档要求从 262144 提高到 1048576这跟新版本的内存映射特性有关不改的话建库时可能报ORA-27102: out of memory。建议把参数写进独立的 sysctl 文件便于回溯cat /etc/sysctl.d/99-oracle.conf EOF fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.sem 250 32000 100 128 kernel.shmall 1073741824 kernel.shmmax 4398046511104 kernel.shmmni 4096 net.core.rmem_default 262144 net.core.rmem_max 4194304 net.core.wmem_default 262144 net.core.wmem_max 1048576 net.ipv4.conf.all.rp_filter 2 net.ipv4.conf.default.rp_filter 2 net.ipv4.ip_local_port_range 9000 65500 net.ipv4.tcp_rmem 4096 262144 4194304 net.ipv4.tcp_wmem 4096 262144 4194304 vm.max_map_count 1048576 EOF sysctl --system这里kernel.shmmax官方给的是 4TB 级别的数值如果机器物理内存只有 8GB建议改成 8GB 一半左右避免极端情况下共享内存分配异常kernel.sem四个值分别对应信号量数组大小、系统最大信号量数、每个信号量组的上限和系统级最大组数保持250 32000 100 128即可。net.ipv4.ip_local_port_range设大是为了让 Oracle 的监听和内部连接有足够端口可用。SELinux 在 RHEL 8 默认是 enforcing不想研究安全策略的话直接设为 permissive 比重启后 disabled 更稳也能让安装少一层干扰sed -i s/^SELINUX.*/SELINUXpermissive/ /etc/selinux/config setenforce 0 getenforce防火墙方面单实例数据库至少要开放 1521监听和 5500EM Express 默认 HTTPS 端口。用 firewalld 的话firewall-cmd --permanent --add-port1521/tcp firewall-cmd --permanent --add-port5500/tcp firewall-cmd --reload提示如果环境里压根不需要防火墙直接systemctl stop firewalld systemctl disable firewalld能省不少排查时间但生产环境按公司安全要求来。3. 创建 oracle 用户、目录与环境变量搭建 21C 的安装底座3.1 用户与用户组oinstall/dba/oper 各管什么Oracle 安装程序不允许用 root 直接跑必须创建一个专用系统用户。组的划分不是拍脑袋定的每个组对应一类管理权限oinstall是 Oracle 软件的属主组所有安装文件都归它dba是数据库管理员组能执行sqlplus / as sysdba这类操作oper给日常操作员做受限管理backupdba、dgdba、kmdba分别对应备份恢复、Data Guard、密钥管理角色racdba在单实例里用不上但官方建组清单里有一起建了不亏。groupadd oinstall groupadd dba groupadd oper groupadd backupdba groupadd dgdba groupadd kmdba groupadd racdba useradd -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle passwd oracleuseradd -g oinstall把主组设为 oinstall附属组通过-G追加。这样 oracle 用户既拥有软件目录的完整权限又能通过 dba 组直接管理实例。创建后建议顺手做一次id oracle确认各组都挂上了避免后面 root.sh 执行时因为组缺失报错。这里有个容易踩的细节有些文档把 oracle 的主组直接设成 dba短期没问题但后面如果要装 Grid Infrastructure 做 RAC组规划会打架。单实例按上面这套来是最稳的。3.2 目录规划与权限把 /u01 约定讲透Oracle 目录结构有两个核心路径ORACLE_BASE和ORACLE_HOME。ORACLE_BASE是所有 Oracle 相关文件的根通常放在/u01/app/oracleORACLE_HOME是数据库软件的实际安装位置按版本和实例区分21C 单实例常见的布局是/u01/app/oracle/product/21c/dbhome_1。安装清单oraInventory则在/u01/app/oraInventory它记录了这台机器上装过哪些 Oracle 产品不属于某个独立 Home。mkdir -p /u01/app/oracle/product/21c/dbhome_1 mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01/app chmod -R 775 /u01/appchown -R oracle:oinstall /u01/app把整棵目录树交给 oracle 用户和 oinstall 组chmod 775确保组内成员可写。注意ORACLE_BASE路径里不能出现中文、空格最好也不要放在家目录下否则后续备份脚本、rman 任务处理路径时很麻烦。有些生产环境会把/u01挂载成独立磁盘分区或逻辑卷这是好习惯但挂载时记得加上rw,noatime选项避免 Oracle 运行期大量读写访问时间戳造成额外 I/O。3.3 oracle 用户环境变量让 sqlplus 不再 command not found环境变量写在 oracle 用户的~/.bash_profile里登录后自动生效。最容易被忽略的是ORACLE_SID它决定当前 shell 默认连哪个实例后面 DBCA 建库时 SID 也要保持一致否则sqlplus / as sysdba连到的是个不存在的实例大概率报ORA-01034。cat /home/oracle/.bash_profile EOF export ORACLE_BASE/u01/app/oracle export ORACLE_HOME\$ORACLE_BASE/product/21c/dbhome_1 export ORACLE_SIDorcl export PATH\$ORACLE_HOME/bin:\$PATH export LD_LIBRARY_PATH\$ORACLE_HOME/lib:/lib:/usr/lib export NLS_LANGAMERICAN_AMERICA.ZHS16GBK umask 022 EOFNLS_LANG的格式是“语言_地区.字符集”AMERICAN_AMERICA.ZHS16GBK表示客户端用英文显示系统消息、按中国习惯处理日期、字符集用 GBK。如果数据库打算用AL32UTF8这里要同步改成AMERICAN_AMERICA.AL32UTF8否则中文会乱码。LD_LIBRARY_PATH里先放$ORACLE_HOME/lib是为了让 Oracle 自带的动态库优先于系统库加载避免不同版本 glibc 之间的同名库冲突。umask 022保证创建的文件默认对组和其他用户可读对后续 DBA 用同一组账号巡检有好处。配置完之后source ~/.bash_profile让变量在当前会话生效然后执行echo $ORACLE_HOME确认路径没写错。这一步不做后面 runInstaller 会报找不到命令或者路径不对属于典型的低级翻车。4. runInstaller 安装 Oracle 21C 软件静默安装与响应文件4.1 解压安装包与准备响应文件从官网或内部镜像拿到的LINUX.X64_213000_db_home.zip先建一个干净的目录再解压。不要直接解压到/u01/app/oracle/product/21c/dbhome_1因为安装程序会把文件从解压目录复制到 ORACLE_HOME混淆在一起容易出问题。mkdir -p /u01/soft unzip LINUX.X64_213000_db_home.zip -d /u01/soft/解压完/u01/soft下会有runInstaller、install、response等目录。21C 的模版响应文件在install/response/db_install.rsp建议复制出来改名再改不要直接编辑原文件方便装坏了重来。软件只装、不建库的响应文件关键内容长这样oracle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v21.0.0 oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory ORACLE_BASE/u01/app/oracle ORACLE_HOME/u01/app/oracle/product/21c/dbhome_1 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.ConfigureForGridfalse oracle.install.db.rootconfig.configMethodROOT_SCRIPT SECURITY_UPDATES_VIA_MYORACLESUPPORTfalse DECLINE_SECURITY_UPDATEStrueINSTALL_DB_SWONLY表示只装软件不触发建库适合想先装好软件、再用 DBCA 单独建库的场景。UNIX_GROUP_NAME对应前面创建的 oinstall 组INVENTORY_LOCATION指向安装清单目录。如果缺了DECLINE_SECURITY_UPDATEStrue安装程序会联网请求 MetaLink 更新在内网环境会卡在检查阶段。注意响应文件里的ORACLE_HOME必须和实际要安装的路径完全一致不能带软链接否则预检会报路径无效。4.2 静默安装命令参数到底怎么填图形界面安装适合有桌面环境或 X 转发的机器但大多数服务器没有 GUI静默安装是主流。执行前先确认响应文件已改好然后用 oracle 用户执行su - oracle cd /u01/soft ./runInstaller -silent -responseFile /u01/soft/db_install.rsp跑起来以后不要立刻做别的事盯着终端输出。正常情况会逐行打印进度结束时显示“Execute Root Scripts”提示。如果预检失败日志会写到/tmp/oraInstall_时间戳/installActions.log先看日志里 Fail 的那一项再去补依赖不要盲目加-ignorePrereq跳过。跳过预检装完启动数据库时会以更诡异的方式爆发问题比如连不上监听、ORA-12547 这类。等待时间取决于机器性能一般 10 到 20 分钟。期间如果终端断开会话安装进程可能被 SIGHUP 杀掉所以生产环境用nohup ./runInstaller -silent -responseFile ... 更稳妥日志留在/u01/soft/oui.log里方便查。4.3 执行 root 脚本与确认软件安装结果安装结束后屏幕会给出两个脚本路径分别是/u01/app/oraInventory/orainstRoot.sh和$ORACLE_HOME/root.sh。orainstRoot.sh 负责把安装清单目录的所有权交给 oinstall 组root.sh 则要设置一些可执行文件的属主和 setuid 权限必须以 root 身份运行。su - root /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/21c/dbhome_1/root.shroot.sh 执行到一半会问是否把 oracle 用户加入 dba 组输入 y 回车即可还会让填本地 bin 目录路径通常回车用默认/usr/local/bin。脚本跑完看到 “The following configuration scripts have been executed” 就是成功。验证软件是否装好用 opatch 命令看 Home 上的补丁信息$ORACLE_HOME/OPatch/opatch lsinventory ls -l $ORACLE_HOME/bin/oracleopatch lsinventory会列出安装的产品和补丁 ID能看到 Oracle Database 21c 就是装上了bin/oracle这个二进制文件存在且权限正常说明核心程序没缺。走到这一步软件层已经就绪接下来才是建库。5. 安装避坑21C 单实例的五个高频问题与现场处置5.1 预检报错 libnsl.so.1 缺失21C 特有的依赖坑现象执行runInstaller时预检在“Package libnsl”这一项直接 Fail日志里写着libnsl.so.1 is not found。很多从 19C 过来的人会愣住因为 19C 根本不查这个东西。原因RHEL 8 把传统的 libnsl 拆成了 libnsl 和 libnsl2默认不安装 old libnsl API而 21C 的 Oracle 二进制仍是按老接口编译的。解决补装 32 位和 64 位的 libnsl再刷新动态链接库缓存。yum install -y libnsl libnsl2 libnsl.i686 libnsl2.i686 ldconfig装完重新跑预检就能过。建议把这四条命令和第 2 章的依赖安装放到一起执行避免中途被打断。5.2 ORA-00845 与 /dev/shm容器安装最常翻的车现象建库完成后sqlplus / as sysdba执行startup报ORA-00845: MEMORY_TARGET not supported on this system。原因Oracle 21C 默认用自动内存管理MEMORY_TARGET对应的共享内存要挂在/dev/shm上。容器或小规格虚拟机里/dev/shm默认只有 64MB而MEMORY_TARGET动辄 2GB自然起不来。解决要么调小内存参数要么把/dev/shm挂大。我一般倾向于挂大因为测试库需要足够内存跑排序和缓存echo tmpfs /dev/shm tmpfs defaults,size4G 0 0 /etc/fstab mount -o remount /dev/shm df -h /dev/shm如果不想动系统挂载点也可以在 DBCA 建库时把-totalMemory降到 1024并在建库后把memory_target和sga_max_size改成不超过/dev/shm大小的值。但要记得sga_max_size必须大于等于memory_target改小要重启实例才生效。5.3 root.sh 卡在权限一场出自目录属主的血泪教训现象root.sh 执行到一半提示类似Failed to create /u01/app/oracle/cfgtoollogs/dbca/orcl或者直接 Permission denied 退出。原因建目录时chown少了一层比如只改了/u01/app/oracle没改/u01/app或者中间层目录被 root 手动创建后变成了 root 属主导致 oracle 用户在 OUI 阶段能写、root.sh 阶段反而没权限。解决把/u01/app整棵树的属主修正再重跑 root.shchown -R oracle:oinstall /u01/app chmod -R 775 /u01/app su - root $ORACLE_HOME/root.sh这个坑的隐蔽之处在于安装前期一切正常直到 root 脚本才爆容易误判成脚本本身的问题。修好属主后重跑脚本是幂等的放心执行。5.4 监听起不来八成是端口和主机名的问题现象lsnrctl start报TNS-01190: The listener is already running或者Cannot find symbol也可能卡在Starting /u01/app/oracle/product/21c/dbhome_1/bin/tnslsnr再没动静。原因端口被占是其中一种更常见的是/etc/hosts里主机名对应了127.0.0.1或者主机名带了下划线监听解析地址失败。解决先把主机名和 hosts 对齐再查端口占用hostname grep $(hostname) /etc/hosts ss -lntp | grep 1521如果 hosts 里没有当前主机名的记录补一行“实际IP 主机名”然后lsnrctl stop再lsnrctl start。主机名里带下划线是 Oracle 老脾气坚决不能有有的话安装前就要hostnamectl set-hostname改掉否则监听和 EM 都会抽风。5.5 中文乱码NLS_LANG 与数据库字符集要配对现象用 sqlplus 查含中文的表显示??或一堆乱码服务端和客户端看着都不对劲。原因多半是客户端NLS_LANG里的字符集和数据库实际字符集不一致。21C 建库时如果选了ZHS16GBK而客户端设的是AL32UTF8中文字符在转换链路上就会出错。解决先查数据库的字符集和实例当前语言环境再对症下药select userenv(language) from dual;输出类似AMERICAN_AMERICA.ZHS16GBK就把客户端.bash_profile里的NLS_LANG设成一致然后重新登录 sqlplus。这里提醒一句数据库字符集建库后想改也不是不行ALTER DATABASE CHARACTER SET ...在 21C 里仍然存在但涉及全库数据转换线上库别轻易尝试测试库改了也可能触发数据损坏建库前定好字符集才是正解。6. 安装验证与进阶技巧一条命令流和 systemd 开机自启6.1 一条验证命令流pmon、监听、sqlplus 一次看完装完以后别急着收工用下面这段把进程、监听、实例一次验完ps -ef | grep pmon | grep -v grep lsnrctl status sqlplus -S / as sysdba EOF select name, open_mode from v\$database; select userenv(language) from dual; exit EOFgrep pmon看到ora_pmon_orcl进程说明实例已经起来lsnrctl status输出里有Service orcl has 1 instance(s)表示监听注册成功SQL 部分返回nameORCL, open_modeREAD WRITE就说明这是个能正常读写的单实例库。字符集查询结果要和建库时选的对上对不上按 5.5 的套路调。这套命令也可以存成脚本下次搞别的机器直接复用省得一项项敲。6.2 进阶技巧用 systemd 把 21C 单实例做成开机自启我自己的使用习惯是给单实例测试库配一个 systemd service比传统/etc/rc.local或dbstart更可控。新建/etc/systemd/system/oracle-21c.service[Unit] DescriptionOracle 21C Single Instance Afternetwork.target [Service] Typeoneshot Useroracle Groupoinstall RemainAfterExityes ExecStart/bin/su - oracle -c lsnrctl start echo startup | sqlplus / as sysdba ExecStop/bin/su - oracle -c echo shutdown immediate | sqlplus / as sysdba lsnrctl stop [Install] WantedBymulti-user.targetTypeoneshot配合RemainAfterExityes让系统认为这个服务启动后一直存在而不是执行完就退出。启动、状态检查用systemctl start oracle-21c和systemctl status oracle-21c最后systemctl enable oracle-21c实现开机自启。这个方案只适合单实例、无 RAC 的测试或开发环境生产库还是走官方原厂推荐的方式。我第一次给 21C 配 systemd 时忘了Afternetwork.target开机后监听抢在网卡就绪前启动结果连不上后来加上依赖顺序就好了。希望这些步骤和踩坑记录帮到你至少让你在不熟悉的安装部署路上少走几趟弯路。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑