无外网环境下Oracle数据库离线安装实战:从依赖准备到静默部署
“无外网”三个字一看到我就知道这项目不简单。很多搞运维的朋友平时联网装Oracle习惯了yum一配、rpm一下载半小时环境就绪。但一旦碰上机房隔离、专网环境、等保测评要求物理断开外网的项目那才是真正考验基本功的时候——所有依赖包都要自己提前想清楚ISO镜像得提前打包装到一半发现缺个libaio真的会让人血压飙升。我这篇就围绕“无外网情况下安装Oracle”这个场景把整个离线安装的完整链路拆开揉碎讲清楚从准备工作、仓库规划、依赖处理到静默安装和常见翻车点排查全部以实际项目中的操作经验为主线你能直接照着做。1. 项目概述离线部署Oracle到底难在哪先说清楚这项目的本质在无法访问互联网、没有软件源、没有yum仓库的隔离网络环境里完成Oracle数据库这里以单机版为主从介质准备到建库启库的全过程。它不只是一个安装动作而是覆盖了整个交付链路——包括安装前的依赖评估、安装介质的离线打包、系统环境的预先配置、静默安装参数设计以及安装后的初始化验证。1.1 为什么“无外网”会让安装难度翻倍很多人觉得Oracle安装难是因为图形界面交互复杂、参数多。但真正做过离线部署的人都明白联网环境下你遇到报错还能去搜、去下载、去补包一旦断了外网安装过程被卡住就是真的卡住了所有缺失的依赖、冲突的版本、缺失的内核参数调整都只能靠你自己事先预判并准备好。我接手过一个银行类的模拟项目数据库服务器在独立网段安全策略要求彻底封锁对外访问所有软件必须通过内部统一的介质审批流程进入。那台机器连基础编译工具都没有装Oracle得先解决操作系统的依赖层再解决数据库本身的安装整个过程足足花了两个半天。其中一半时间不是装数据库而是在跟各种“缺包”“版本不对”“内核参数没生效”打架。经历了那个项目之后我总结出一个结论**无外网安装Oracle90%的工作量其实是在安装之前完成的。**准备得越充分真正安装的过程就越顺。1.2 离线部署的三种常见场景在聊具体操作之前先帮你对对场景因为不同场景的处理策略完全不同第一类是“完全隔离网络”——数据库服务器所在网段和外网物理隔离也没有内部软件源。这种最严格所有介质必须提前通过离线方式带入依赖包一个都不能少。第二类是“受限网络”——服务器能上内网但内侧软件源不完整或者需要审批。这种情况可以自己在内网搭建一个软件仓库镜像比纯靠离线RPM包轻松不少。第三类是“只通特定地址”——比如能访问公司内部的NTP、文件服务器但访问不了公共软件源。这种情况可以把依赖包放在内部文件服务器上通过网络分发代替U盘拷贝。这篇博文以第一类场景为主因为只要能搞定完全离线剩下两种基本都是降维打击。1.3 本项目的适用对象这篇内容适合这几类人看负责数据库安装交付的实施工程师、需要在内网环境搭数据库的开发人员、刚接触Oracle但公司网络管控比较严格的运维新人。即便你手头暂时没有离线安装需求把依赖预判思路和静默安装这套过一遍也会很有收获——因为很多排查经验联网环境下反而不容易触发。2. 离线安装的整体设计思路离线安装Oracle不是简单地把安装包拷到服务器上再双击它是一套完整的链路。无论装的是Oracle 11g还是19c整体思路基本一致我按步骤逻辑给你拆开。2.1 介质规划第一步就定成败离线安装的介质清单包括三大块Oracle数据库安装包、依赖RPM包合集、操作系统基础镜像或内部软件源备份。其中Oracle安装包通常分为两个zip文件比如19c的LINUX.X64_193000_db_home.zip必须把两个文件都传上去再解压到同一个目录不能只传一半。依赖包这块最容易被低估不同操作系统版本、不同内核版本缺的包都不一样。我建议不要靠记忆“大概需要哪几个”直接在联网环境上准备好后统一拉取。具体操作思路是在一台相同操作系统的联网机器上提前准备好所有依赖然后用脚本打包。RPM包获取方式不依赖外部命令的话可以从系统安装ISO的Packages目录里提取也可以从同一版本系统的缓存目录拷贝。推荐经验是安装介质中一定要带上操作系统对应的ISO镜像或完整Packages目录遇到缺包时可以直接本地解包找不用干瞪眼。2.2 依赖预判用“干跑”代替试错Oracle安装服务器要求很多依赖binutils、compat-libcap1、compat-libstdc、gcc、gcc-c、glibc、glibc-devel、ksh、libaio、libaio-devel、libgcc、libstdc、libstdc-devel、libXext、libXtst、make、sysstat、unixODBC、unixODBC-devel等等……这只是基础名单根据系统版本还会缺别的。我的习惯做法是这样的先在机器的root用户下执行Oracle安装前的检查脚本也就是runInstaller的预检查部分等它把缺的东西列出来之后再统一从介质中补。但因为离线环境下载一次成本很高所以更好的做法是把所有可能用到的依赖一次性都备齐宁可多带不可少带这样现场最稳。一个实用技巧在准备依赖的时候用yumdownloader把依赖包全部下下来会附带自动解析比如yumdownloader --resolve --destdir/opt/oracle_deps binutils gcc libaio libaio-devel如果你用的系统不支持这个命令也没关系直接在ISO的Packages目录里按名字匹配手工拷贝就行。离线环境下只要有了一个完整的Packages目录依赖问题基本就解决了一半。2.3 系统层面的一次性配置清单软件包之外Oracle安装还强依赖系统参数。很多安装失败案例并不是包的问题而是内核参数或用户配置没提前到位。离线安装尤其麻烦的是一旦安装过程跑到一小半发现内核参数不对即使改完也要从头来时间成本很高。所以我习惯在动手前把系统状态的配置做成一个检查表关闭防火墙和SELinux或设置为 Permissive配置 /etc/hosts 保证主机名能解析到本地IP创建 oracle 用户和 oinstall、dba 用户组设置oracle用户的环境变量ORACLE_HOME、ORACLE_BASE等配置内核参数kernel.sem、kernel.shmall、fs.file-max、net.ipv4.ip_local_port_range等设置资源的限制/etc/security/limits.conf中的nofile、nproc、stack配置关闭透明大页THP或调整到madvise避免性能坑检查表写好后贴在一个文本文件里现场逐条核对。不要嫌麻烦这一步出问题后面全折腾你。3. 安装前的环境准备每一条都别跳过准备阶段是整个离线安装的底盘这部分做得扎实后面几乎不会出幺蛾子。我按照实际操作顺序一条条讲详细。3.1 操作系统层面的准备先把SELinux和防火墙处理掉。SELinux建议直接改为permissive防火墙在测试环境里可以关掉生产环境如果策略不允许关至少要把Oracle需要的1521端口放通。# 修改 SELinux 配置 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config setenforce 0 # 关闭防火墙测试环境推荐 systemctl stop firewalld systemctl disable firewalld主机名和hosts解析也很重要。Oracle对主机名的解析方式很敏感反解失败会导致监听器起不来。我预处理的标准写法是hostnamectl set-hostname oradb01 echo 192.168.10.20 oradb01 /etc/hosts内核参数方面直接贴一段我常用的/etc/sysctl.conf追加内容注意数值在不同内存环境下可以等比调整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 vm.swappiness 10 vm.dirty_ratio 60 vm.dirty_background_ratio 30改完别忘了执行sysctl -p让它生效。如果对共享内存参数没把握保守配置也不会错只要 kernel.shmall 不小于内存页数、kernel.shmmax 不小于物理内存的一半就基本没啥问题。limits.conf 里的资源限制我通常这么配oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768注意这里生效需要确认/etc/pam.d/login里包含session required pam_limits.so否则配了也白配。这也是离线安装很少人留意但很关键的一环。3.2 用户和环境变量配置创建Oracle用户和用户组命令没什么特别的groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle目录结构我一般按Oracle官方推荐来mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1 mkdir -p /u01/app/oracle/oradata mkdir -p /u01/app/oracle/fast_recovery_area chown -R oracle:oinstall /u01/app chmod -R 775 /u01/apporacle用户的环境变量我习惯写到.bash_profile里export ORACLE_BASE/u01/app/oracle export ORACLE_HOME/u01/app/oracle/product/19.3.0/dbhome_1 export ORACLE_SIDorcl export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:/lib:/usr/lib有一点要提醒不同版本的ORACLE_HOME路径结构不同11g常见是/u01/app/oracle/product/11.2.0/dbhome_119c和以后版本则统一了版本路径。你在现场执行时以自己装的版本为准别机械照抄。3.3 依赖RPM包的离线准备和安装到了离线安装最关键的一步RPM依赖。当年我在现场踩过的最大坑就是以为带够了包结果装到校验阶段报缺compat-libstdc而那个包又不包含在ISO默认仓库里。所以正式建议是在联网的相同版本机器上一次性把依赖包拉全。命令大概是这样的mkdir -p /opt/oracle_deps yumdownloader --resolve --destdir /opt/oracle_deps \ binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc libstdc-devel libXext libXtst \ make sysstat unixODBC unixODBC-devel下载完成之后记得重点检查 compat-libstdc 相关的几个包是不是真的拉到了这个最容易漏。现场执行安装时统一用cd /opt/oracle_deps rpm -Uvh *.rpm如果担心有版本冲突可以先rpm -qa查询现状再决定。我建议不要急着-Uvh一把梭分两批装核心编译相关一批libXext、libXtst等图形库一批这样出问题定位更快。如果你连yumdownloader都用不了还有一个更朴素的方案从操作系统ISO的Packages目录里直接把缺的包抠出来拷贝过去。前提是安装介质版本和服务器系统版本一致RHEL的ISO基本覆盖了全部依赖唯独compat包可能需要另想办法。另外有些系统上用yum install --downloadonly也能实现类似效果但离线现场就别指望这些了带介质才是王道。提示检查是否装了某个包可以用rpm -q 包名批量检查就在依赖目录下执行rpm -Uvh --test *.rpm做一次预演不真正安装只看会不会报依赖缺失。这个“预演安装”的习惯能帮你提前发现所有坑。4. 核心实操离线安装Oracle的完整流程前面所有准备工作就绪真正安装Oracle本体反而是最流程化的部分。我以Oracle 19c为例讲讲完整流程因为19c是当前离线部署中最常见的版本。4.1 安装介质的上传与解压先把两个zip包传到服务器上。推荐放到/u01/app/oracle目录下然后切到oracle用户解压su - oracle cd /u01/app/oracle unzip -q LINUX.X64_193000_db_home.zip -d /u01/app/oracle/product/19.3.0/dbhome_1这里有个关键点如果你解压时用的是root用户后面运行安装命令时会出现文件属主和权限不对的问题所以要么用oracle用户解压要么解压后整体chown。4.2 静默安装的响应文件设计Oracle安装支持三种方式图形交互、静默命令行、模板响应文件。离线环境的服务器通常没有图形界面所以必须走静默安装核心就是一个响应文件。响应文件的内容很多但最关键的就是下面这几个参数一定要结合实际规划填对oracle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v19.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/19.3.0/dbhome_1 oracle.install.db.InstallEditionEE oracle.install.db.rootconfig.executeRootScriptfalse oracle.install.db.OSDBA_GROUPdba oracle.install.db.OSOPER_GROUPdba oracle.install.db.OSBACKUPDBA_GROUPdba oracle.install.db.OSDGDBA_GROUPdba oracle.install.db.OSKMDBA_GROUPdba oracle.install.db.OSRACDBA_GROUPdba oracle.install.db.config.starterdb.typeGENERAL_PURPOSE oracle.install.db.config.starterdb.globalDBNameorcl oracle.install.db.config.starterdb.SIDorcl oracle.install.db.config.starterdb.characterSetAL32UTF8 oracle.install.db.config.starterdb.memoryLimit2048 oracle.install.db.config.starterdb.password.ALLYourStrongPassword SECURITY_UPDATES_VIA_MYORACLESUPPORTfalse DECLINE_SECURITY_UPDATEStrue有两点特别注意第一响应文件里不能出现中文字符或者特殊符号否则解析会报错第二SECURITY_UPDATES_VIA_MYORACLESUPPORT和DECLINE_SECURITY_UPDATES这两个参数必须在有外网的安装中设为false和true否则安装流程会去联网检查更新离线环境下会卡住或超时。4.3 执行安装命令与root脚本处理响应文件准备好后切到oracle用户执行su - oracle cd $ORACLE_HOME ./runInstaller -silent -responseFile /u01/app/oracle/install.rsp -ignorePrereq注意最后那个-ignorePrereq参数。官方建议不要轻易用它但在离线环境下因为你没法联网运行某些远程校验加上内核参数差异很大不加这个参数经常会在预检查阶段停下。我的实际经验是预检查报的问题如果是依赖缺失先补齐再忽略如果只是一些非关键项的警告用-ignorePrereq跳过问题不大。安装到执行完会提示你用root用户去跑两个脚本一个是oraInventory的orainstRoot.sh一个是ORACLE_HOME下的root.sh。这一步千万别偷懒/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/19.3.0/dbhome_1/root.sh跑完root.sh软件安装部分就算正式完成了。4.4 静默建库与启动实例装了软件不算完数据库实例还得建。有两种方式一种是在响应文件里直接配置建库参数另一种是装完软件后再用DBCA静默建库。我更推荐第二种因为更灵活不用在安装阶段把所有参数定死。DBCA静默建库命令如下dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl -sid orcl \ -characterSet AL32UTF8 \ -totalMemory 2048 \ -sysPassword YourStrongPassword \ -systemPassword YourStrongPassword \ -storageType FS \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -emConfiguration NONE执行完之后数据库会自动创建并启动。你可以用以下命令验证状态sqlplus / as sysdba SQL select status from v$instance;如果返回OPEN说明建库成功。然后配置监听netca -silent -responsefile $ORACLE_HOME/assistants/netca/netca.rsp lsnrctl start lsnrctl status到这里一个完整的离线Oracle实例就起来了。4.5 一个完整的SQL验证脚本我习惯建完库立刻跑一组检查脚本确认基础功能正常顺便把表空间、用户状态、字符集都过一遍。下面这段我实测大量使用-- 检查实例状态 select instance_name, status, database_status from v$instance; -- 检查数据库状态 select name, open_mode from v$database; -- 检查字符集 select * from nls_database_parameters where parameterNLS_CHARACTERSET; -- 查看默认表空间和用户 select tablespace_name, status from dba_tablespaces; -- 创建一张测试表并插入数据验证读写 create table sys.test_tab (id number, name varchar2(50)); insert into sys.test_tab values (1, offline test); commit; select * from sys.test_tab;通过这套验证你的离线安装才算真正闭环。5. 常见问题与排查技巧实录离线安装Oracle坑是必然的但大多数坑其实高度相似。我把这些年踩过的问题按出现频率排个序每一条都是一线实战总结适合打印出来现场对照。5.1 依赖缺失类问题最经典报错就是RPM check failed或者Missing required RPM。有一次我在现场看到提示说缺libnsl.so以为是某个包没装查了一圈才发现是compat库版本带错了。这个问题的解决思路是先看报错字眼然后把缺少的库名用rpm -qf反查到对应的包名再去Packages目录里找同名包补装。一个实操技巧在所有RPM安装结束时统一做一次rpm -V验证或者干脆在跑Oracle安装前执行ldconfig -p | grep 缺失库名确认动态库能被系统正常加载。如果库文件在但ldconfig没加载可能是安装RPM时ldconfig没刷新执行一遍ldconfig就好。5.2 预检查卡住或误报离线环境下预检查Prereq Checks经常卡在联网检测一步。报错信息里通常会有Port 443、oasis.oracle.com之类的字样。遇到这种别慌直接把响应文件里那两个安全更新参数置成false和true然后-ignorePrereq重跑。还有一次预检查报“物理内存不足”但free -h看明明有32G。后来发现是内核参数vm.nr_hugepages配置得太大把大页内存占满了。把hugepages调小或者干脆关掉echo never /sys/kernel/mm/transparent_hugepage/enabled再跑预检查就过了。5.3 权限和属主问题安装目录权限不对是离线环境高频问题。典型现象是oracle用户没有/u01/app下目录的读写权限安装到一半报cannot create log file。解决很简单安装前用root确认chown -R oracle:oinstall和chmod -R 775全部到位。另外如果你把安装包解压到了/root或/tmp下oracle用户根本无法读取这也是很容易忽略的点。我的习惯是所有Oracle相关文件要么在/u01下要么在$ORACLE_HOME下避免跨目录权限绕来绕去。5.4 监听器起不来的排查路径监听器起不来多半不是因为端口占用而是hosts解析和主机名不匹配导致的。执行lsnrctl start报TNS-01154或TNS-12545时先检查/etc/hosts有没有把主机名正确指向本机IP然后检查/etc/nsswitch.conf里hosts是否配置了真正的DNS解析方式。另一个不太容易发现的问题是主机名带有大写字母或下划线Oracle的解析器在这种环境下容易出现怪问题。生产服务器主机名规范建议全小写、无特殊字符、不超过15个字符。5.5 一次真实的故障复盘我遇到过一次印象很深的安装失败案例数据库软件装完了DBCA建库时报ORA-27102: out of memory。当时第一反应是物理内存不够结果free一看8G内存完全够。最后定位到原因是kernel.shmall和kernel.shmmax配置有问题——共享内存参数设小了SGA申请不出足够的内存。现场调整/etc/sysctl.conf里的kernel.shmmax和kernel.shmall后执行sysctl -p并且重启了数据库再重新建库问题才彻底解决。这个案例给我们的教训是离线环境下别急着把“内存不足”归咎于硬件先看共享内存参数和系统限制通常真正的坑都在这些被忽略的底层配置上。现象可能原因第一排查动作预检查堵在联网更新安全更新参数未屏蔽检查响应文件两个安全参数RPM校验失败缺compat包rpm -qa比对后补装目录无法创建属主或权限不对ls -ld检查oracle用户权限监听器起不来hosts解析异常cat /etc/hostsnsswitch.conf建库报ORA-27102共享内存参数异常sysctl -p后复验ipcs -lm6. 离线安装全流程速查清单最后给你整理一份走查清单按顺序打勾操作现场照着做基本不会再出大问题。盘点机器资源内存、磁盘、OS版本、架构x86_64还是aarch64规划目录结构ORACLE_BASE、ORACLE_HOME、数据文件目录准备依赖包在联网环境用yumdownloader拉全或从ISO Packages目录复制准备Oracle介质两个zip包或一个安装目录都要完整系统配置SELinux、防火墙、hosts、内核参数、limits.conf全部改好创建用户组和用户oinstall组、dba组、oracle用户设置目录属主/u01/app整体chown给oracle:oinstall解压安装包oracle用户操作确认文件属主写响应文件参数务必全英文密码复杂度要满足要求静默安装runInstaller相关命令必要时加-ignorePrereq执行root脚本orainstRoot.sh和root.sh一个都不能少建库DBCA静默建库设置字符集和内存参数配置监听netca静默配置lsnrctl启动验证功能验证SQL脚本建表、插入、查询一条龙备份介质安装包和依赖目录最好保留在案方便后续扩容或复制这份清单也是我每次交付离线数据库的默认交付文档之一你可以直接粘下来稍作修改就去用。我个人在实际操作中的体会是离线安装Oracle本质上不是技术难题而是细致活。所有报错都可以在准备阶段通过“预演”提前发现真正的安装过程反而安静得让人怀疑是不是还没开始。只要你把依赖、权限、内核参数这三座大山提前安排好后面就是一马平川。希望这篇能帮你在下一个隔离环境项目里少熬几个夜。