ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 8静默安装Oracle 11.2.0.1全流程避坑指南

CentOS 8静默安装Oracle 11.2.0.1全流程避坑指南 CentOS8静默安装Oracle 11.2.0.1这件事我前后折腾过好几个环境每次都能遇到不一样的坑。可能有人觉得都什么年代了还装11g但现实里总有应用厂商不配合、老系统改不动、预算批不下来这类情况你只能在新的操作系统上把这套老东西硬塞回去。这篇文章就按我实际操作的顺序来写把依赖、响应文件、静默命令、常见报错一次性讲清楚给同样被这个组合折磨的人一条能复制的路径。文中涉及的系统操作在CentOS 8.5上验证过思路对RHEL 8、Oracle Linux 8同样适用。1. 为什么要做这件事场景分析与风险预判1.1 哪些场景会逼着你非装不可先说结论如果是全新的生产系统我百分百不建议在CentOS 8上装Oracle 11.2.0.1。但现实中我遇到的场景往往是这几类第一类是存量系统迁移数据库是11.2.0.1应用跟它深度绑定升级19c需要改连接串、改驱动、重新做兼容性测试业务部门不批时间窗口干脆要求运维原样搬过去。第二类是测试环境复现生产库是11g测试环境得保持版本一致但新采购的服务器预装CentOS 8没有现成的旧系统镜像。第三类比较特殊是给老客户做验证性POC对方明确指定国产化或新版本操作系统底层已经是CentOS 8数据库只能想办法兼容上去。在这些场景里你的核心诉求根本不是装一个Oracle而是在不改变应用行为、不升级数据库的前提下把服务重新跑起来。所以静默安装不是可选技能而是必须技能因为新机房服务器往往没有显示器、没有图形界面你只能通过SSH把安装过程自动化掉。1.2 这个组合必须先看清的三个大坑Oracle 11.2.0.1发布的时候CentOS 8还不存在Oracle官方支持的Linux发行版是RHEL 5和RHEL 6。你在CentOS 8上跑它的安装程序本质上是在做一件官方不保证结果的事情。正式动手之前至少要清楚这三层麻烦版本识别问题OUI读取的是/etc/redhat-releaseCentOS 8的版本号不在11.2.0.1的认证列表里预检查会直接给红叉。好在静默安装有-ignoreSysPrereqs这类参数能绕过不用真去改系统文件。依赖链断裂CentOS 8的标准仓库里已经没有compat-libstdc-33这个Oracle 11g必需的兼容库而且默认不装libnslOracle自带的SQL*Plus和临时文件工具启动时会报缺少libnsl.so.1。编译阶段报错安装软件的最后一步需要调用make进行relinkCentOS 8的gcc 8.x太新Oracle 11.2.0.1的makefile和它配合不好经典报错是ins_ctx.mk、ins_emdb.mk、libagtsh.so网上十篇文章里有八篇都是在处理这三个错误。另外提醒一句如果你能找到Oracle 11.2.0.4的安装介质优先用11.2.0.4它对新系统内核的兼容性好很多。本文以11.2.0.1为例是因为这个介质最常见方法本身是一致的。2. 动手前的准备系统安装与软件源改造2.1 下载CentOS 8镜像的推荐路径CentOS 8在2021年12月31日已经停止维护官网首页不再直接列出下载入口现在拿镜像要去vault归档目录。国内速度比较稳的是阿里云镜像地址是https://mirrors.aliyun.com/centos-vault/8.5.2111/isos/x86_64/里面有多个文件我只说两个最常用的CentOS-8.5.2111-x86_64-dvd1.iso完整安装盘大约7G离线装系统用这个。CentOS-8.5.2111-x86_64-boot.iso引导盘大约900M配合HTTP源做网络安装用这个。下载完顺手做一下校验Linux下用sha256sum CentOS-8.5.2111-x86_64-dvd1.iso和镜像站提供的CHECKSUM比对。这一步别省我见过有人下到不完整镜像装到一半报错排查半天才发现是介质问题。2.2 最小化安装时要注意的几个选项安装系统这一步看着简单但有几个选择直接影响后面Oracle能不能装上。磁盘分区我建议给/u01单独一个逻辑卷容量不低于50G因为Oracle软件本身要占5G左右数据文件、归档日志、快速恢复区都会在这个路径下增长。如果你打算用自动内存管理再额外加一部分给/dev/shm但这是后面的事分区阶段先把/u01空间留够。软件包选择时在安装界面的软件选择阶段勾上Development Tools这会把gcc、make、binutils这组编译工具链带进来省得后面手动补一大堆。不需要装图形桌面Oracle 11g的OUI虽然依赖Java但静默安装和后续的SQL*Plus、dbca命令行都不需要X Window。2.3 Yum源切换为Vault源CentOS 8停止维护之后默认的mirrorlist失效直接执行dnf install大概率超时或者报错。需要把repo文件改成指向vault归档否则后面安装依赖包这一步根本过不去。先备份原repo文件然后新建一个干净的/etc/yum.repos.d/CentOS-Vault.repo[baseos] nameCentOS-8-BaseOS baseurlhttps://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/x86_64/os/ gpgcheck0 enabled1 [appstream] nameCentOS-8-AppStream baseurlhttps://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/x86_64/os/ gpgcheck0 enabled1 [powertools] nameCentOS-8-PowerTools baseurlhttps://mirrors.aliyun.com/centos-vault/8.5.2111/PowerTools/x86_64/os/ gpgcheck0 enabled1 [extras] nameCentOS-8-Extras baseurlhttps://mirrors.aliyun.com/centos-vault/8.5.2111/extras/x86_64/os/ gpgcheck0 enabled1写完执行dnf clean all dnf makecache看到repo元数据正常缓存就算成功。这里gpgcheck0是为了省事如果你在意签名校验可以改成1并导入对应的GPG key但实际安装Oracle依赖时并不依赖签名验证。2.4 安装Oracle所需依赖包与缺失包处理依赖包是整个安装过程中第一个真正卡人的地方。按下面这条命令装主依赖dnf install -y binutils compat-libcap1 gcc gcc-c glibc \ glibc-devel libaio libaio-devel libgcc libstdc \ libstdc-devel make sysstat unixODBC unixODBC-devel然后是两个在CentOS 8上容易被漏掉的包。第一个是libnslOracle 11g的二进制工具直接依赖libnsl.so.1CentOS 8默认没装不装的话后面sqlplus和监听程序会报error while loading shared libraries: libnsl.so.1。执行dnf install -y libnsl第二个是compat-libstdc-33官方预检查会检测它没有它Oracle的OUI虽然能通过-ignoreSysPrereqs硬闯但relink阶段可能报libstdc.so.5找不到。CentOS 8仓库里已经没了我一般直接从CentOS 7的仓库拿rpm包安装cd /root wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/compat-libstdc-33-3.2.3-72.el7.x86_64.rpm rpm -Uvh compat-libstdc-33-3.2.3-72.el7.x86_64.rpm如果这个具体版本404了就去/7/os/x86_64/Packages/目录下找带compat-libstdc字样的最新rpm版本号不影响。提示不要在这个阶段追求把所有rpm一次性装齐后面OUI静默日志会告诉你缺什么。先把上面这三组装好就足以撑过runInstaller的依赖检查了。3. 内核参数、用户权限与目录规划3.1 内核参数为什么是这些值Oracle 11g的安装文档里对内核参数有明确推荐值直接照抄不是最好最好理解一下每个参数在干什么。kernel.sem控制信号量Oracle进程间通信大量依赖信号量参数顺序是SEMMSL SEMMNS SEMOPM SEMMNI写成250 32000 100 128是经典配置。kernel.shmmax是单个共享内存段的最大字节数11g的SGA一般不超过3G设4G已经够用。kernel.shmall是共享内存页总数按4G内存页数算2097152页实际上是8G留了余量。完整配置加到/etc/sysctl.confcat /etc/sysctl.conf EOF 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 1048586 vm.min_free_kbytes524288 EOF sysctl -pnet.ipv4.ip_local_port_range现在官方文档推荐的是9000到6550011.2.0.1的旧文档写的是1024到65000我采用新的推荐值避免连接数上来后端口不够用。vm.min_free_kbytes设到512M主要是为了照顾11.2.0.1在某些内核版本上偶发的内存碎片问题单机装可以不设但设了没坏处。然后关闭透明大页。Oracle官方对数据库服务器的要求是透明大页为never因为数据库对内存访问模式很敏感大页合并反而会带来性能抖动。检查当前状态cat /sys/kernel/mm/transparent_hugepage/enabled输出显示[always]就是没关。临时关可以echo never /sys/kernel/mm/transparent_hugepage/enabled但重启会失效。永久关闭要改grub在/etc/default/grub的GRUB_CMDLINE_LINUX行追加transparent_hugepagenever然后重新生成引导配置grub2-mkconfig -o /boot/grub2/grub.cfg最后处理SELinux。Oracle文档要求禁用或者至少permissive否则数据文件、监听socket都会受到SELinux策略干扰。执行sed -i s/^SELINUX.*/SELINUXpermissive/ /etc/selinux/config setenforce 03.2 创建oracle用户与安装目录安装Oracle不允许用root直接装必须建专用用户。完整的组和用户创建命令groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle echo oracle:你的密码 | chpasswd mkdir -p /u01/app/oracle mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01 chmod -R 775 /u01这里oinstall是软件安装的属主组dba是数据库管理组oracle用户同时加入这两个组。/u01/app/oraInventory是Oracle中央目录存放所有Oracle产品的安装清单权限不对会在执行orainstRoot.sh时出问题所以初始化就要把属主和权限设置好。3.3 oracle用户的环境变量与limitsoracle用户的环境变量最好在.bash_profile里写固定因为静态安装过程中偶尔要su - oracle环境不一致会导致OUI找到错的ORACLE_HOME。我的配置如下cat /home/oracle/.bash_profile EOF export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/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.AL32UTF8 EOF source /home/oracle/.bash_profileLD_LIBRARY_PATH在Oracle 11g的日常运维里不是必须的但安装阶段加上能减少很多找不到libclntsh.so.11.1的幺蛾子。NLS_LANG设置成AMERICAN_AMERICA.AL32UTF8可以保证客户端字符集不与数据库端冲突。资源限制方面oracle用户需要允许打开大量文件、大量进程以及足够大的内存锁。修改/etc/security/limits.confcat /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 oracle soft memlock unlimited oracle hard memlock unlimited EOF然后以oracle用户登录验证ulimit -n应该返回65536ulimit -l返回unlimited。如果-l没生效检查/etc/pam.d/login里有没有pam_limits.soCentOS 8默认一般都有没有就手动加一行。4. 静默安装响应文件与执行命令4.1 响应文件从哪里来Oracle 11.2.0.1的安装介质通常是两个zip包linux.x64_11gR2_database_1of2.zip和linux.x64_11gR2_database_2of2.zip先传到服务器解压到同一个目录比如/u01/soft/databasemkdir -p /u01/soft cd /u01/soft unzip -q linux.x64_11gR2_database_1of2.zip unzip -q linux.x64_11gR2_database_2of2.zip解压完成后database/response目录下有几个.rsp模板其中db_install.rsp就是安装数据库软件用的响应文件。把模板复制出来再修改cp /u01/soft/database/response/db_install.rsp /u01/soft/db_install.rsp chown oracle:oinstall /u01/soft/db_install.rsp4.2 关键参数逐行说明响应文件不能有语法错误两边不要留空格需要改的行就那么几个关键参数如下参数值说明oracle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0响应文件版本保持不动oracle.install.optionINSTALL_DB_SWONLY只装数据库软件不立刻建库ORACLE_HOSTNAMEyourhost替换成你的主机名必须能解析UNIX_GROUP_NAMEoinstall软件安装属组INVENTORY_LOCATION/u01/app/oraInventory中央目录位置SELECTED_LANGUAGESen,zh_CN安装语言按需修改ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1Oracle家目录ORACLE_BASE/u01/app/oracleOracle基目录oracle.install.db.InstallEditionEE企业版可选SEoracle.install.db.DBA_GROUPdbaDBA组oracle.install.db.OPER_GROUPoinstall操作员组按需修改DECLINE_SECURITY_UPDATEStrue不接收安全更新必须为true模板里还有一大段oracle.install.db.config.starterdb.*参数那是给安装软件并同时建库用的。我们选的INSTALL_DB_SWONLY这些参数不会被解析建议直接注释掉或留空免得OUI因为某个字段格式问题报错。4.3 执行静默安装响应文件准备好之后用oracle用户执行su - oracle cd /u01/soft/database ./runInstaller -silent -force -ignorePrereq -ignoreSysPrereqs \ -responseFile /u01/soft/db_install.rsp-silent指定静默模式-ignorePrereq跳过前置条件检查-ignoreSysPrereqs跳过操作系统认证检查。加上这两个参数CentOS 8的版本识别问题就不会拦住安装。执行后终端会挂在那里其实是在后台安装打开另一个终端看日志tail -f /u01/app/oraInventory/logs/installActions2025*.log看到类似The installation of Oracle Database 11g was successful就说明软件装完了。安装结束时终端会提示需要用root执行orainstRoot.sh和root.sh两个脚本先不急着执行等我把后续步骤一起说。5. root脚本、监听与静默建库5.1 执行root脚本用root登录依次执行/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shorainstRoot.sh负责把中央目录的属主和权限修正成root可管理的状态很快。root.sh会配置本地bin目录链接以及/etc/oratab执行过程中会问一次Enter the full pathname of the local bin directory: [/usr/local/bin]:直接回车用默认值就行。如果你在root.sh执行时看到关于ohasd或者crs的告警别慌这只是它在检测集群组件单实例数据库不受影响。5.2 配置监听netca不是唯一选择按理说监听可以用netca -silent配置但Oracle 11.2.0.1的netca在CentOS 8上偶尔会撞上Java兼容问题报Exception in thread main java.lang.NoClassDefFoundError。我一般直接手动写配置文件反而更稳定。在$ORACLE_HOME/network/admin目录下创建listener.oramkdir -p $ORACLE_HOME/network/admin cat $ORACLE_HOME/network/admin/listener.ora EOF LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST yourhost)(PORT 1521)) (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) ) ) ADR_BASE_LISTENER /u01/app/oracle EOF这里的yourhost要替换成服务器实际主机名并确保/etc/hosts里有对应的解析记录。我用的是主机名而不是localhost因为远程客户端连接时的解析只认这个。再创建tnsnames.oracat $ORACLE_HOME/network/admin/tnsnames.ora EOF ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST yourhost)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) ) EOF启动监听lsnrctl start lsnrctl status看到The command completed successfully且Listener状态为READY监听就算起来了。5.3 DBCA静默建库建库用dbca的静默模式一行命令搞定dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -sysPassword Oracle123 \ -systemPassword Oracle123 \ -characterSet AL32UTF8 \ -nationalCharacterSet AL16UTF16 \ -memoryPercentage 40 \ -storageType FS \ -datafileDestination /u01/app/oracle/oradata \ -emConfiguration NONE密码自己改成满足Oracle复杂度要求的最少8位含大小写字母和数字。-memoryPercentage 40表示给实例分配物理内存的40%如果你只想用SGA和PGA的绝对值可以再加-memoryMgmtType AUTO_SGA之类的参数但这条通用命令已经够用了。建库过程根据机器性能不同一般10到20分钟。结束后用oracle用户验证sqlplus / as sysdba SQL select status from v$instance; SQL select name, open_mode from v$database;看到实例状态为OPEN数据库READ WRITE整个安装链路就算打通了。6. 排障实录我把能碰到的错都碰了一遍6.1 预检查直接红叉绕过还是伪装第一次用CentOS 8装11.2.0.1的兄弟看到OUI预检查报Operating System Certified失败第一反应可能是去改/etc/redhat-release伪装成RedHat 6或者7。我试过最后发现这是最不推荐的方案。因为你一旦改了版本号OUI对依赖包的检测逻辑也跟着变原来只是警告的包变成硬性错误反而要多装一堆根本不兼容的老包。而且安装完如果忘了恢复/etc/redhat-release后面程序读系统版本又会出问题。正确的做法就是在静默命令里带-ignorePrereq -ignoreSysPrereqs直接在启动时告诉OUI我知道系统不在认证列表但我选择继续。日志里会出现一堆WARNING不用管只要最终没有ERROR就行。6.2 缺少libnsl.so.1和compat包我在一台新装的CentOS 8上执行sqlplus / as sysdba直接报sqlplus: error while loading shared libraries: libnsl.so.1: cannot open shared object file这个问题几乎100%会在CentOS 8上遇到因为glibc 2.28之后把libnsl从基础库里拆出来了。解决方式就是开头说的dnf install -y libnsl装完确认/usr/lib64/libnsl.so.1存在sqlplus就能正常起。如果报的是libstdc.so.5找不到就是compat-libstdc-33没装按2.4里的方式补上。这个报错经常不发生在安装阶段而是在安装完第一次启动监听或者sqlplus时冒出来所以别以为软件装完就万事大吉。6.3 make阶段报错ins_ctx.mk、ins_emdb.mk、libagtsh.so这是11.2.0.1在CentOS 8上最经典的一组报错。静默安装跑到95%左右卡住查看日志INFO: Error in invoking target install of makefile /u01/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk原因是Oracle 11.2.0.1的makefile在调用gcc链接时带的$(LDFLAGS)变量里包含了对新版本gcc不再友好的参数。我的处理方法先让静默安装终止以oracle用户进入$ORACLE_HOME把这两个mk文件里的$(LDFLAGS)全部去掉sed -i s/$(LDFLAGS)//g $ORACLE_HOME/ctx/lib/ins_ctx.mk sed -i s/$(LDFLAGS)//g $ORACLE_HOME/sysman/lib/ins_emdb.mk然后重新执行上下文编译make -f $ORACLE_HOME/ctx/lib/ins_ctx.mk install make -f $ORACLE_HOME/sysman/lib/ins_emdb.mk install如果再报libagtsh.so链接失败这是Oracle自己一个几乎没用到过的AGP库直接建个空文件占位touch $ORACLE_HOME/lib/libagtsh.so然后重新执行一次runInstaller选择“继续”或者手动把剩余脚本跑完。这个处理思路的本质是告诉Oracle“有些组件我手工补齐了你不要再卡在编译上了。”我在这组错误上耗过不短时间后来发现处理顺序无所谓关键是不能只在OUI的图形界面点Retry因为静默模式下根本没有Retry按钮必须自己到命令行手动make。6.4 安装到45%突然回滚遇到过几次安装中途直接回滚日志最后写着磁盘空间不足或者响应文件某个字段解析失败。排查顺序其实很简单df -h /u01 /tmp du -sh /tmp/OraInstall*/tmp至少要留1GOUI运行时要在这里放临时文件不够就报错。/u01安装空间至少要5G建库后再加数据文件空间。回滚后最干净的清理命令rm -rf /u01/app/oracle /u01/app/oraInventory /tmp/OraInstall*然后从响应文件检查开始重新执行。不要试图在残留目录上续装Oracle的安装器没有可靠的断点续传能力重来反而更快。我踩过这个坑本来想着已经装到45%清理残留再续装结果各种奇怪状态最后老老实实清干净重装十五分钟搞定。6.5 监听起不来、实例也起不来监听启动失败的典型报错是TNS-12545或者TNS-01153。TNS-12545意思是目标主机或对象不存在多半是listener.ora里的HOST写了一个不能解析的名字。我的排查命令是ping yourhost getent hosts yourhost如果/etc/hosts里没有主机名对应的记录或者listener.ora写的IP和本机实际IP不符就会这样。把/etc/hosts补一行IP yourhost重启监听即可。数据库实例启动时报ORA-27125: unable to create shared memory segment这是因为Oracle尝试在hugepages上分配共享内存段失败。如果按照3.3里设置memlock unlimited一般就不会碰到。已经遇到的话先用root检查cat /proc/meminfo | grep -i hugepages如果HugePages_Total不是0要么给oracle用户足够的memlock要么关闭hugepages并重启数据库。这个错误在4G内存的小机器上很容易复现内存越大反而越少见。最后分享一点我个人的体会。这套CentOS8静默安装Oracle11.2.0.1的操作本质上是把一个不受官方支持的组合强行跑通。每次装完我都会把安装介质zip、修改后的响应文件、补丁包一起打成一个tar归档放在/u01/soft下下次再遇到同款需求直接解压重放能省掉不少重复排查时间。如果你只是测试环境这么折腾没问题如果生产环境必须这么干至少先去申请一个11.2.0.4的介质兼容性会好很多。希望这篇能帮少走点弯路省下几个小时去喝杯咖啡。
返回列表