
1. 在Linux 7上装Oracle 11g先别急着下介质最近生产环境扩容新申请的服务器清一色RHEL 7.9业务侧却还绑死在Oracle 11g上。这种新系统装老数据库的组合看起来简单实际上一堆兼容性陷阱等着你踩。我在这几天连续装了好几套Oracle 11g单机正好把整个流程、参数取舍、踩坑记录完整沉淀下来给需要在Linux 7上部署11g的同学做个参考。先说结论Oracle 11g11.2.0.4官方认证的是RHEL 6RHEL 7并不在初始支持列表里。但生产环境里跑11g的业务太多了尤其是一些老ERP、EBS系统绑定得死死的换数据库根本不现实。所以实际上Linux 7 Oracle 11g单机这种组合早就是DBA的日常操作只是不能再按老教程一步步点到底安装前必须做好三件事补丁介质准备、系统参数适配、安装方式选型。这篇总结默认读者具备基础Linux操作能力命令能看懂、会建用户、看得懂日志。如果是刚入门的小白建议先熟悉vi、yum、chmod这些基础命令再来操作数据库安装不然遇到问题会非常痛苦。1.1 为什么官方不支持的项目还在大量生产Oracle 11.2.0.4是11g最后一个补丁版本本身相当成熟。大量业务系统是基于这个版本开发、测试、上线的应用层对数据库版本有强依赖甚至某些存储过程、内部函数只在11g上运行正常升级到12c或者19c要重写一大片代码。所以很多企业宁可让数据库停留在老版本也不愿意承担升级成本。而服务器硬件层面新采购的机器大多预装的是RHEL 7或CentOS 7RHEL 6的安装介质越来越难获取内核驱动对新硬件支持也不够好。两边一挤就逼出了Linux 7上装Oracle 11g这个非官方但刚需的场景。Linux 7相比6最大的变化在于系统初始化从SysVinit切到了systemdOracle 11g自带的服务脚本基于老init机制开机自启要另想办法。默认依赖包变化很大11g需要的兼容库在7上要么没有、要么被改名装依赖是一道坎。防火墙从iptables切成了firewalldSELinux默认 enforcing端口通了但连不上这种灵异事件一半是SELinux搞的。这些差异不像直接报错那样显眼而是藏在安装过程中的某个不显眼环节里没踩过一次根本想不到。1.2 版本选择和补丁准备如果条件允许只选11.2.0.4不要选更早的11.2.0.1或11.2.0.2。11.2.0.4在Linux 7上的问题相对最少官方虽然没认证但很多已知Bug在新补丁里已经修复实际运行要稳得多。介质方面需要11.2.0.4 Linux x86-64的Database安装包两个zip文件p13390677_1120401of7和2of7。这两个包解压后会形成database目录里面包含runInstaller脚本和所有组件。建议同时准备最新的OPatch补丁以及11.2.0.4后续的PSU/RU补丁安装完成后先打补丁再建库避免后期一堆Bug。有人会说我直接用老的11.2.0.1介质然后在线升级到11.2.0.4不行吗可以但多一步升级时间成本和风险都增加。介质能把版本一步到位的话就别绕路。2. 环境准备清单依赖包、内核参数和用户目录这是整个安装过程中最枯燥、最容易被跳过、但决定成败的部分。11g在Linux 7上安装失败一半原因出在环境准备不充分。2.1 系统层面的体检装之前先把系统底子摸清楚内存至少2GB实际生产建议16GB以上。后面设置内存参数时要以物理内存为参考。Swap官方建议内存的1.5到2倍但对16G以上的机器受11g老版本对Swap的扫描逻辑影响设16G就够用了。磁盘ORACLE_BASE所在分区建议独立挂载至少预留100GB空间数据文件、归档日志、备份都放同一目录会非常挤。解压安装介质需要临时2GB空间/tmp不够的话先把安装包解压到/u01下的临时目录。主机名和hosts文件/etc/hosts里必须有主机名到本机IP的解析记录而且主机名最好用短名不要带域名。这一步被忽略的话配监听时会出现各种莫名其妙的本机连接问题。检查命令free -h df -h hostname cat /etc/hosts nproc2.2 关闭SELinux和防火墙先声明如果企业安全基线要求必须开启可以只放行1521端口但SELinux和Oracle老版本的兼容性确实很差强烈建议至少设置成permissivesetenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config防火墙层面如果内网环境直接停掉firewalld最省心systemctl stop firewalld systemctl disable firewalld如果必须保留防火墙规则的放行方式firewall-cmd --permanent --add-port1521/tcp firewall-cmd --permanent --add-port1522/tcp firewall-cmd --reload后面踩坑记录里我会细说SELinux是怎么吞掉监听连接的。2.3 依赖包一次性装齐这是Linux 7上最容易出问题的一步。Oracle 11g的依赖包列表和官方文档里的不完全一致部分包在RHEL 7源里名字改过或者没有。我实际可用的安装命令yum -y install binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc libstdc-devel libXext libXtst libX11 \ libXau libXi libXp numactl numactl-devel sysstat \ elfutils-libelf elfutils-libelf-devel unixODBC unixODBC-devel \ unzip xorg-x11-utils几个容易被忽略的点第一compat-libstdc-33这个包在标准RHEL 7源里不一定有尤其在离线内网环境。如果yum搜不到需要从RHEL 6的安装介质或内部镜像里找这个rpm手动装。它缺失的典型表现是Oracle软件链接时报一堆/usr/bin/ld: skipping incompatible错误。第二libaio-devel装完之后检查一下/usr/lib64/libaio.so.1是否存在。有些精简系统只有libaio.so.1.0.1而没有符号链接Oracle找libaio.so会扑空ls -l /usr/lib64/libaio*如果没有符号链接手动补上ln -s /usr/lib64/libaio.so.1 /usr/lib64/libaio.so第三RHEL 7的gcc是4.8.5和11g时代的编译器版本有代差。装完依赖包之后建议顺手确认一下版本编译环节如果报错先查是不是编译器引起的问题。2.4 用户、组、目录规划安装Oracle不能使用root账号必须创建专用用户。我的习惯是三个组oinstall管Oracle软件安装dba管数据库操作oper是可选的操作员组。groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle然后规划目录。单机环境我用的是标准的OFA结构ORACLE_BASE/u01/app/oracleORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1Inventory目录默认在/u01/app/oraInventorymkdir -p /u01/app/oracle mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1 chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app特别注意/u01如果是一个独立分区挂载选项里不要带noexec和nosuid否则安装执行二进制文件时会直接Permission denied。2.5 内核参数sysctl.conf里每一行都是干啥的很多人直接抄官方文档但不知道每个参数在防什么。我列出实际部署值并解释原理fs.aio-max-nr 1048576 fs.file-max 6815744 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 1048576kernel.sem的四个值分别是SEMMSL、SEMMNS、SEMOPM、SEMMNI。数据库启动时要创建信号量如果数量不够实例起不来报错是ORA-27102或semget失败这时候回头看这个参数就明白了。fs.file-max控制整个系统的文件句柄上限。数据库在高并发下要打开大量数据文件、日志文件和网络socket太低会报EMFILE。net.ipv4.ip_local_port_range设成9000到65500是为了给Oracle的客户端连接留足本地端口范围。如果不改默认是32768到61000高并发连接时端口耗尽应用端报cannot assign requested address。四项网络缓冲区参数直接影响RAC和远程连接的稳定性单机上把rmem_default和wmem_default设置成文档值即可。配置完执行sysctl -p使其生效。2.6 透明大页必须关掉的性能隐患RHEL 7默认启用Transparent HugePages透明大页而Oracle 11g对THP的支持极差会出现严重的性能抖动和内存分配延迟。官方也明确建议数据库场景关闭THP。检查方法cat /sys/kernel/mm/transparent_hugepage/enabled如果是[always] madvise never这样的输出说明开启状态。关闭命令echo never /sys/kernel/mm/transparent_hugepage/enabled echo never /sys/kernel/mm/transparent_hugepage/defrag但重启会失效所以还要把这行写入/etc/rc.localecho echo never /sys/kernel/mm/transparent_hugepage/enabled /etc/rc.local echo echo never /sys/kernel/mm/transparent_hugepage/defrag /etc/rc.local chmod x /etc/rc.local别忘了RHEL 7的/etc/rc.local默认没有可执行权限chmod不做的话重启后配置不生效。这个细节我见过很多同行栽过。2.7 limits.conf 和 nproc 限制Oracle 11g的文档建议在/etc/security/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 32768nofile管文件句柄数nproc管进程数stack限制栈大小。这里要提醒仅仅改limits.conf还不够RHEL 7的/etc/security/limits.d/20-nproc.conf默认对所有普通用户限制了nproc为4096。需要单独为oracle用户放宽cat /etc/security/limits.d/20-nproc.conf EOF * soft nproc 4096 oracle soft nproc 16384 EOF不然并发进程数上来之后数据库后台进程会被系统杀掉报ORA-27300之类的错误。2.8 oracle用户环境变量编辑oracle用户的~/.bash_profile加入export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SIDorcl export PATH$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH$ORACLE_HOME/libLD_LIBRARY_PATH一定要指到$ORACLE_HOME/lib不然sqlplus启动时会报找不到libclntsh.so。每次用oracle用户登入时检查一下env | grep ORACLE能避免很多明明装了为什么连不上的问题。3. Oracle软件安装图形界面会踩坑静默安装更适合生产3.1 介质解压和权限把两个zip包用oracle用户不是root解压到同一个目标目录su - oracle cd /u01 unzip p13390677_112040_Linux-x86-64_1of7.zip unzip p13390677_112040_Linux-x86-64_2of7.zip解压之后生成database目录。注意1of7和2of7必须解压到同一目录否则文件不完整runInstaller直接报错。3.2 图形安装流程中容易忽略的环节有桌面环境或者通过VNC远程图形安装时运行cd /u01/database ./runInstaller图形界面下最常遇到两个问题第一个是DISPLAY环境变量没设置。如果通过VNC在oracle用户下执行export DISPLAY:1.0 xhost 才能弹出安装界面不然报Unable to create Oracle Configuration Manager或直接没反应。第二个是预检查报错。11.2.0.4的runInstaller在RHEL 7上会提示系统不在认证列表中依赖包检查也有可能飘红。只要系统配置是完整的这一步可以放心点右上角的Ignore All继续安装。这里需要区分依赖包缺失导致的检查失败不能忽略忽略的话后面链接必挂只有操作系统版本检测和个别非关键项可以忽略。图形安装在步骤上基本是Next到底选择Install database software only还是Create and configure a database我建议选前者。软件安装和建库分离方便控制建库参数也能更清晰地定位问题。3.3 静默安装生产环境的首选方案无图形、无VNC的服务器多了去了静默安装才是主流。修改响应文件/u01/database/response/db_install.rsp里的关键项oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.DBA_GROUPdba oracle.install.db.OPER_GROUPoinstall oracle.install.db.config.starterdb.typeGENERAL_PURPOSE DECLINE_SECURITY_UPDATEStrue然后执行cd /u01/database ./runInstaller -silent -responseFile /u01/database/response/db_install.rsp静默安装的日志在/u01/app/oraInventory/logs/installActions*.log。安装过程持续10到20分钟可以另一个窗口tail -f日志观察进度。日志卡住不动也不一定是死掉了有些步骤耗时长耐心等待即可。安装结束时的输出会提示用root执行两条脚本/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shorainstRoot.sh是初始化Inventory目录权限root.sh是注册Oracle的hostname和系统脚本。root.sh执行到最后如果提示不支持自动启动服务可以不管后面我们用systemd自己处理自启。3.4 软件安装完成后先打补丁我建议建库之前先打补丁。用最新OPatch替换$ORACLE_HOME/OPatch目录然后应用你准备好的PSU/RU补丁。流程是unzip p6880880_112000_Linux-x86-64.zip -d $ORACLE_HOME cp $ORACLE_HOME/OPatch/opatch.patch /tmp/ cd /tmp unzip pXXXXX_112040_Linux-x86-64.zip cd pXXXXX $ORACLE_HOME/OPatch/opatch apply打完补丁后再建库一方面省得后面补丁升级要跑catcon.pl另一方面很多早期Bug在补丁后已经修复建库过程更干净。4. 监听器和数据库实例从netca到dbca一条龙4.1 netca创建监听监听器是数据库对外服务的入口创建用netca。静默创建su - oracle netca -silent -responsefile /u01/database/response/netca.rsp生成的listener.ora默认在$ORACLE_HOME/network/admin/下内容类似SID_LIST_LISTENER (SID_LIST (SID_DESC (GLOBAL_DBNAME orcl) (ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME orcl) ) ) LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST yourhostname)(PORT 1521)) ) )验证监听是否起好lsnrctl status看输出的Listener Parameter File和Services Summary如果看到orcl服务正常注册说明监听没问题。这里提醒一下如果/etc/hosts里主机名解析有问题监听的HOST会自动变成127.0.0.1或无法解析的主机名导致远程连接失败。很多网络端口明明是通的却连不上第一个排查点就是监听里的HOST字段。4.2 dbca静默建库数据库实例的创建用dbca静默方式非常直接dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl \ -sid orcl \ -responseFile NO_VALUE \ -characterSet AL32UTF8 \ -memoryPercentage 25 \ -emConfiguration NONE \ -sysPassword YourPass \ -systemPassword YourPass参数说明General_Purpose.dbc是通用模板不需要额外图形干预。characterSet选AL32UTF8不要选ZHS16GBK。很多国内团队还在习惯性选ZHS16GBK但AL32UTF8在11g下对中文的支持更稳定应用的JDBC连接串也兼容将来如果要往12c/19c迁移字符集转换会让你少掉一层皮。memoryPercentage 25表示给Oracle分配物理内存的25%。如果数据库需要更大内存可以在建库后通过ALTER SYSTEM调整SGA/PGA下面会细说。emConfiguration NONE是关闭Enterprise Manager省掉OEM的进程和端口开销DBA日常直接命令行管理剧集。建库过程需要几分钟日志会在屏幕上滚动最后显示数据库创建完成。4.3 11g内存参数的真实情况11g默认启用自动内存管理AMMMEMORY_TARGET会同时管理SGA和PGA。如果设置过大实例启动时报ORA-00845: MEMORY_TARGET not supported on this system原因是11g的AMM依赖/dev/shm的共享内存文件系统。大多数Linux 7默认/dev/shm只有物理内存的一半比如物理32Gshm只有16G而你把MEMORY_TARGET设了28G直接超出shm容量实例根本起不来。解决方案有两个调低MEMORY_TARGET让总和小于shm。扩大/dev/shm容量修改/etc/fstab重新挂载tmpfs /dev/shm tmpfs defaults,size32G 0 0 mount -o remount /dev/shm我个人更推荐第2种因为数据库负载上来之后内存需求会增长留出余量能省去后面的麻烦。同时注意调整shm后free输出里swap和shm的变化容易误导人以df -h /dev/shm为准。4.4 开机自启systemd下的另类方案Oracle 11g自带dbstart和dbshut脚本依赖/etc/oratab文件。先编辑/etc/oratab找到这一行orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N把最后的N改成Yorcl:/u01/app/oracle/product/11.2.0/dbhome_1:Y脚本还需要root用户设置一个环境变量表示数据库启动时自动拉起监听export ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 export ORACLE_SIDorcl然后在systemd里注册服务创建/etc/systemd/system/oracle.service[Unit] DescriptionOracle Database Service Aftersyslog.target network.target [Service] Typeoneshot RemainAfterExityes Useroracle Groupoinstall ExecStart/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart ExecStop/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbshut StandardOutputjournal [Install] WantedBymulti-user.target然后systemctl daemon-reload systemctl enable oracle systemctl start oracle这样数据库和监听都能随系统开机自动启动不需要再折腾chkconfig老方案。实测下来这种用dbstart包一层systemd unit的方式最稳。5. 安装完的验证清单与常见坑记录5.1 安装后必须做的验证新库装完别急着交付给应用先按下面清单过一遍数据库状态sqlplus / as sysdba select status from v$instance; select name, open_mode from v$database;状态应该是OPENopen_mode是READ WRITE。监听状态lsnrctl status确认Services Summary里orcl的实例状态是READY。本地和远程连接测试sqlplus sys/xxx//本机IP:1521/orcl as sysdba这个测试能同时验证TCP端口、监听配置、hosts解析。查看告警日志确认没有ORA-错误tail -100 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log归档模式。生产库一般要求开归档archive log list;如果显示No Archive Mode和业务确认后开启shutdown immediate; startup mount; alter database archivelog; alter database open;密码有效期。默认PASSWORD_LIFE_TIME是180天如果应用账号长期不换密码到点会锁定。DBA可以把默认profile改成无限制或让应用按规范改密alter profile default limit password_life_time unlimited;备份策略。哪怕只装了单机全库备份也要先跑通rman target / backup database plus archivelog;5.2 踩坑记录一监听服务无法启动现象lsnrctl start之后命令卡住或立即退出状态为UNKNOWN。排查链路lsnrctl status报TNS-12541或TNS-12545先看端口被谁占用netstat -lnpt | grep 1521。端口没被占再查listener.ora里的HOST字段如果配置成了无法解析的主机名把HOST改成实际IP。还是不行看$ORACLE_HOME/network/log/listener.log这是最直接的证据。如果日志里出现权限相关的报错多半是$ORACLE_HOME/network/admin目录权限不对chown成oracle:oinstall并确认目录可写。我遇到过最隐蔽的情况是SELinux拦截。SELinux enforcing状态下网络连接可以建立但实际数据传输被丢弃Oracle客户端报ORA-12537连接被关闭而监听日志几乎没内容。处理方式是先临时setenforce 0验证确认是SELinux导致后再永久调整。5.3 踩坑记录二ORA-00845和/、dev/shm这个坑在前面内存参数部分提过再补充一个实际现象运行时如果SGA自动扩展把/dev/shm占满了数据库实例会直接崩溃或者报ORA-27102。我在某台物理机上把MEMORY_TARGET设得过高然后持续跑压测几个小时后实例挂了系统日志里全是Out of memory: Kill process。所以建议/dev/shm容量至少等于你要给Oracle的内存总和的两倍给自己留缓冲。对自动内存管理不要依赖自动调节生产环境最好用手动设置SGA_TARGET和PGA_AGGREGATE_TARGET避免在重负载下AMM反复调整导致性能抖动。5.4 踩坑记录三安装时链接报错在Linux 7上安装Oracle 11g链接阶段最容易报这些错relocation R_X86_64_32S against .rodata can not be used when making a shared object /usr/bin/ld: cannot find -lstdc第一种是编译器和链接器版本问题。Oracle 11g的link脚本对RHEL 7的gcc 4.8.5不完全兼容在老版本11g介质上常见。11.2.0.4基本规避了大部分情况但遇到的话可以尝试重新链接make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk第二种是缺libstdc库。检查一下ls /usr/lib64/libstdc.so*如果只有libstdc.so.6而没有无后缀的符号链接安装完整gcc和libstdc-devel后会自动补上。如果还缺兼容库就要回头装compat-libstdc-33。5.5 踩坑记录四systemd下自启失效这个问题很经典。Oracle老脚本依赖/etc/init.d/oracle和chkconfig注册在RHEL 7上执行chkconfig --add oracle会提示不支持。如果谁直接复制老教程用service oracle start拉起大概率报unrecognized service。解决方式就是前面写的systemd unit方案。要注意的是unit文件里ExecStart用dbstart不要直接写sqlplus去startup因为dbstart会读取/etc/oratab统一处理多个实例的启动比手动startup更规范。5.6 踩坑记录五过时的目录权限导致ORA-27041DBA如果图省事用root在/u01/app/oracle下创建了目录数据文件目录/u01/app/oracle/oradata权限就是root:root。建库或创建表空间时会直接报ORA-27041: unable to open file排查时可以ls -l /u01/app/oracle/oradata如果发现属主不是oracle立刻chown回来。这类问题看起来是Oracle文件错根子却在Linux权限上排查思路要跨层。6. 一些我在实际操作中的体会装完这么多遍11g最大的感受是在Linux 7上装11g其实不是装的问题而是适配的问题。你只要保证所有前置参数、依赖、权限和官方文档一一对应Oracle的安装过程反而出奇地顺利。最后分享一个我自己动手时的习惯每做一步环境变更sysctl、limits、依赖包、hosts等都先记录下来再继续下一步。一旦后面某个环节出现异常可以通过增量化回退排查而不是从零开始猜。尤其是生产环境交付时别人问起这台机器装Oracle前都改过什么有一份清晰的改动清单比翻一大堆系统日志高效得多。如果这篇总结对你也有帮助或者你在安装中遇到不同的问题按告警日志、监听日志、数据库alert日志这条链路去排查大部分问题都能定位到根因。这套安装在CentOS 7和RHEL 7.4到7.9上都验证过放心参考。