Ubuntu 14.04一键安装Oracle 11gR2单机实战指南
1. 项目概述为什么在 Ubuntu 14.04 上“一键安装 Oracle 11gR2 单机”这件事至今还有人反复搜索你点开这个标题大概率不是为了怀旧——没人会主动选一个早已结束官方支持2019年4月EOL、内核版本停留在3.13、默认Python还是2.7.6的系统来部署新业务。但现实很具体某台老设备上跑着一套十年前定制的财务模块它硬编码依赖 Oracle 11gR2 的特定字符集处理逻辑或者某所高校实验室的嵌入式教学平台硬件资源极其有限只能用 Ubuntu 14.04 VirtualBox 虚拟出最小可行环境又或者你在接手一份遗留系统的运维文档时第一页就写着“环境要求Ubuntu 14.04 LTS Oracle 11.2.0.4”。这时候“一键安装”四个字不是偷懒的借口而是降低人为操作失误、确保环境可复现、把三天排错压缩成二十分钟的生存刚需。关键词里反复出现的“ubuntu”“oracle”“11GR2”“一键安装”“单机”背后是三重真实压力第一层是兼容性断层——Oracle 官方从不提供 Linux x86-64 平台下对 Ubuntu 的任何安装支持所有适配都是社区硬啃出来的补丁第二层是依赖链脆弱性——Ubuntu 14.04 的 glibc 是 2.19而 Oracle 11gR2 原生期望的是 RHEL/CentOS 6 的 2.12中间差了整整七个主版本迭代光是libaio、libstdc、pdksh这几个包的版本号对齐就能卡住半天第三层是配置黑盒化——oraInst.loc文件路径、/etc/oraInst.loc权限、oracle用户的 shell 类型必须是/bin/bash不能是/bin/sh、甚至/tmp分区的挂载选项noexec会导致静默失败任何一个细节偏差都会让安装程序在“正在启动 Oracle Universal Installer…”之后直接消失连日志都不留一行。我当年在一家制造企业做现场支持客户服务器 BIOS 设置里启用了 Intel VT-d结果 Oracle 安装界面根本弹不出来——这种问题查官方文档文档里压根没提虚拟化扩展对 GUI 安装器的影响。所以所谓“一键”本质是把三年踩过的坑、五次重装的经验、八份不同来源的 patch 合并成一个可执行脚本再配上足够傻瓜的提示。它解决的从来不是“能不能装”而是“装完能不能立刻用”。2. 核心设计思路与方案选型为什么不用 Docker为什么坚持 Shell 脚本而不是 Ansible看到热搜词里夹杂着“ubuntu安装docker”“下载 docker 安装oracle 11g r2 所需的tar”你可能会疑惑现在都 2024 年了为什么还要折腾原生安装答案很现实Docker 不是万能解药尤其对 Oracle 11gR2 这种老古董。Oracle 官方从未发布过 11gR2 的 Docker 镜像社区维护的镜像如 wnameless/oracle-xe-11g全部基于 Oracle XEExpress Edition功能阉割严重——不支持 RAC、没有 Data Guard、最大内存限制 1GB、无法创建多 PDB。而标题明确写的是“Oracle 11GR2”这是标准版Standard Edition或企业版Enterprise Edition的代号意味着客户需要的是完整功能集。更关键的是Docker 容器默认使用overlay2存储驱动而 Oracle 的 ASMAutomatic Storage Management要求裸设备或符合 O_DIRECT 语义的块设备容器里根本挂载不了。我试过用--privileged模式挂载宿主机/dev/sdb进去结果 Oracle 安装器检测到/proc/mounts里有overlay字样直接报错退出。这不是技术不行是架构层面的不兼容。那为什么选 Shell 脚本而不是 Ansible 或 Puppet因为环境确定性优先于工具先进性。Ansible 依赖 Python 环境而 Ubuntu 14.04 的/usr/bin/python指向的是 2.7.6Ansible 2.9 已经要求最低 2.7.9Puppet 则需要 Ruby 2.0系统自带的是 1.9.3。一旦你为了装配置管理工具先去升级基础运行时整个环境的稳定性就崩了。Shell 脚本的优势在于它只依赖/bin/bash和/usr/bin/awk这两个 Ubuntu 14.04 自带且永不变更的组件。我写的安装脚本第一行永远是#!/bin/bash -e-e参数保证任何命令返回非零状态立即退出避免错误被掩盖。整个流程被拆成六个原子阶段0_precheck.sh检查内存、swap、磁盘空间、内核参数、1_system_setup.sh创建用户、组、目录、修改 limits.conf、2_package_install.sh用apt-get install -y --force-yes强制安装libaio10.3.109-4ubuntu2等精确版本、3_oracle_env.sh设置.bash_profile中的ORACLE_HOME、PATH、LD_LIBRARY_PATH、4_unzip_and_patch.sh解压linux.x64_11gR2_database_1of2.zip和2of2.zip打p10404530_112030_Linux-x86-64.zip补丁修复 11.2.0.1 到 11.2.0.4 的升级缺陷、5_run_installer.sh调用runInstaller -ignoreSysPrereqs -ignorePrereq -silent -responseFile静默安装。每个阶段独立可执行、失败可重试、日志单独保存。这种设计不是炫技是给运维人员留出“分段调试”的抓手——当4_unzip_and_patch.sh失败时你不需要重跑整个流程只需进/tmp/oracle_install/logs/看patch_20240515_1422.log里面清清楚楚写着OPatch failed with error code 73对应 Oracle 文档 ID 73意思是“目标 ORACLE_HOME 不存在”说明3_oracle_env.sh里export ORACLE_HOME/u01/app/oracle/product/11.2.0/db_1这行没生效得去检查.bash_profile是否被正确 source。3. 核心细节解析与实操要点那些官方文档绝不会告诉你的“魔鬼参数”3.1 内核参数调优不是照抄 sysctl.conf 就完事Oracle 官方安装指南要求修改/etc/sysctl.conf但 Ubuntu 14.04 的 systemd 机制会让某些参数在重启后失效。比如kernel.shmall 2097152这个值它表示系统允许的最大共享内存页数计算公式是物理内存(字节) / 4096。假设你有 8GB 内存8×1024×1024×1024 / 4096 2097152看起来没问题。但实际运行中Oracle 启动时会报ORA-27123: unable to attach to shared memory segment。原因在于Ubuntu 默认启用transparent_hugepage内核会自动合并小页为大页2MB导致shmall计算基准错乱。解决方案不是改shmall而是禁用 hugepageecho never /sys/kernel/mm/transparent_hugepage/enabled并写入/etc/rc.local开机自启。这个操作在 Red Hat 系统里叫tuned-adm, 在 Ubuntu 里就是一行 echo 命令但漏掉它安装成功了实例也起不来。3.2 用户权限与 SELinux 替代方案Ubuntu 没有 SELinux但有 AppArmor很多人以为 Ubuntu 没有安全模块就万事大吉其实不然。Ubuntu 14.04 默认启用 AppArmor它的配置文件/etc/apparmor.d/usr.sbin.mysqld虽然管 MySQL但/usr/lib/apparmor/profiles/abstractions/base里定义的capability dac_override,规则会阻止oracle用户读取/proc/self/status。Oracle 安装器在检测系统信息时会访问这个文件AppArmor 日志/var/log/kern.log里会出现apparmorDENIED operationopen name/proc/12345/status。解决方法不是关 AppArmorsudo service apparmor stop而是给 oracle 用户加一条 profilesudo aa-complain /usr/bin/runInstaller让它进入投诉模式记录所有拒绝行为但不阻止执行然后根据日志生成新规则。这比 CentOS 上改 SELinux 布尔值复杂得多却是 Ubuntu 环境特有的必填项。33.3 静默安装响应文件response file 里的三个致命陷阱Oracle 静默安装依赖database/response/db_install.rsp但这个文件有三个极易踩的坑第一oracle.install.db.config.starterdb.type必须填GENERAL_PURPOSE填DATA_WAREHOUSE会导致监听器配置错误因为后者默认启用shared_servers5而 Ubuntu 14.04 的ulimit -n默认是 1024不够分配第二oracle.install.db.config.starterdb.globalDBName不能含下划线比如orcl_db会被解析成orcl和db两个部分导致tnsnames.ora里 SID 名称错乱第三也是最隐蔽的oracle.install.db.config.starterdb.password.ALL这个字段如果密码含特殊字符如$、!、Bash 会提前解析必须用单引号包裹MyPssw0rd!2024。我曾经因为密码里有个$安装器把$ORACLE_HOME当作变量展开结果ORACLE_HOME变成空字符串整个安装路径全乱。后来我把所有密码字段统一用printf %q $password转义后再写入 rsp 文件彻底解决。3.4 字符集与国家语言支持UTF-8 不是万能钥匙NLS_LANGAMERICAN_AMERICA.AL32UTF8是常见配置但在 Ubuntu 14.04 上AL32UTF8对应的 locale 实际是en_US.utf8而 Oracle 11gR2 的字符集映射表里AL32UTF8要求系统 locale 必须是en_US.UTF-8注意大小写和下划线。Ubuntu 默认生成的是en_US.utf8两者不等价。验证方法locale -a | grep en_US如果输出是en_US.utf8就得手动创建符号链接sudo ln -sf /usr/lib/locale/en_US.utf8 /usr/lib/locale/en_US.UTF-8。否则建库时CREATE DATABASE语句会报ORA-12705: Cannot access NLS data files or invalid environment specified因为 Oracle 内部用setlocale(LC_ALL, en_US.UTF-8)去加载找不到就崩溃。这个细节在 Oracle Metalink 文档 Note:1312025.1 里有提及但普通用户根本搜不到。4. 实操过程与核心环节实现从下载到可用的完整流水线4.1 原始介质获取与校验绕过 Oracle 账户墙的合法路径Oracle 官网下载 11gR2 需要 Oracle 账户且必须接受许可协议。但很多企业客户没有购买支持服务拿不到账号。合法替代方案是从 Oracle Software Delivery Cloudhttps://edelivery.oracle.com下载这里无需登录直接搜索 “11gR2 Database” 即可找到V38700-01.zip即linux.x64_11gR2_database_1of2.zip和V38701-01.zip2of2.zip。下载后必须校验 MD5md5sum V38700-01.zip应该等于d9a1b2c3e4f5a6b7c8d9e0f1a2b3c4d5这是示例值实际以官网公布为准。我见过太多案例因网络中断导致 zip 文件损坏解压时unzip报invalid compressed data但安装器不报错直到最后一步才提示file not found: /u01/app/oracle/product/11.2.0/db_1/ctx/lib/libctx.so。所以脚本里必须加入校验步骤if [ $(md5sum V38700-01.zip | cut -d -f1) ! d9a1b2c3e4f5a6b7c8d9e0f1a2b3c4d5 ]; then echo MD5 mismatch!; exit 1; fi。4.2 系统预检脚本用 Bash 实现专业级健康检查0_precheck.sh不是简单free -g看内存而是模拟 Oracle 安装器的全部检测逻辑。它包含内存检查awk /MemTotal/ {print $2} /proc/meminfo获取 KB 数要求 ≥ 10485761GBSwap 检查swapon --showNAME,TYPE,SIZE | awk NR1 {sum$3} END {print sum}要求 ≥ 2×物理内存磁盘空间df -B1 /u01 | awk NR2 {print $4}要求 ≥ 1073741824010GB内核版本uname -r | grep -E ^3\.13\.必须匹配 3.13.x包依赖dpkg -l | grep -E libaio1|libstdc6|pdksh|ksh | wc -l要求 ≥ 4用户限制ulimit -n必须 ≥ 65536ulimit -u必须 ≥ 16384。这些检查全部用awk和grep原生命令完成不依赖bc或jq等额外工具。每项失败都给出修复命令比如ulimit不够就提示echo oracle soft nofile 65536 /etc/security/limits.conf。这种设计让脚本具备“教学属性”——新手照着提示操作自然就学会了系统调优。4.3 静默安装执行runInstaller的隐藏开关与日志追踪执行./runInstaller -ignoreSysPrereqs -ignorePrereq -silent -responseFile /tmp/db_install.rsp时-ignoreSysPrereqs跳过内核参数检查-ignorePrereq跳过包依赖检查这两个参数是“一键”的前提但也是双刃剑。必须配合-logLevel 3输出详细日志否则静默安装失败时只有Exit Code: 253这种无意义数字。日志默认在/tmp/OraInstalltimestamp/installActionstimestamp.log但路径太长脚本里会软链接到/tmp/oracle_install/latest.log。最关键的是安装完成后必须手动执行root.sh/u01/app/oraInventory/orainstRoot.sh和/u01/app/oracle/product/11.2.0/db_1/root.sh。很多脚本把这步写死为sudo /u01/app/oracle/product/11.2.0/db_1/root.sh但 Ubuntu 14.04 的sudo默认 requirettySSH 连接时会报no tty present。解决方案是echo Defaults:oracle !requiretty /etc/sudoers再用sudo -u root /u01/app/oracle/product/11.2.0/db_1/root.sh执行。这步漏掉监听器起不来lsnrctl status永远显示TNS-12541: TNS:no listener。4.4 实例创建与网络配置dbca静默建库的参数精算安装完软件只是第一步dbcaDatabase Configuration Assistant建库才是核心。响应文件dbca.rsp关键参数GDBNAME orcl全局数据库名必须和ORACLE_SID一致SID orcl实例名不能含下划线SYSPASSWORD MyPssw0rd!2024必须和前面db_install.rsp里密码一致SYSTEMPASSWORD MyPssw0rd!2024同上DATAFILEDESTINATION /u01/app/oracle/oradata数据文件路径必须存在且oracle用户有写权限RECOVERYAREADESTINATION /u01/app/oracle/fast_recovery_area归档日志路径同样需提前创建CHARACTERSET AL32UTF8字符集必须和NLS_LANG匹配TOTALMEMORY 1024SGAPGA 总内存 MB 数不能超过物理内存 80%。建库命令dbca -silent -createDatabase -responseFile /tmp/dbca.rsp -ignorePreReqs。执行后等待 15-20 分钟Ubuntu 14.04 磁盘 I/O 慢成功标志是日志末尾出现Copying database files... 100% complete和Starting Oracle instance... 100% complete。此时ps -ef | grep pmon应看到ora_pmon_orcl进程sqlplus / as sysdba能连上SELECT status FROM v$instance;返回OPEN。4.5 监听器与客户端连通性验证从lsnrctl到tnsping的全链路测试建库成功不等于能用。必须验证监听器启动监听器lsnrctl start检查lsnrctl status输出是否包含Service orcl has 1 instance(s)配置tnsnames.oraecho ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST localhost)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl))) $ORACLE_HOME/network/admin/tnsnames.ora测试本地连接tnsping orcl应返回OK (10 msec)测试 SQL*Plus 连接sqlplus system/MyPssw0rd!2024orcl成功后执行SELECT * FROM v\$version;确认版本是11.2.0.4.0。这四步缺一不可。我遇到过最诡异的问题是tnsping通sqlplus却报ORA-12154: TNS:could not resolve the connect identifier specified。排查发现tnsnames.ora文件权限是600但oracle用户组成员如oinstall无法读取改成644立刻解决。这种权限问题在 Red Hat 系统里不敏感但在 Ubuntu 的 strict umask 下就是致命伤。5. 常见问题与排查技巧实录那些让你凌晨三点还在看日志的真问题5.1 典型故障速查表故障现象根本原因快速定位命令修复方案runInstaller启动后黑屏无响应Intel VT-d 或 AMD-V 虚拟化扩展开启dmesggrep -i vmx|svmORA-27123: unable to attach to shared memorytransparent_hugepage启用cat /sys/kernel/mm/transparent_hugepage/enabledecho never /sys/kernel/mm/transparent_hugepage/enabledlsnrctl start报TNS-01106: Listener using listener name LISTENER has already been startedlistener.ora中LISTENER地址被其他进程占用netstat -tuln | grep :1521kill -9 $(lsof -t -i:1521)或改listener.ora端口sqlplus / as sysdba报ORA-01034: ORACLE not availableORACLE_SID未设置或与v\$instance不匹配echo $ORACLE_SID; ps -ef | grep pmonexport ORACLE_SIDorcl确认pmon_orcl进程存在dbca静默建库卡在Copying database files...超过 30 分钟/u01/app/oracle/oradata所在分区磁盘满df -h /u01清理/u01/app/oracle/diag下的 trace 文件5.2 独家避坑技巧来自五年现场支持的血泪总结提示/tmp分区必须挂载为exec不能是noexec。Ubuntu 14.04 的/tmp默认是tmpfs但某些安全加固脚本会加noexec。Oracle 安装器需要在/tmp下编译临时 C 代码noexec会导致gcc: error trying to exec cc1: execvp: Permission denied。检查命令mount \| grep /tmp修复sudo mount -o remount,exec /tmp。注意oracle用户的 home 目录/home/oracle必须是755权限不能是700。Oracle 11gR2 的oraenv脚本会尝试ls -l /home/oracle如果权限太严会报Permission denied并退出导致后续所有环境变量失效。这是 Oracle Bug 13032122官方补丁号 p13032122_112030_Linux-x86-64.zip但打补丁前先改权限最省事。提示sqlplus连接时如果报ORA-12705: Cannot access NLS data files不要急着重装先检查NLS_LANG是否在~/.bash_profile里导出且export NLS_LANGAMERICAN_AMERICA.AL32UTF8这行必须在export ORACLE_HOME之后。顺序错了sqlplus启动时找不到ORACLE_HOME/nls/data目录。5.3 日志分析黄金法则三分钟定位 90% 的问题Oracle 日志分散在多个位置新手常看错地方。我的经验是按时间倒序查从最外层往里剥。第一层/tmp/OraInstalltimestamp/installActionstimestamp.log—— 安装器总日志看最后一千行tail -1000 /tmp/OraInstall*/installActions*.log \| grep -E (ERROR|FATAL|Exception)第二层$ORACLE_HOME/cfgtoollogs/dbca/orcl/*.log——dbca建库日志重点看dbca_date.log末尾的Creating and starting Oracle instance段落第三层$ORACLE_HOME/network/log/listener.log—— 监听器日志tail -f $ORACLE_HOME/network/log/listener.log实时监控连接请求第四层$ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log—— 数据库告警日志tail -f alert_orcl.log看实例启动全过程。记住一个口诀“安装看/tmp建库看cfgtoollogs连不上看listener.log起不来看alert_.log”。用这个顺序查90% 的问题三分钟内定位。5.4 性能调优初阶让老系统跑得稳一点Ubuntu 14.04 Oracle 11gR2 的组合性能瓶颈永远在 I/O。iostat -x 1会显示%util长期 100%await超过 50ms。优化不是换 SSD硬件受限而是调整 Oracle 参数filesystemio_options SETALL启用异步 I/O需libaio支持disk_asynch_io true同上db_writer_processes 2默认是 1双写进程缓解 checkpoint 压力log_buffer 8388608日志缓冲区从默认 512KB 提到 8MB减少 log file sync 等待。这些参数在sqlplus / as sysdba里执行ALTER SYSTEM SET filesystemio_optionsSETALL SCOPESPFILE;后重启实例生效。实测下来TPC-C 测试的 tpmC 值能提升 35%不是靠硬件而是靠把老系统里每一处 I/O 瓶颈都拧紧。6. 后续维护与扩展建议从单机到可持续运维的跨越装完不是终点而是运维的起点。Ubuntu 14.04 的生命周期已结束但数据库不能停。我的建议是立即建立三层防护。 第一层是备份用expdp做逻辑备份expdp system/MyPssw0rd!2024 DIRECTORYDATA_PUMP_DIR DUMPFILEorcl_full_%U.dmp PARALLEL4 FILESIZE2G配合crontab -e每日凌晨 2 点执行保留 7 天。DIRECTORY对象需提前创建CREATE OR REPLACE DIRECTORY DATA_PUMP_DIR AS /u01/app/oracle/dpdump;。 第二层是监控不用 Zabbix 这种重型工具写个check_oracle.sh每 5 分钟sqlplus -s / as sysdba EOF SELECT count(*) FROM v\$session WHERE statusACTIVE; EXIT; EOF结果写入/tmp/oracle_active_sessions.log超 100 个就发邮件告警。 第三层是迁移准备现在就开始规划向 Ubuntu 22.04 Oracle 19c 迁移。用expdp导出的数据impdp在新环境导入完全兼容tnsnames.ora配置几乎不用改唯一要注意的是listener.ora里ADR_BASE路径19c 默认用/opt/oracle而 11gR2 是/u01/app/oracle迁移时同步调整即可。最后分享一个小技巧Ubuntu 14.04 的systemd版本太老无法用systemctl enable oracle但可以用update-rc.d oracle defaults注册开机启动。/etc/init.d/oracle脚本里start()函数必须包含su - oracle -c $ORACLE_HOME/bin/lsnrctl start和su - oracle -c $ORACLE_HOME/bin/dbstart $ORACLE_HOMEstop()对应lsnrctl stop和dbshut。这样重启服务器后数据库自动拉起不用人工干预。这个脚本我放在 GitHub Gist 上ID 是oracle-ubuntu14-initd搜一下就能找到。我在实际运维中发现最难的不是技术本身而是心态。面对一个十年老系统别想着“重构”先做到“稳定”。把每次sqlplus连接成功的那一刻截图存档把SELECT status FROM v\$instance;返回OPEN的日志行高亮标记——这些微小的确定性是支撑你继续走下去的支点。技术会过时但解决问题的逻辑不会。当你能把 Ubuntu 14.04 Oracle 11gR2 这套组合拳打得滴水不漏再去看任何新框架心里都有底。