ARTICLE DETAIL

资讯详情

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

Oracle 11g R2 Linux静默安装实战:系统配置与排错指南

Oracle 11g R2 Linux静默安装实战:系统配置与排错指南 装过 Oracle 11g 在 Linux 上的人估计都懂那味儿——它不像装个 Nginx一条 yum 命令就完事。你要先建用户、配内核参数、装一堆依赖再小心翼翼地执行安装向导中途还随时可能因为某个 rpm 缺失或者 shmmax 配错直接甩给你一个不明觉厉的报错。网上教程确实多但很多是互相搬运的要么安装包链接早失效要么参数含义讲不清楚照着抄都容易翻车。这篇文章我就以 Linux x86_64 为例CentOS 6/7、RHEL 6/7、Oracle Linux 6/7 都可以照着走把 Oracle 11g R2 从安装包获取、系统层准备、静默安装、root 脚本执行到常见报错处理的全过程完整写出来标题里说的“其他问题注解”也一并聊透。全程命令偏多但每个关键步骤我都会解释为什么这么做而不是让你无脑复制。适合刚接触 Linux 下 Oracle 的运维、准备给老项目补环境的开发以及已经被 Oracle 安装折磨过一回还想再试一次的人。Ok思路理清我们逐步来。1. 动手前先想清楚版本、安装包与整体路线1.1 Oracle 11g 版本差异为什么强烈建议用 11.2.0.4Oracle 11g R2 常见的有两个大版本11.2.0.1首发版本和 11.2.0.4最终补丁集版本。很多网盘里流传的“经典安装包”拿过来一看是 11.2.0.1在比较老的 RHEL/CentOS 6 上问题不大但放到 CentOS 7内核 3.10glibc 2.17这一代系统上11.2.0.1 在链接阶段经常报一堆 makefile 错误比如 “Error in invoking target agent nmhs of makefile”、ins_ctx.mk报错等。你要么打补丁要么用 sed 去改它的 mk 文件折腾下来一个人能卡一下午。11.2.0.4 虽然也要装依赖但明显省心很多。我的建议很直白能上 11.2.0.4 就不要用 11.2.0.1。另外提醒一句11g 已经过了官方扩展支持期如果你是全新项目我建议认真评估更新版本但存量系统里 11g 依然占很大比例学会装它是这个行业绕不开的基本功。1.2 安装包从哪里拿官方渠道、文件名与大小按标题要求先解决安装包来源。我的建议是直接走 Oracle 官方渠道Oracle Software Delivery Cloudedelivery.oracle.com可以按产品下载OTN 的 Archive 页面也保留了历史版本。搜索 Oracle Database 11gR2平台选 Linux x86-64你会看到两个必须下载的 zip 文件文件名大小说明linux.x64_11gR2_database_1of2.zip约 1.2GB安装包第一部分linux.x64_11gR2_database_2of2.zip约 1.2GB安装包第二部分两个文件缺一不可解压后合并到同一个database目录。下载需要注册 Oracle 账号免费别嫌麻烦。我强烈不建议去第三方网盘拿“精简版”“一键版”一是文件不完整解压到一半报 CRC 错很常见二是来源不明的东西装在服务器上等于给自己埋雷。下完之后可以用md5sum校验一下文件完整性如果你能找到官方校验值务必对一对。1.3 图形界面还是静默安装根据环境选路线Oracle 11g 安装有两条主流路线OUI 图形向导和响应文件response file静默安装。如果你的本机有完整桌面环境或者通过 X11 转发比如 ssh -X、Xmanager能看到图形界面新手用图形向导会更直观打开runInstaller一步步点就行这个没什么好展开的。真正的分水岭在远程服务器没有桌面、ssh 又不方便转发图形时你必须走静默安装。本文以静默安装为主线因为这条路线最通用、最能暴露问题而且写脚本批量部署时也用得上。2. Linux 系统层准备这一步省了后面全是坑2.1 创建用户、组与目录规划Oracle 官方推荐的用户组结构有三个oinstall组管理 Inventory 目录必须作为 oracle 用户的主组dba组拥有 SYSDBA 管理权限oper组拥有 SYSOPER 操作员权限。创建命令如下groupadd oinstall groupadd dba groupadd oper useradd -g oinstall -G dba,oper oracle echo Oracle12345 | passwd --stdin oracle为什么oinstall必须是主组因为 OUI 安装时会把 Inventory 目录和文件权限绑定到这个组主组不对后面很容易出现 “insufficient privileges” 一类的问题。目录规划我习惯用 Oracle 的 OFAOptimal Flexible Architecture标准mkdir -p /u01/app/oracle mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01/app生产环境注意把/u01建在空间足够的磁盘上Oracle 软件目录本身大概要 3~5GB数据库数据文件另算千万别把/根分区撑爆。2.2 内核参数与资源限制一个都不能少Oracle 在 Linux 上依赖共享内存、信号量和网络端口这些内核参数不调后面几乎必然报错。这是我常年在用的/etc/sysctl.conf配置fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 2097152 kernel.shmmax 2147483648 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 1048576几个容易搞混的参数我说清楚kernel.shmmax是单个共享内存段的最大字节数官方文档建议取物理内存的一半。比如 4GB 内存就配 2147483648。kernel.shmall是共享内存页的总数一般按shmmax / 页面大小算Linux 默认页面大小 4KB所以 2GB 的 shmmax 对应 524288 个页我给的 2097152 是给 8GB 左右内存留的余量。kernel.sem四个值依次是semmsl每个信号量集合最大信号量数、semmns系统总信号量数、semopm每次操作的最大信号量数、semmni信号量集合总数。Oracle 并发进程多默认值不够就会报“unable to create semaphores”。改完记得sysctl -p重载并用/sbin/sysctl -a | grep kernel.shmmax确认生效。然后是资源限制在/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是栈大小。改完用 oracle 用户重新登录执行ulimit -n、ulimit -u验证如果没生效检查一下/etc/security/limits.d/下有没有覆盖配置。提示在 CentOS 7 里20-nproc.conf可能会限制普通用户的进程数如果 oracle 用户ulimit -u没达到 16384去确认那个文件里的配置。2.3 依赖包安装别在缺一个 rpm 上浪费时间Oracle 官方文档列的依赖包很长但实际部署时我把它们精简成一条 yum 命令yum install -y binutils compat-libcap1 compat-libstdc-33 gcc gcc-c \ glibc glibc-devel libaio libaio-devel libgcc libstdc libstdc-devel \ libXext libXtst libX11 libXau libXi make sysstat unixODBC unixODBC-devel几个重点说明libaio和libaio-devel是 Oracle 在 Linux 上做异步 IO 的底层依赖漏了会在安装最后阶段报经典错误这个包我每次都会重点核对。gcc、make是编译链接用的连静默安装最后也会调用 make不能省。Oracle 安装脚本是用 ksh 写的CentOS 7 默认不带pdksh装ksh就行。预检查脚本如果对 pdksh 标红基本可以忽略。compat-libstdc-33在 CentOS 7 默认源里没有可以从 CentOS 6 的 rpm 包手动安装11.2.0.4 在多数场景不装也能过遇到编译错误再补。如果你打算用图形界面还要装xorg-x11-utils和xterm不然 xhost、DISPLAY 相关的操作很难跑顺。2.4 关闭 SELinux 与 hosts 一致性检查SELinux 开启状态下监听器端口绑定和 Oracle 文件读写可能出现诡异失败测试环境我建议直接关闭setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config生产环境如果安全要求高可以按 Oracle 的 SELinux 策略去放行但说实话多数公司图省事都关掉了。另一个容易忽略的是 hosts 一致性。Oracle 安装时会把主机名解析写进listener.ora和 EM 配置所以在/etc/hosts里必须有主机名对应的静态 IP 条目192.168.1.100 db01用hostname确认当前主机名确保它和/etc/hosts里的条目一致。我见过有人主机名是localhost.localdomain结果监听服务一直绑定到错误地址折腾很久才发现是 hosts 的问题。3. 核心安装流程解压、静默安装、root 脚本与建库3.1 解压安装包两个 zip 要合并别漏文件mkdir -p /u01/software cd /u01/software unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip ls database/两个 zip 解压后会自动合并到同一个database目录注意顺序是先解 1 再解 2。解压完成后目录下应有runInstaller、install、stage、response等文件。如果系统没有 unzip先yum install -y unzip。这里插一个题外话日常解压 Windows 传过来的 zip 时中文文件名经常乱码那是 zip 内部编码是 GBK 而 Linux 默认按 UTF-8 解导致的。解决办法是用unzip -O CP936 xxx.zipOracle 安装包本身是英文名不会乱但这个技巧你迟早用得上。还有个细节解压完最好chown -R oracle:oinstall /u01/software/database免得 oracle 用户读不了某些文件。3.2 编写响应文件并执行静默安装响应文件模板在database/response/db_install.rsp我习惯先复制到 oracle 用户目录再改cp /u01/software/database/response/db_install.rsp /home/oracle/db_install.rsp chown oracle:oinstall /home/oracle/db_install.rsp下面是能直接跑的最小参数集重点是理解每一项的含义oracle.install.optionINSTALL_DB_SWONLY ORACLE_HOSTNAMEdb01 UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory SELECTED_LANGUAGESen,zh_CN 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_GROUPdba oracle.install.db.BACKUPDBA_GROUPdba oracle.install.db.DGDBA_GROUPdba oracle.install.db.KMDBA_GROUPdba DECLINE_SECURITY_UPDATEStrue几个关键点oracle.install.optionINSTALL_DB_SWONLY表示只装数据库软件、不建库这样便于把安装和建库分开排错后续用 DBCA 单独建库。ORACLE_HOME不能和ORACLE_BASE重叠这是我踩过坑的地方。DECLINE_SECURITY_UPDATEStrue必须设置因为没配置 My Oracle Support 账号如果为 false安装器会卡在检查更新那一步。如果你需要安装过程中顺便建库可以把oracle.install.option改成INSTALL_DB_AND_CONFIG并补上建库参数但分步走更稳妥。接着用 oracle 用户执行su - oracle cd /u01/software/database ./runInstaller -silent -responseFile /home/oracle/db_install.rsp参数含义-silent表示静默模式-responseFile指定响应文件。如果预检查报的是非致命错误可以加-ignorePrereq跳过但我不建议无脑加最好先看清日志里到底缺什么。安装日志在tail -f /u01/app/oraInventory/logs/installActions*.log看到日志末尾出现类似 “Successfully Setup Software” 的字样才算成功。如果中途失败不要急着重跑先把日志里含 ERROR 的行翻出来八成能定位到问题。3.3 以 root 执行配置脚本别跳过这一步静默安装结束后终端会提示你以 root 执行两个脚本/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shorainstRoot.sh负责修改 Inventory 目录的属主和权限root.sh会写/etc/oratab、设置dbhome目录权限并询问是否把本地库加入启动列表测试环境可以回答 N以后想改再改/etc/oratab。这两个脚本必须执行成功否则后面netca、dbca很可能报权限错误或者找不到 Inventory。3.4 netca 配置监听与 dbca 建库软件装完先配监听。11g 的监听工具是 netca静默方式执行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 netca /silent /responsefile $ORACLE_HOME/network/response/netca.rsp lsnrctl statusnetca 跑完会自动启动 listener并生成listener.ora和sqlnet.ora。接下来建库用 dbca 静默模式dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl \ -sid orcl \ -characterSet AL32UTF8 \ -memoryPercentage 30 \ -emConfiguration NONE \ -sysPassword Oracle12345 \ -systemPassword Oracle12345参数逻辑-templateName指定建库模板General_Purpose.dbc是通用模板-gdbname是全局库名-sid是实例名-characterSet决定数据库字符集UTF8 比较通用但如果老系统全是 GBK 数据选 ZHS16GBK 更符合现状-memoryPercentage 30表示把物理内存的 30% 交给 Oracle 自动内存管理-emConfiguration NONE不配 EM省去一堆端口和账号问题。建库时间取决于机器性能通常 10~20 分钟日志在$ORACLE_BASE/cfgtoollogs/dbca/。完成后数据库会自动启动监听里也能看到 orcl 服务注册上。4. 高频报错与排错实录含速查表4.1 ORA-00845MEMORY_TARGET not supported on this system这个报错在虚拟机里特别常见。原因是 11g 的自动内存管理AMM不是直接 malloc 内存而是把内存映射到/dev/shmtmpfs如果/dev/shm比memory_target参数还小启动实例就会报错。处理办法有两个调大/dev/shmmount -o remount,size4G /dev/shm并同步写进/etc/fstab防止重启失效。调小memory_targetalter system set memory_target1G scopespfile;然后重启。我的排查习惯是先用df -h /dev/shm看大小再show parameter memory_target对比一查一个准。4.2 ORA-27125 与信号量相关错误现象是启动时报ORA-27125: unable to create shared memory segment。绝大多数原因是shmmax或shmall配置太小、或者sysctl -p之后没真正重载。先cat /proc/sys/kernel/shmmax核对再确认shmmax大于 SGA 需求。如果系统开了 HugePages而 Oracle 又没同步用大页两边配置对不上也会出问题这时候可以在 pfile 里加use_large_pagesFALSE临时绕过。并发高的环境还会出现 “unable to create semaphores” 一类的信号量报错ipcs -l看一眼当前信号量上限把kernel.sem改成250 32000 100 128重载即可。4.3 图形界面起不来DISPLAY、X11 转发与中文乱码如果坚持用图形界面安装最常碰到两个问题。一是 “No protocol specified” 或者 “cannot open display”原因是 OUI 是 Java 写的需要 X11 协议显示远程操作时 DISPLAY 变量没设对或者发起端没授权。处理方式在有桌面的机器上执行xhost 或xhost 目标IP。在服务器上export DISPLAY192.168.1.50:0.0后启动runInstaller。用 X11 转发时确保 ssh 开启X11Forwarding例如ssh -X oracledb01并安装xorg-x11-utils、xterm、中文字体。二是安装界面中文乱码或者显示方块这是 locale 或字体问题直接export LANGen_US.UTF-8再启动 OUI 就行。远程部署时我一般直接走静默安装不跟 DISPLAY 纠缠。4.4 11.2.0.1 在 CentOS 7 上的 makefile 报错如果你用的是 11.2.0.1安装到百分之八十几突然报 “Error in invoking target agent nmhs of makefile”或者ins_ctx.mk的报错这都是新工具链下链接参数不匹配造成的。历史经验里有两个常用招数首先是agent nmhs备份后修改$ORACLE_HOME/sysman/lib/ins_emagent.mk给链接行补上-lnnz11cp $ORACLE_HOME/sysman/lib/ins_emagent.mk $ORACLE_HOME/sysman/lib/ins_emagent.mk.bak sed -i s/^\(agent nmhs\)\: \(.*\)/\1: \2 -lnnz11 ${ORACLE_HOME}\/lib\/libnnz11.so/g $ORACLE_HOME/sysman/lib/ins_emagent.mk然后是ins_ctx.mkcp $ORACLE_HOME/ctx/lib/ins_ctx.mk $ORACLE_HOME/ctx/lib/ins_ctx.mk.bak sed -i s/^\(ctx: \)\(.*\)/\1 -lsnls11 \2/ $ORACLE_HOME/ctx/lib/ins_ctx.mk改完可以从报错那一步继续或者重跑安装器。但我的核心建议仍然是换成 11.2.0.4从源头避免这些问题。如果 11.2.0.4 还报编译错误先回头核对依赖包尤其是libaio-devel、gcc-c、compat-libcap1是否真装上了。4.5 监听和实例起不来TNS 与 ORA-01034监听相关的报错有两个高频面孔TNS-12545 connect failed because target host or object does not exist多半是/etc/hosts里主机名映射缺失或者listener.ora的 HOST 写了一个解析不了的地址。先补 hosts再用tnsping orcl验证。ORA-12514 TNS listener does not currently know of service监听起来了但库里服务没注册。先确认实例已经startup再lsnrctl status看有没有 orcl如果没有手工注册一下alter system register;并确认local_listener参数指向正确的端口。至于ORA-01034: ORACLE not available第一步永远是翻 alert 日志。11g 的路径是$ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log大多数“为什么起不来”的答案都在那里。另外确认你是用 oracle 用户执行 sqlplus而不是 root用 root 连 sqlplus 大概率会碰权限错误。4.6 其他问题注解权限、字符集与内存配置把标题里“其他问题注解”这部分零散知识归拢一下oracle 用户能登录但sqlplus / as sysdba提示 insufficient privileges用id oracle确认它在 dba 组修改组后要重新登录才能生效SELinux 开启时也要排查。字符集不匹配导致中文乱码服务端数据库字符集和客户端NLS_LANG必须一致。安装时选AL32UTF8客户端就配NLS_LANGAMERICAN_AMERICA.AL32UTF8不要凭感觉乱写。ORA-12705: Cannot access NLS data files通常是ORACLE_HOME没配对或者NLS_LANG写错先echo $ORACLE_HOME、echo $NLS_LANG排查。SGA/PGA 调参11g 建议用memory_target主控在memory_target /dev/shm的前提下PGA 留总量 20% 左右。改参数用 spfile改完 shutdown 再 startup。不要用 AMM 时还把sga_max_size和pga_aggregate_target各自顶满否则会互相挤掉。4.7 问题排查速查表把前面提到的典型问题整理成一张表现场排查时可以快速对照报错或现象常见原因处理思路ORA-00845 MEMORY_TARGET not supported/dev/shm 小于 memory_target调大 /dev/shm 或调小 memory_targetORA-27125 unable to create shared memory segmentshmmax/shmall 没配够或没生效sysctl -p 重载并核对实际值无法创建信号量kernel.sem 默认值不足改 kernel.sem 250 32000 100 128No protocol specified / cannot open displayDISPLAY 未授权或设置错误xhost export DISPLAY装 xorg-x11-utils安装界面中文乱码locale 或字体问题export LANGen_US.UTF-8 重新启动 OUIagent nmhs / ins_ctx.mk 编译错误11.2.0.1 与新工具链不兼容改 ins_emagent.mk / ins_ctx.mk或换 11.2.0.4TNS-12545 目标主机不存在/etc/hosts 主机名映射缺失补 hoststnsping 验证ORA-12514 服务不识别监听器未拿到服务注册startup 后 alter system registerORA-01034 ORACLE not available实例未启动或参数文件问题先看 alert_orcl.logORA-12705 NLS 数据文件不可访问ORACLE_HOME 或 NLS_LANG 错误核对环境变量sqlplus 登录提示权限不足用户组或 SELinux 问题确认 dba 组检查 getenforce5. 安装收尾环境变量、启动验证与运维小习惯5.1 配置 oracle 用户环境变量装完软件、建完库最后一个关键动作是写环境变量。编辑/home/oracle/.bash_profileexport 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:${LD_LIBRARY_PATH:-} export NLS_LANGAMERICAN_AMERICA.AL32UTF8逐个解释ORACLE_BASE是数据库安装基础目录ORACLE_HOME指向软件实例目录ORACLE_SID指定默认实例名PATH把 sqlplus、lsnrctl、dbca 等工具加进来LD_LIBRARY_PATH保证运行库能找到NLS_LANG决定客户端默认字符集。改完执行source ~/.bash_profile再echo $ORACLE_HOME验证一下。5.2 数据库与监听的手动启动验证就算 dbca 建库时已经自动启动我也习惯手动走一遍完整启动链路确保对每个环节都有把握sqlplus / as sysdba SQL startup如果实例已经启动会看到 “ORACLE instance started” 和 “Database opened”。然后验证监听和进程lsnrctl status netstat -tlnp | grep 1521 ps -ef | grep ora_ | grep orcl正常的数据库后台进程至少会有 pmon、smon、ckpt、dbw0、lgwr 等。最后再跑一条select name, open_mode from v$database;确认open_mode是READ WRITE到此安装流程才算真正闭环。5.3 几个值得收藏的运维小习惯装完第一时间把 response 文件、sysctl.conf、limits.conf 原始版本归档下次同型号机器直接复用能省大量时间。虚拟机里安装之前一定拍快照。装坏了回滚重来比在坏一半的环境上反复修要高效得多。遇到问题先看日志installActions 日志、alert 日志、listener.log这三样能解决八成问题。11g 比较老了官方下载入口和补丁获取渠道都在收紧建议把常用安装包归档到公司内部存储别等要用的时候发现链接全失效。最后说个我自己的习惯每台库我都会在/u01/software放一个INSTALL_NOTE.txt把安装版本、响应参数、字符集、root 脚本执行时间、踩过的坑都记下来。半年后要扩容或复盘的时候翻一下就全想起来了比翻聊天记录靠谱太多。这个习惯我从 11g 一直带到了后面的版本建议你也试试。
返回列表