Linux部署Oracle 11g R2完整指南:环境准备、静默安装与避坑
简介在Linux上部署Oracle 11gR2常因依赖包缺失、环境配置复杂而让新手却步这份图解文档精准覆盖了安装全过程中的关键环节。资源为单个doc文档压缩包仅1.73MB却以图文对照形式完整呈现了从准备到建库的详细步骤适合边看边操作。文档不仅列出了系统必备的gcc、binutils、kernel-headers、glibc-devel等软件包还指导创建oracle用户与oinstall/dba组并设置ORACLE_HOME、PATH等环境变量安装部分详解了runInstaller启动、分辨率调整、安装类型选择、错误信息忽略原则、Inventory目录指定及系统检查清单。后续也给出了用netca配置监听、用dbca建库时服务名与ORACLE_SID一致、选择UTF-8字符集等实践要点。已有131人学习下载对准备在Linux生产或学习环境中安装Oracle 11gR2的IT人员是节省排查时间的实用参考。1. 为什么在 Linux 上装 Oracle 11g R2 会在第一步就劝退人认清环境再动手很多人以为装 Oracle 和装 MySQL 一样yum 装个包就能跑。真正动手才发现Oracle 11g R2 对操作系统版本、共享内存参数、用户权限、图形环境都极其挑剔。它往往会在依赖检查、图形界面、监听启动、dbca 建库四个阶段各卡一次更难受的是报错信息常常是误导性的比如明明显示缺库文件实际是本地 yum 源没配好明明说内存不足实际是共享内存段太小。这篇笔记把从环境准备到监听和建库的完整过程拆开按步骤给出命令和参数同时把几个高频翻车现场单独列出来。适合要在生产环境部署 11g 的 DBA也适合刚开始接触 Oracle 的运维同学照着完整做完一遍。2. 装前准备先把 Linux 环境调成 Oracle 11g R2 愿意落地的样子安装失败大多发生在我们以为根本不重要的前置环节。Oracle 不像普通应用软件它对内核参数、依赖包、目录权限有一套硬性要求。很多时候不是 Oracle 难装而是我们在系统还没有准备好的时候就点了下一步。2.1 选对操作系统版本和安装包Linux 镜像与 Oracle 11g R2 的匹配Oracle 11g R2 的认证环境里RHEL 6 和 Oracle Linux 6 是最稳的组合。如果只能用 CentOS 7 或 RHEL 7尽量选 11.2.0.4 以上补丁包因为 11.2.0.1 在 7 上存在 glibc 和 systemd 兼容问题。我一般装测试库用 CentOS 6.10装生产库用 RHEL 7.9 加 11.2.0.4能省掉不少莫名其妙的报错。这里说的“Linux 镜像”不是让你去下精简版系统镜像而是建议准备一套和正式环境一致的安装 ISO后面配本地 yum 源、补依赖包时最可靠。检查完系统后还要确认资源情况。Oracle 安装包会解压出 4GB 左右文件数据库创建时又要额外空间所以 /u01 所在分区至少留 10GB。内存建议不低于 2GBswap 按内存的 1.5 倍分配。在动手前先把这些信息记录下来后面排错时会发现这些数据非常有用。# 查看操作系统版本 cat /etc/os-release # 查看内存与swap free -m # 查看 /u01 分区剩余空间 df -h /u01第一条命令确认系统是 64 位以及版本号是否在 Oracle 支持列表里第二条看内存和 swap 是否够用Oracle 11g 在 swap 不足时往往会在建库阶段才报 ORA-04030第三条是给安装目录留底别等到解压中途磁盘写满才来找我。2.2 依赖包补齐一次 yum 搞定还是手工 rpm 硬扛Oracle 11g R2 依赖包众多包括 binutils、compat-libcap1、compat-libstdc-33、gcc、glibc、libaio、make、sysstat、unixODBC 等。最省事的方式是安装 RHEL/CentOS 自带的预安装包。在 CentOS 6/7 的安装介质里有一个包叫 oracle-rdbms-server-11gR2-preinstall装了它之后官方要求的依赖基本都会自动拉起来。# 用本地 Linux 镜像做 yum 源然后安装 preinstall 包 yum install -y oracle-rdbms-server-11gR2-preinstall # 如果源里没有这个包手动补齐常用依赖 yum install -y 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 make sysstat unixODBC unixODBC-devel # 检查关键包是否已就位 rpm -q --queryformat %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n binutils compat-libstdc-33 libaio-devel libXext makepreinstall 包最大的价值不只是拉依赖它会把后面要改的内核参数、资源限制、oracle 用户和组都一并建好。如果它不存在手动安装时要特别留意 compat-libstdc-33这个包在 RHEL 7 的默认源里没有需要到安装镜像的 Packages 或 AppStream 目录里找。最后一条 rpm 命令用于确认 64 位版本在如果报 not installed 就说明之前安装漏了。不要看到“No package”就换源先确认当前源里有没有。2.3 内核参数、用户和目录Oracle 在等一个专门的“钉子户”安装检查会读/etc/sysctl.conf。最常见的要改的是共享内存相关参数、信号量和端口范围。共享内存参数决定了 Oracle 的 SGA 能不能分配出来如果太小安装和建库时都可能触发 ORA-27102 或 ORA-00845。cat /etc/sysctl.conf EOF # 共享内存段的最大字节数建议不小于 SGA 需求这里是物理内存的一半 kernel.shmmax 2147483648 # 所有共享内存段的总页数约等于物理内存页数 kernel.shmall 1048575 kernel.shmmni 4096 # 信号量SEMMSL, SEMMNS, SEMOPM, SEMMNI kernel.sem 250 32000 100 128 # 端口范围监听和 RAC 会用 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 1048576 # 文件句柄与异步 IO fs.file-max 6815744 fs.aio-max-nr 1048576 EOF sysctl -pshmmax 的单位是字节如果你的服务器内存是 8GBshmmax 可以设 4GB 左右shmall 是共享内存页数一般用getconf _PHYS_PAGES的值来填。不要直接照抄网上的数字先结合本机内存做调整。信号量四元组一般保持这个值足够除非你在同一台机器上跑多个实例。资源限制也是必改项。Oracle 数据库同时打开的文件数远高于普通进程默认 1024 不够用。cat /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 10240 EOFnofile 是文件描述符数stack 是进程栈大小。stack 设太小会导致安装器或 oracle 进程直接崩溃且报错完全不指向这里。调整后退出 shell 重新登录用ulimit -n和ulimit -s验证。用户和目录创建是另一个常见坑位。Oracle 要求安装用户和组预先存在最常见的规划是 oinstall 作为 inventory 组dba 作为管理组。groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle id oracle mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01/app chmod -R 775 /u01/apporacle 用户的主组是 oinstall附加组是 dba这样安装目录的权限归属不会乱。目录不要放在 /home 下避免用户配额限制。另外安装前最好把 SELinux 设为 permissive因为 Oracle 11g R2 的二进制在 enforcing 模式下偶尔会触发 avc denial导致数据库起不来。修改/etc/selinux/config中的 SELINUXpermissive。防火墙方面测试环境可以直接关掉 firewalld生产环境放行 1521 端口即可。sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config systemctl stop firewalld systemctl disable firewalld这一步做完再跑一次sysctl -p和id oracle确认参数和用户没问题就可以进入安装包解压阶段了。3. 解压安装包并运行 runInstaller图形界面和静默安装两条路都走通安装包拿到手很多人直接双击 runInstaller 就开始下一步但 11g R2 的安装器有它自己的脾气。明明有图形环境却起不来界面、明明解压了两个 zip 却还是缺文件、root 脚本漏跑导致后面监听起不来这些都发生在这一阶段。3.1 合并解压两个 zip 包细节决定成败把两个 zip 上传到同一个目录例如 /u01/install然后依次解压。这里的关键是两个 zip 必须放进同一个目录解压后才会自动合并成一个 database 目录。如果分开解压到不同目录再手动合并很可能会出现组件缺失。cd /u01/install unzip -q linux_11gR2_database_1of2.zip unzip -q linux_11gR2_database_2of2.zip ls -l database/runInstaller第一个 zip 里的 database 目录已经有基础结构第二个 zip 把剩余组件填进去。解压完成后看到 runInstaller 才算成功。有很多人是只解压了第一个 zip然后安装到一半提示找不到某个组件回去查才发现第二个包没解压。下载时如果做过 md5 校验这一步会非常稳也不会踩到 zip 损坏的问题。3.2 准备响应文件把“下一步请选择……”预先填好图形安装需要 X11 转发或 VNC 桌面。如果你面对的是机房里的无显示服务器响应文件加静默安装才是正确姿势。响应文件像黑匣子每个参数都要知道它是干什么的不能照抄网上模板。安装包自带的响应文件模板在 database/response/db_install.rsp。先复制出来再改保持原模板不变方便出错时对照。cp /u01/install/database/response/db_install.rsp /u01/install/db_install.rsp chown oracle:oinstall /u01/install/db_install.rsp vim /u01/install/db_install.rsp需要修改的关键参数如下oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory SELECTED_LANGUAGESen,zh_CN ORACLE_BASE/u01/app/oracle ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_HOME_NAMEOraDb11g_home1 oracle.install.db.InstallEditionEE oracle.install.db.DBA_GROUPdba oracle.install.db.OPER_GROUPoinstall DECLINE_SECURITY_UPDATEStrue SECURITY_UPDATES_VIA_MYORACLESUPPORTfalseINSTALL_DB_SWONLY表示只装数据库软件建库交给后面的 dbca。这种拆法有个好处软件装失败不会影响后续建库的排错边界避免一条命令里各种错误混在一起。INVENTORY_LOCATION是安装清单目录不要放在 ORACLE_HOME 里面否则以后升级或卸载时会出现 inventory 找不到的情况。DECLINE_SECURITY_UPDATES必须设成 true否则安装器会在配置阶段卡在 My Oracle Support 账号输入这一步就能劝退一半初学者。3.3 运行安装器并执行 root 脚本最关键的两个交互点以 oracle 用户执行静默安装su - oracle cd /u01/install/database ./runInstaller -silent -responseFile /u01/install/db_install.rsp -ignorePrereq-ignorePrereq是跳过预检查。但注意它不是必需的。如果依赖包没补齐先不要加这个参数让安装器把缺的包名打印出来根据报错补包。只有确认环境没问题时才加。强行跳过预检查往往会在安装中途暴露问题那时日志更难读。安装完成后界面会提示以下脚本需要用 root 用户执行su - root /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shorainstRoot.sh 给 inventory 目录写入权限root.sh 会生成 /etc/oratab、设置二进制所有者为 oracle并配置好 dbstart 依赖的文件。执行 root.sh 时一路回车即可默认值都可用。漏跑 root.sh 会导致后面dbstart命令无法识别数据库监听也会出现权限异常。安装日志通常会输出到安装目录下的 cfgtoollogs 里比如$ORACLE_HOME/cfgtoollogs/installContainers。遇到失败时用tail -200看最后一段搜 FATAL 或 Error。这个日志是黑匣子不用从头读抓尾部错误信息足够定位大多数问题。软件装完后检查一下ls $ORACLE_HOME/bin/sqlplus有这个文件说明软件安装基本成功。接下来配置监听和建库。4. 监听与建库netca 和 dbca 的双人舞数据库软件只是骨架监听器和实例才是让业务连上来的关键。很多环境里软件装得好好的结果卡在监听起不来或建库半途失败。这一章把两个工具分开讲清楚。4.1 用 netca 配置监听图形界面和命令行都行监听器负责接收客户端请求并转发给数据库实例。最直观的方式是在 X11 或 VNC 环境里以 oracle 用户执行netca弹出的图形窗口按下面步骤走选择 Listener configuration然后 AddListener name 填 LISTENER协议选 TCP端口填 1521。完成后运行lsnrctl status看到listening on (DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST主机名)(PORT1521)))说明监听已工作。没有图形环境时可以用静默方式$ORACLE_HOME/bin/netca -silent -responseFile $ORACLE_HOME/network/response/netca.rsp这个响应文件是安装目录自带的模板会自动生成一份默认监听配置。执行完后查看$ORACLE_HOME/network/admin/listener.ora确认 HOST 是本机可解析的主机名或 IP。如果模板文件不存在可以直接手工建 listener.ora但用 netca 生成更规范不容易踩格式坑。监听配置完用下面的命令测试lsnrctl status lsnrctl start LISTENER如果 start 时提示端口占用先查一下是不是装了其他应用占了 1521。用netstat -tlnp | grep 1521检查进程。4.2 用 dbca 创建数据库模板选择、字符集和内存分配dbca 是建库工具图形界面信息量很大第一次跑很容易点错。模板建议选 General Purpose而不是 OLTP 或 Data Warehouse因为后两者默认参数更激进。字符集是建库前要想清楚的事一旦建完再改就是血泪史。静默建库命令如下dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -sysPassword Oracle_12345 \ -systemPassword Oracle_12345 \ -characterSet AL32UTF8 \ -nationalCharacterSet UTF8 \ -memoryPercentage 40 \ -storageType FS \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -emConfiguration NONE \ -listeners LISTENER-gdbName是全局数据库名-sid是实例名一般保持一致。-characterSet建议选 AL32UTF8如果以后要迁移老库先确认源库字符集不然后面改字符集几乎等于重建库。-memoryPercentage 40表示把物理内存的 40% 分配给 Oracle 实例设太大可能造成系统 OOM太小共享池容易报 ORA-04031。-emConfiguration NONE表示不创建 Enterprise Manager省掉一堆端口和后台进程。-recoveryAreaDestination是快速恢复区如果磁盘空间不足可以去掉这个参数但建议保留RMAN 备份会用到。建库成功后会返回一段输出包含数据文件和控制文件位置。如果失败日志在$ORACLE_BASE/cfgtoollogs/dbca/orcl下主日志名一般是 trace.log。4.3 设置环境变量和开机自启装完数据库不配这个等于白装oracle 用户的~/.bash_profile要补上数据库相关环境变量否则每次登录后sqlplus都不在 PATH 里。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$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH$ORACLE_HOME/lib EOF source /home/oracle/.bash_profileORACLE_SID 一定要带否则 sqlplus 会尝试连接一个默认不存在的实例报错 ORA-01034。LD_LIBRARY_PATH 缺失时一些工具会报 libclntsh.so 找不到。开机自启依赖 /etc/oratab 文件这个文件在 root.sh 执行时已经生成。把里面orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N最后的 N 改成 Ydbstart 才会处理它。sed -i s/\(^orcl:.*\):N/\1:Y/ /etc/oratabCentOS 6 环境可以沿用 rc.localecho $ORACLE_HOME/bin/dbstart $ORACLE_HOME /etc/rc.d/rc.local echo $ORACLE_HOME/bin/lsnrctl start /etc/rc.d/rc.local chmod x /etc/rc.d/rc.localCentOS 7 上 rc.local 默认不执行更推荐写 systemd 服务cat /etc/systemd/system/oracle11g.service EOF [Unit] DescriptionOracle 11g R2 Afternetwork.target [Service] Useroracle Groupoinstall Typeforking ExecStart/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart /u01/app/oracle/product/11.2.0/dbhome_1 ExecStop/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbshut /u01/app/oracle/product/11.2.0/dbhome_1 RemainAfterExityes [Install] WantedBymulti-user.target EOF systemctl enable oracle11gdbstart 会读取 /etc/oratab 中标为 Y 的条目所以 oratab 必须先改。这个 systemd 服务只是套壳真正逻辑还是 dbstart。测试时可以systemctl start oracle11g然后看监听和实例状态。5. 避坑手册Oracle 11g R2 安装中最常见的 5 个翻车现场下面这些坑都是我在测试和生产环境里帮人排查时真实遇到的。每条按现象、原因、解决三步写方便你对照操作。5.1 现象xhost 之后还是显示 Unable to open display现象终端执行 ./runInstaller安装器立刻退出弹出一句Unable to open display或DISPLAY未设置。原因X11 转发没有启用或 DISPLAY 指向的 IP 不对。解决检查 SSH 登录时是否用了ssh -X如果用的是 VNC则export DISPLAY:1再执行 runInstaller。不要反复xhost 那只是把访问权限放开不会解决转发问题。还要确认/etc/hosts里主机名能正确解析图形界面起不来时先看这个。5.2 现象依赖检查提示缺少 libaio-devel 等yum install 却说找不到包现象预检查报告Package: libaio-devel is missing执行yum install -y libaio-devel又提示没有可用软件包。原因yum 源没配好或对应仓库没有启用。在 CentOS 7 中部分依赖包在默认 BaseOS 里找不到。解决挂载 Linux 镜像配置本地源或用安装光盘里的 Packages 目录手动rpm -ivh libaio-*.rpm libaio-devel-*.rpm。配完源先跑yum repolist输出数字大于 0 才说明源可用。还有 compat-libstdc-33这个包在 RHEL 7 里也必须从光盘里找。5.3 现象lsnrctl status 卡住十几秒现象输入lsnrctl status后停在Connecting to (DESCRIPTION(ADDRESS(PROTOCOLIPC)(KEYEXTPROC1521)))这一行十几秒才返回。原因监听在启动时对主机名做反向解析而/etc/hosts里没有本机主机名条目DNS 查询超时。解决在/etc/hosts加一行127.0.0.1 你的主机名同时检查 listener.ora 里的 HOST 是否用了可解析的主机名。如果监听已经启动这个问题可能只影响 status 命令但数据库连接也可能因此变慢。5.4 现象dbca 建库到一半报 ORA-27102: out of memory现象dbca 进度到 4% 左右直接退出日志里写Linux-x86_64 Error: 12: Cannot allocate memory。原因kernel.shmmax小于 SGA 请求或者 oracle 用户的memlock被限制。解决用sysctl -p确认 shmmax 是否生效shmmax 建议大于物理内存一半在 limits.conf 里加oracle soft memlock unlimited和oracle hard memlock unlimited。调整后必须重新登录才能生效不要只改文件不重新登录。如果还不行用ipcs -lm查看当前最大段大小。5.5 现象启动实例报 ORA-00845: MEMORY_TARGET not supported现象sqlplus / as sysdba执行 startup 时直接报ORA-00845: MEMORY_TARGET not supported on this system提示/dev/shm大小不够。原因Oracle 11g 默认启用自动内存管理AMM它把内存文件映射到/dev/shm而这个目录通常只有物理内存的一半。解决用mount -o remount,size4G /dev/shm临时扩大或写进/etc/fstab永久生效。如果物理内存只有 2G可以调小 memory_target 参数但不建议低于 300MB。改完/dev/shm再df -h /dev/shm确认。6. 安装后的验证命令与关键文件数据库跑没跑起来十分钟内见分晓数据库装完不代表交付完成。我见过太多装完后进程在但监听没起、或者实例 open 但客户端连不上的情况。这里提供一套固定的验证流程十分钟内能判断这套系统是否真的可用。6.1 用一组 Linux 常用命令确认数据库可用# 监听是否在线 lsnrctl status # 实例和数据库状态 sqlplus / as sysdba SQL select instance_name, status from v$instance; SQL select name, open_mode from v$database; SQL quit # 实例进程是否存在 ps -ef | grep smon | grep -v grep如果v$database返回READ WRITE说明数据库已经打开。若实例启动但数据库没有 open可能是上次非正常关闭留下了恢复步骤手动执行alter database open;即可。在最终交付前我建议重启一次实例验证 dbstart 配置是不是真的生效。执行shutdown immediate; startup;完整走一遍比单纯看进程状态可靠得多。6.2 一张表记住关键日志和配置文件的位置文件/路径作用排查时看什么/etc/oratab指定实例与 ORACLE_HOME 的映射决定 dbstart 是否启动实例最后字段是否为 Y$ORACLE_BASE/diag/rdbms/实例名/实例名/trace/alert_$ORACLE_SID.log实例警告日志启动/停止/ORA 错误全在这里搜索 ORA- 和 ORA-600$ORACLE_HOME/network/log/listener.log监听器日志连接被拒绝时看搜索 TNS-$ORACLE_HOME/network/admin/listener.ora监听配置文件HOST/PORT 是否与 netstat 一致$ORACLE_HOME/network/admin/tnsnames.ora客户端连接字符串配置SERVICE_NAME 与 dbca 建库时是否一致这几条路径不需要刻意背但要知道它们在哪。遇到问题先看对应日志而不是反复重启。比如客户端连不上先看 listener.log再看 alert 日志基本能定位是网络层还是数据库层的问题。我装完一套 Oracle 11g R2 的保留习惯是先lsnrctl status再sqlplus查 v$instance 和 v$database最后tail -50看一眼 alert 日志三个全绿才认为这台机器交付。这个习惯帮我躲过了好几次“进程活着但监听没起来”的情况。把这一套验证流程固定下来后面再遇到类似环境你会发现自己越来越能分清楚哪些报错值得追查哪些只是噪音。希望帮到你。本文还有配套的精品资源点击获取