ARTICLE DETAIL

资讯详情

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

Oracle 11.2.0.4静默安装:CentOS批量部署脚本实战指南

Oracle 11.2.0.4静默安装:CentOS批量部署脚本实战指南 我一直觉得衡量一个DBA是不是真把Linux环境玩明白了别看他会不会装Oracle得看他能不能在一个小时里用一行命令把Oracle装完。尤其是Oracle 11.2.0.4这种老而弥坚的版本图形化安装的流程其实谁都会点next、填密码、等进度条。但当你面对二十台配置一样的CentOS裸机每一台都要装成同样的Database再一台台点鼠标就是给自己找罪受。静默安装的意义不是省那点鼠标点击而是把安装过程变成可复现、可版本管理、可交给其他人执行的脚本资产。这篇文章记录的就是我在CentOS上把Oracle 11.2.0.4静默安装脚本从零写到能批量复用的完整过程包含响应文件参数、安装命令、建库命令和一路踩过的坑适合需要在多台机器上部署Oracle或写自动化脚本的读者参考。1. 先把场景讲清楚11.2.0.4、CentOS 与“静默安装”这件事1.1 为什么都到新版本满天飞的时候还要用11.2.0.4Oracle 11.2.0.4是11gR2的最后一个Patch Set2013年发布官方Extended Support虽然早就到期但国内金融、制造、通信这几个行业里存量系统跑11g的比例依然相当高。很多核心业务系统只在11.2.0.4上做过完整认证应用厂商的兼容性矩阵里写的就是这个版本你上来就建议客户换19c人家听完只会礼貌性地笑笑。我的实际经验是凡是遇到“新装一套和现有生产环境完全一致”的需求版本十有八九就是11.2.0.4。CentOS作为RHEL的二进制兼容发行版是大量测试环境和准生产环境的首选。虽然红帽后来改变策略CentOS 7之后没有延续传统意义上的后继版本但存量服务器上CentOS 6和CentOS 7的数量仍然巨大Oracle 11.2.0.4在这两个版本上的部署案例非常成熟。这不是一个“追新”的选题而是一个“把存量运维做扎实”的选题。1.2 静默安装和图形化安装差在哪图形化安装的本质是OUIOracle Universal Installer根据鼠标点击生成一套安装参数静默安装则是绕开界面直接把同样的参数用responseFile喂给OUI。runInstaller支持-silent参数配合一个写好的.rsp文件就能在没有X11、没有图形桌面的纯命令行服务器上完成整套安装。对批量交付来说图形化安装有两个致命问题。第一是不可重现都说谁点都一样但实际上没人能保证二十台机器点出完全相同的选项哪怕漏选一个语言包装出来的环境就有差异。第二是不可审计装完之后你很难说清楚这台机器到底选了哪些复选框出了问题只能靠回忆。响应文件是纯文本扔进Git里就是版本历史两个环境一比diff所有差异一目了然。这是静默安装最值钱的地方。1.3 这篇文章覆盖到哪一步我从一台干净的CentOS开始讲到数据库能正常startup结束。中间的完整链条包括操作系统内核参数、用户组与目录规划、依赖包、响应文件编写、静默软件安装、监听器配置、静默建库以及安装失败时的日志排查思路。我默认你手上已经有Oracle 11.2.0.4的官方安装介质通常是一大一小两个zip脚本只负责把介质装好不涉及介质从哪里获取的问题。2. 地基工程内核参数、依赖包与目录权限一个都不能省2.1 内核参数共享内存和信号量是硬门槛Oracle对Linux内核参数的讲究程度在全行业的应用软件里排得上号。11.2.0.4官方文档针对x86-64平台给出了明确建议值我直接把这些值写进脚本安装前统一生效。参数建议值作用kernel.shmmax4398046511104单个共享内存段的最大字节数kernel.shmall1073741824系统总共享内存页数按4KB页计kernel.shmmni4096共享内存段数量上限kernel.sem250 32000 100 128信号量四元组fs.file-max6815744系统级文件句柄上限fs.aio-max-nr1048576异步IO请求上限net.ipv4.ip_local_port_range9000 65500本地可用端口范围net.core.rmem_default262144接收缓冲区默认值net.core.rmem_max4194304接收缓冲区最大值net.core.wmem_default262144发送缓冲区默认值net.core.wmem_max1048576发送缓冲区最大值kernel.shmmax定义单个共享内存段上限设成4398046511104即4TB不是说你机器真有4TB内存而是为了保证Oracle的SGA能一次性落在一个独立共享段里避免出现ORA-27102。kernel.shmall是系统总共可用的共享内存页数按4KB页面换算这个值允许的总量在4TB级别对绝大多数生产服务器都够用。kernel.sem四个数字容易被新人忽略依次是semmsl每个信号量集合最大信号量数、semmns系统最大信号量数、semopm每次semop调用最多操作数、semmni信号量集合数上限。Oracle要求的是250/32000/100/128这四个值几乎是固定答案装12c、19c的时候我也沿用这套。2.2 用户、组与资源限制Oracle不能直接用root装这是安装的第一条规矩。脚本里先把oinstall和dba两个组建好再创建oracle用户并加入两个组groupadd -f oinstall groupadd -f dba id oracle /dev/null 21 || useradd -g oinstall -G dba oracle echo oracle | passwd --stdin oracle/etc/security/limits.conf方面要给oracle用户设好三组值oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768这里有一个很容易翻车的细节CentOS 6的会话默认加载pam_limitsCentOS 7的SSH登录也同样生效但如果你的应用是通过systemd直接拉起Oracle进程systemd unit文件里的LimitNOFILE之类参数会覆盖limits.conf必须在service文件里单独声明。我们批量部署时曾遇到过一台机器上监听经常报“无法打开更多文件”查了半天就是systemd没配nofile。2.3 依赖包64位和32位一个都不能少Oracle 11.2.0.4在x86-64平台上安装时仍然会用到一批32位兼容库比如连接工具和OUI的辅助组件。缺了这些图形安装会弹窗提示但静默安装没有弹窗只是把Package compat-libstdc-33-3.2.3 is missing这种提示写进日志新手很容易忽略等装完sqlplus起不来才回头找原因。我习惯在脚本里统一执行yum -y install binutils compat-libcap1 compat-libstdc-33 \ compat-libstdc-33.i686 gcc gcc-c glibc glibc.i686 \ glibc-devel ksh libaio libaio.i686 libaio-devel libgcc \ libgcc.i686 libstdc libstdc.i686 libstdc-devel \ libXext libXtst make sysstat unixODBC unixODBC-devel \ unixODBC.i686 elfutils-libelf elfutils-libelf-devel \ libXp libXau libXi需要特别说明的是CentOS 7的默认源里没有compat-libstdc-33要先把EPEL源配好或者离线准备好rpm包再写进脚本。CentOS 6则简单很多base源里基本都有。如果安装日志里出现某个包找不到不要急着换名字乱装先确认EPEL是否启用。2.4 目录规划ORACLE_BASE、oraInventory和介质目录我习惯把Oracle的家底都放在/u01下面而不是用默认的/home/oraclemkdir -p /u01/app/oracle mkdir -p /u01/app/oraInventory mkdir -p /u01/software chown -R oracle:oinstall /u01 chmod -R 775 /u01这样安排有三个理由。一是数据盘通常单独挂载到/u01避免根分区被Oracle软件、数据文件撑爆二是Oracle软件安装完成后属主和权限要锁定/u01独立挂载点更好管理权限边界三是/u01/app/oraInventory这个中央库存目录的位置会写入/etc/oraInst.loc后续每次打补丁、加组件都要读这个文件路径一旦在安装时写错后面全是坑。3. 核心是响应文件db_install.rsp 每个关键参数为什么这么写3.1 必改参数清单静默安装的响应文件从$MEDIA/database/response/db_install.rsp模板改出来但模板里的参数有一大半是注释掉的直接套用很容易翻车。我整理了一份最小可用集逐项说清楚参数作用实战备注oracle.install.responseFileVersion响应文件格式版本必须写成/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0沿用旧版本号会报invalidoracle.install.option安装类型INSTALL_DB_SWONLY只装软件INSTALL_DB_AND_CONFIG装软件并建库ORACLE_HOSTNAME主机名要和/etc/hosts解析一致我直接用$(hostname -f)动态生成UNIX_GROUP_NAME安装组oinstallINVENTORY_LOCATION中央库存目录/u01/app/oraInventorySELECTED_LANGUAGES语言包en,zh_CN按需增加ORACLE_HOME软件安装目录路径里别有空格ORACLE_BASE基础目录必须与ORACLE_HOME保持从属关系oracle.install.db.InstallEdition数据库版本EE企业版SE对应标准版oracle.install.db.DBA_GROUPDBA组dbaoracle.install.db.OPER_GROUP操作员组dbaDECLINE_SECURITY_UPDATES是否跳过安全更新设成true否则会联网检查3.2 为什么我坚持用INSTALL_DB_SWONLY批量部署场景下我强烈建议第一次安装只装数据库软件也就是INSTALL_DB_SWONLY建库放到另一个阶段用dbca单独做。原因有三个。一个ORACLE_HOME可以给多个实例复用。先装好软件再按需逐个建库流程更清晰也符合“软件和实例分离”的运维习惯。第二建库要指定SID、字符集和内存比例不同机器如果SID不一样单独写dbca命令比在一个rsp文件里塞一堆条件字段好维护得多。第三模板里的starterdb参数组很长如果选INSTALL_DB_AND_CONFIG那些password.ALL之类的字段一个没填对就全校验失败只装软件的话这些字段全部不需要响应文件干净利落出问题概率低一个量级。3.3 安全更新、代理和主机名相关的坑DECLINE_SECURITY_UPDATES必须设成true。如果你留空或者设成falseOUI在静默模式下会尝试连接My Oracle Support检查安全更新没有外网的环境会卡在联网步骤报Unable to connect。类似地不要给PROXY_HOST、PROXY_PORT留下任何值内网环境你写的代理地址几乎必然是无效的。ORACLE_HOSTNAME也是踩过坑的地方。安装机的hostname如果和/etc/hosts解析结果对不上OUI会报Invalid hostname。我后来的做法是在脚本里用$(hostname -f)动态生成主机名写进rsp而不是在文档里硬编码一个名字这样同一份脚本拿到任何机器上都能自动适配。4. 一键脚本实现从解压介质到 root.sh 收尾4.1 脚本的总体逻辑整个脚本可以拆成十二条主流程操作系统检查、创建用户组、规划目录、写入内核参数、写入资源限制、安装依赖包、设置oracle用户环境变量、解压介质、生成响应文件、执行runInstaller、等待安装完成、执行root脚本。每条流程之间保持明确的日志输出这样哪一步挂了看控制台就能定位。4.2 完整脚本这是我实际在用的简化版本去掉服务器名字和路径等敏感信息后的核心结构#!/bin/bash # Oracle 11.2.0.4 静默安装脚本 # 目标系统: CentOS 6/7 x86_64 # 运行条件: root 用户执行 # 介质: p13390677_112040_Linux-x86-64_1of7.zip / 2of7.zip set -x LOG_DIR/root/oracle_install_logs mkdir -p $LOG_DIR # ---------- 1. 操作系统检查 ---------- if [ ! -f /etc/redhat-release ]; then echo 仅支持 CentOS/RHEL 系系统 exit 1 fi cat /etc/redhat-release # ---------- 2. 创建用户和组 ---------- groupadd -f oinstall groupadd -f dba id oracle /dev/null 21 || useradd -g oinstall -G dba oracle echo oracle | passwd --stdin oracle # ---------- 3. 目录规划 ---------- mkdir -p /u01/app/oracle /u01/app/oraInventory /u01/software chown -R oracle:oinstall /u01 chmod -R 775 /u01 # ---------- 4. 内核参数 ---------- cat /etc/sysctl.conf EOF kernel.shmmax 4398046511104 kernel.shmall 1073741824 kernel.shmmni 4096 fs.file-max 6815744 fs.aio-max-nr 1048576 kernel.semmsl 250 kernel.semmns 32000 kernel.semopm 100 kernel.semmni 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 EOF sysctl -p /dev/null # ---------- 5. 资源限制 ---------- 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 32768 EOF # ---------- 6. 依赖包 ---------- yum -y install binutils compat-libcap1 compat-libstdc-33 \ compat-libstdc-33.i686 gcc gcc-c glibc glibc.i686 \ glibc-devel ksh libaio libaio.i686 libaio-devel libgcc \ libgcc.i686 libstdc libstdc.i686 libstdc-devel \ libXext libXtst make sysstat unixODBC unixODBC-devel \ unixODBC.i686 elfutils-libelf elfutils-libelf-devel \ libXp libXau libXi # ---------- 7. oracle 用户环境变量 ---------- 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:$LD_LIBRARY_PATH umask 022 EOF # ---------- 8. 解压安装介质 ---------- cd /u01/software unzip -q p13390677_112040_Linux-x86-64_1of7.zip unzip -q p13390677_112040_Linux-x86-64_2of7.zip chown -R oracle:oinstall /u01/software # ---------- 9. 生成响应文件 ---------- cat /home/oracle/db_install.rsp EOF oracle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0 oracle.install.optionINSTALL_DB_SWONLY ORACLE_HOSTNAME$(hostname -f) 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 DECLINE_SECURITY_UPDATEStrue EOF chown oracle:oinstall /home/oracle/db_install.rsp # ---------- 10. 静默执行 runInstaller ---------- su - oracle -c cd /u01/software/database ./runInstaller -silent \ -ignoreSysPrereqs -ignorePrereq \ -responseFile /home/oracle/db_install.rsp \ $LOG_DIR/runinstaller.log 21 # ---------- 11. 等待安装日志产生成功标志 ---------- i0 while ! grep -q Successfully Setup Software $LOG_DIR/runinstaller.log 2/dev/null; do sleep 10 i$((i1)) if grep -qE Error in invoking target|SEVERE|CRITICAL $LOG_DIR/runinstaller.log 2/dev/null; then echo 安装日志中出现报错关键字请检查 $LOG_DIR/runinstaller.log exit 1 fi if [ $i -gt 180 ]; then echo 等待超过 30 分钟安装未完成请检查日志 exit 1 fi done echo 软件安装阶段完成开始执行 root 脚本... # ---------- 12. 执行 root 脚本 ---------- /u01/app/oraInventory/orainstRoot.sh printf y\n/usr/local/bin\n | /u01/app/oracle/product/11.2.0/dbhome_1/root.sh echo Oracle 11.2.0.4 静默安装软件阶段全部完成4.3 几个关键动作的解释su - oracle -c这一层不能省因为OUI必须以oracle用户运行以root身份直接跑会导致软件目录属主混乱后面补刀都补不干净。cd /u01/software/database ./runInstaller而不是写绝对路径是因为11.2.0.4的OUI对启动目录有要求直接/u01/software/database/runInstaller在某些环境下会报insufficient privileges或找不到辅助脚本。-ignoreSysPrereqs -ignorePrereq这两个参数我加得很坦然。它们不是“绕过所有检查”而是跳过CVU对操作系统发行版的误判。CentOS的/etc/redhat-release标识和RHEL不同11.2.0.4的CVU不认识它你不加这个参数runInstaller在启动阶段就直接退出日志停在CheckOperatingSystemVersion这一行。加了之后依赖包和内核参数的检查照样会执行只是不再因为“CentOS不是红帽”这种天生命中的检查卡住。root.sh这里还有个交互细节。root.sh执行时会问两个问题是否继续以及本地bin目录路径。脚本里用printf y\n/usr/local/bin\n把答案管道喂给它避免人工介入。这一步如果漏了交互处理自动化流程就会挂在这里一动不动。5. 软件装完还不算完netca 与 dbca 的静默建库5.1 监听器一条命令搞定监听器是数据库连入的门面11.2.0.4安装完成后$ORACLE_HOME/network/install/目录下会生成一份netca_response_file.rsp默认配置会创建一个名字叫LISTENER、端口1521的监听。直接用它su - oracle -c $ORACLE_HOME/bin/netca -silent -responsefile $ORACLE_HOME/network/install/netca_response_file.rsp如果想自定义端口或监听名用-configlistener更直白su - oracle -c $ORACLE_HOME/bin/netca -silent -configlistener -listenerName LISTENER -port 1521 -protocol TCP执行完不要急着建库先看日志路径在$ORACLE_HOME/cfgtoollogs/netca/没有ERROR字样再继续。lsnrctl status能确认监听状态这个命令后续排障也会反复用。5.2 DBCA字符集、密码和内存比例在建库前定死创建实例用dbca11g的dbca可以直接用命令行参数完成建库不需要再写一个rsp文件。我的常用写法su - oracle -c $ORACLE_HOME/bin/dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl \ -sid orcl \ -characterSet AL32UTF8 \ -sysPassword Oracle#123456 \ -systemPassword Oracle#123456 \ -memoryPercentage 40 \ -datafileDestination /u01/app/oracle/oradata \ -storageType FS \ -emConfiguration NONE \ -sampleSchema false几个参数按我的经验单独说一下。General_Purpose.dbc是11g自带的通用模板路径在$ORACLE_HOME/assistants/dbca/templates/下面里面预置了表空间、数据文件和控制文件的合理布局。字符集AL32UTF8兼容性最广但如果你们的应用是老的国内系统可能要按原环境选ZHS16GBK这个在建库前必须和开发定死后期改字符集是极其痛苦的操作。-memoryPercentage 40表示把物理内存的40%分给Oracle生产库我喜欢给到40%到50%留足操作系统和文件缓存的空间。-emConfiguration NONE关掉Enterprise Manager的配置请求批量环境不需要这个交互。-sampleSchema false不创建示例用户生产库真的不需要那堆scott之类的样例数据。dbca的执行时间取决于磁盘速度一般15到40分钟静默模式下期间没有输出是正常的不要中途去kill进程。最后在日志里打印Database creation complete这就代表建库成功。5.3 装完后的三个常规验证建库完成后我习惯按顺序做三个检查全部通过才敢说“这套装好了”ps -ef | grep ora_smon # 实例进程在不在 lsnrctl status # 监听是否running sqlplus / as sysdba # 本地登录 select status from v$instance; -- 期望看到 OPEN6. 踩坑实录五类最常见的静默安装失败与定位思路6.1 操作系统版本检查-ignoreSysPrereqs 的正确姿势CentOS 7上不传-ignoreSysPrereqsrunInstaller启动就会退出日志停在操作系统版本检查。很多人不敢加这两个参数总觉得加了就不安全。我的判断标准是依赖包是否装齐、内核参数是否到位这些才是真正的“前置条件”而“操作系统是否叫redhat-7”这种检查对CentOS来说就是CVU认不出标识属于误判。加了参数以后CVU碰到真正缺依赖包的情况仍然会报错安全边界没有被突破。如果不想全局跳过所有检查另一个思路是改database/stage/cvu/cvu_prereq.xml手动给CentOS加一条版本匹配规则。这个方法在早期很流行但现在资源都用脚本批量做了直接加ignore参数更快。6.2 DISPLAY 报错和响应文件校验纯静默模式理论上不需要DISPLAY但如果你在执行环境里设置了DISPLAY:0之类指向一个不存在的X服务11g的OUI在某些子进程里仍然会尝试初始化AWT报java.awt.AWTError: Cant connect to X11 window server。排查这个坑的第一步永远是看调用命令里有没有-silent其次才是unset DISPLAY再重跑。响应文件校验失败常见于三种情况文件是Windows传到Linux的带着CRLF和BOMOUI解析不认参数行写错位置或者一个参数出现两次ORACLE_HOSTNAME和实际主机名不匹配。处理方式是把rsp文件放Linux本地用sed -i s/\r$//清理一遍再检查关键字段是否有重复。6.3 链接阶段 ins_ctx.mk 报错在CentOS 7.4之后装11.2.0.4有一定概率在二进制链接阶段碰到Error in invoking target install of makefile /u01/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk。这个报错的信息量不在ins_ctx.mk本身而在它前面那几行make输出通常是ld报找不到某个符号或者当前gcc对旧版链接参数不兼容。网上有各种改env_ctx.mk的文章我的建议是谨慎操作。改make文件只对当前机器有效换一个环境又得重新研究。更稳妥的路径是先确认compat-libstdc-33和i686系列全部装齐再把11.2.0.4的补丁更新到尽量新的小版本大多数情况下问题出在基础库缺失而不是链接参数本身。6.4 root 脚本时机的自动化控制runInstaller执行完毕返回0并不代表安装已经完成。它只是说OUI自己的流程跑完了orainstRoot.sh和root.sh这两个root脚本还等着你人工执行。没跑root脚本的后果是软件目录权限不对oraInventory没有正确初始化后续打补丁和sqlplus都可能报错。自动化脚本里必须用日志轮询来卡这个时机而不是sleep一个固定时长。我脚本里用的while ! grep -q Successfully Setup Software就是标准写法同时加上超时保护和报错关键字检测。这样runInstaller挂了也能第一时间发现不会盲目等到底。6.5 日志到底去哪看静默安装出了问题第一反应不应该是重跑而是看日志。整理一份速查表供参考错误类型常见日志关键词排查方向操作系统版本检查CheckOperatingSystemVersion加ignore参数或改cvu_prereq.xml缺少依赖包Package ... is not installed对照yum列表补齐注意i686磁盘/内存不足Insufficient disk space检查/tmp空间ORACLE_HOME所在分区链接阶段失败Error in invoking target看报错前的make输出定位具体库DISPLAY问题AWTErrorunset DISPLAY确认-silent参数日志文件主要分布在三个位置/tmp/oraInstall/下是OUI的installActions*.log这是最详细的安装动作记录$ORACLE_HOME/cfgtoollogs/下是netca、dbca和配置工具自己的日志脚本自己重定向的runinstaller.log则记录了OUI的标准输出。排查时先看脚本日志再往installActions里钻细节。最后说一个我批量部署时养成的习惯脚本写好后绝不直接在一排机器上铺开。先在干净虚拟机上完整跑一遍把成功的日志存成基线文件再拿到其他机器上量产。哪台机器失败拿它的日志和基线diff一下五分钟内就能锁定差异点。11.2.0.4装起来说难不难但它的坑藏在细节里静默脚本最大的价值就是把那些细节变成一段段别人可以直接“抄作业”的确定性代码。
返回列表