资讯详情

资讯详情

Linux下Oracle 11gR2单实例安装与避坑全流程

简介一份面向Linux平台数据库运维人员与Oracle初学者的11gR2安装图解文档聚焦单机环境部署围绕依赖包检查、用户与组创建、环境变量配置、安装程序启动、Inventory目录指定、安装检查日志解读、root脚本执行、监听配置及数据库配置助手建库等关键环节展开适合需要按图操作并理解安装逻辑的初中级技术人员。压缩包共1个doc文件约1.73MB文档将系统准备、软件安装与建库配置分阶段说明以图文步骤串联从前期准备到数据库创建完成的流程并对虚拟机分辨率、依赖缺失、空间不足、服务名与ORACLE_SID一致、UTF-8字符集选择等易错点作出提示便于在本地或测试环境中逐步实践、对照排查与复盘。已有134人学习可作为Oracle 11gR2安装过程的操作参考与过程记录。1. 一台老业务机上的 Oracle 11gR2为什么还要在 Linux 上手工装一遍去年冬天接手一台跑某行业管理系统的老服务器硬盘上只有一个 oracle 用户和一个 orcl 实例谁装的、装到哪一步、改过哪些参数全都没有记录。数据库崩掉之后要原地重装翻遍内部文档只剩一份「Linux 下安装 Oracle 11gR2 详细图解」能对照着做。这份资料的定位很明确面向在 Linux 上做单机部署的运维和 DBA从建用户、装依赖包一路带到跑完 netca、dbca。它解决的是「手上只有一台干净系统怎么把单实例库装起来并连得上」而不是「怎么学 Oracle」。适合的人也窄要维护存量 11gR2 环境或者需要在隔离网里搭一套和老系统一致的测试库的人。新项目选型不必再考虑 11gR2但接盘老系统时这几步一个都躲不掉。2. 装之前把地基打平依赖包、内核参数与 oracle 用户环境runInstaller本身并不难难的是它在启动前那几分钟的检查——缺一个 libaio、shmmax少写一个零安装器多半不会当场报错而是把问题拖到链接阶段或者实例启动阶段才炸出来。所以这一章按「系统层 → 内核层 → 用户层」三层推进每一层都给可抄的命令装完再往下走。2.1 依赖包缺一个 libaio 能让安装器卡在链接阶段11gR2 对包的依赖属于「少一个就活不下去」的类型。最常见的组合是一批编译工具链加几个运行库其中compat-libstdc-33和libaio这两块最容易漏——前者在较新的发行版默认仓库里已经改名或者被裁剪后者在最小化安装的系统上压根没装。我一般会先把清单一次性补齐# 一次性补齐 11gR2 单机安装需要的最小依赖集合 yum install -y binutils \ compat-libstdc-33 \ compat-libcap1 \ elfutils-libelf elfutils-libelf-devel \ gcc gcc-c make \ glibc glibc-common glibc-devel glibc-headers \ libaio libaio-devel \ libgcc libstdc libstdc-devel \ libXp libXt libXtst \ sysstat unixODBC unixODBC-devel这段命令里glibc-devel和gcc是给安装过程中编译 PL/SQL 原生组件用的缺了会在链接阶段报cannot find -lclntshlibaio和libaio-devel支撑异步 I/O缺了实例能起来但后台会持续刷ORA-27302libXp、libXt、libXtst这一组只有跑图形界面时才需要用静默安装可以省掉unixODBC-devel是给后续接异构数据源留的口子现在不装以后补装还得重新链接。compat-libcap1在部分新发行版上确实找不到yum 直接报No package available这种情况跳过就行不影响单机安装。装完不要凭感觉用 rpm 反过来核一遍把缺失项打出来比人眼扫快得多# 逐个核对只输出没装上的包名 for p in binutils compat-libstdc-33 gcc gcc-c glibc-devel \ libaio libaio-devel libstdc-devel make sysstat unixODBC-devel; do rpm -q $p /dev/null 21 || echo 缺失: $p done这里的rpm -q只做查询不做安装返回非零就说明这个包名在当前系统上不存在。注意包名和实际安装的 RPM 名可能不一致比如装了libstdc-devel之后查compat-libstdc-33依然是缺失这不是命令写错是两个包本来就不是一回事。2.2 内核参数与 limits.confshmmax 到底该按什么算共享内存这块是最容易被「抄参数」抄出问题的地方。网上流传的一份 sysctl 配置到处被复制但里面的kernel.shmmax往往是某个特定内存规格机器上的值换台机器直接不匹配。正确的做法是先看物理内存和页大小再决定数值。# 先确认两个基数物理内存字节数、系统页大小 free -b | awk /Mem:/{print 物理内存字节:, $2} getconf PAGE_SIZE # /etc/sysctl.conf 追加以下内容数值按上面两个基数换算 fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 2097152 kernel.shmmax 4294967296 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单个共享内存段的最大字节数取物理内存的一半但不能超过系统上限32 位系统上不去 4Gkernel.shmall所有共享内存段合计的页数shmmax / PAGE_SIZE注意单位是页不是字节kernel.shmmni共享内存段的最大个数一般 4096 够用SGA 拆分多的时候才需要调kernel.sem信号量四元组250 32000 100 128是 11gR2 的推荐值别只写前三项fs.aio-max-nr异步 I/O 事件上限1048576低于这个值实例启动时会警告shmall和shmmax单位不同这一点是踩过的坑shmmax写字节shmall写页数。如果页大小是 4096、shmmax是 4G那shmall至少得是 1048576写 2097152 留了一倍余量属于比较稳妥的做法。紧接着是文件句柄和进程数限制这一块 11gR2 的安装器不会直接检查但实例跑起来之后会咬人# /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 32768顺手确认/etc/pam.d/login里有session required pam_limits.so这一行。少了它limits.conf写得再对也不生效表现就是登录之后ulimit -n还是 1024。另外注意新一点的发行版会在/etc/security/limits.d/下放一个20-nproc.conf它会在limits.conf之后加载并覆盖同名条目nproc被改回去多半是这个原因改完记得顺手看一眼。改完统一生效sysctl -psysctl -p会把/etc/sysctl.conf重新读一遍输出里每个键值都应该和你写的一致有不一致的说明被别处的配置覆盖了。2.3 oracle 用户、组与环境变量ORACLE_SID 从这一步就定死用户和组这一步没什么技术含量但它的结果会被后面所有环节引用包括root.sh往oratab里写的路径、dbca建库时读的 SID。所以顺序是先建组再建用户再建目录最后写环境变量。# 组和用户oinstall 是软件属主组dba 是实例管理组两个都要 groupadd -g 54321 oinstall groupadd -g 54322 dba useradd -u 54321 -g oinstall -G dba -m -s /bin/bash oracle # 目录ORACLE_BASE 和 ORACLE_HOME 的上级目录一次建好 mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01 # 密码单独交互设置不要写进脚本 passwd oracleuseradd里的-g oinstall是主组、-G dba是附加组两个都要给。oinstall决定软件文件属于谁dba决定谁能用sysdba身份连库缺了dba的话后面sqlplus / as sysdba会直接报权限不足。环境变量写在oracle用户的~/.bash_profile里注意ORACLE_SID在这个阶段就要定下来因为后面dbca建库时会要求 SID 和它一致# ~/.bash_profileoracle 用户 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:/lib:/usr/lib export NLS_LANGAMERICAN_AMERICA.AL32UTF8 export DISPLAY:0.0ORACLE_HOME里那一层dbhome_1不是随便写的它是 11gR2 安装器默认生成的目录名手工提前建好可以让安装器直接选中。LD_LIBRARY_PATH里的/lib:/usr/lib是兜底防止$ORACLE_HOME/lib下某个符号找不到时整个进程起不来。NLS_LANG用AL32UTF8是为了让客户端字符集和服务端对齐后面建库选字符集时如果不一致中文就会变成问号。还有一处不在 Oracle 文档里、但每次都会出问题的地方/etc/hosts里必须有主机名到 IP 的解析。11gR2 的监听器启动时会解析主机名如果只写了127.0.0.1而没写实际 IPnetca生成监听配置时会把地址写成回环地址外面就连不上。# /etc/hosts 示例主机名必须是 hostname 命令输出的那个 127.0.0.1 localhost localhost.localdomain 192.168.10.20 dbhost dbhost.local这里的dbhost来自hostname的实际输出两边必须完全一致。改完/etc/hosts之后建议用hostname -i验一下能返回192.168.10.20就对了。3. runInstaller 的图形界面走位从解压到 root.sh 的完整路径环境配完安装过程本身反而是最省事的一段。但省事的前提是前面每一步都对——11gR2 的安装器有个特点先决条件检查这一屏会把所有问题攒在一起报出来检查项过了后面基本一路 Next。这一章按「解压 → 交互选择 → root.sh」三段走重点放在几个真正需要动脑的选项上。3.1 两个压缩包解压到同一目录目录结构对不对一眼能看出来11gR2 的介质拆成两个压缩包必须解到同一个父目录下这是安装过程中「找不到文件」类错误的头号来源。解压完的正确结构是database/下同时有install/、stage/、runInstaller三样东西stage/Products.xml之类的元数据在第二个包里少了就会在安装中段报Unable to find the file。# 两个包解到同一个父目录-d 指定的是父目录不是子目录 mkdir -p /u01/soft chown -R oracle:oinstall /u01/soft unzip -q linux.x64_11gR2_database_1of2.zip -d /u01/soft/ unzip -q linux.x64_11gR2_database_2of2.zip -d /u01/soft/ # 验证三样东西必须同时存在 ls /u01/soft/database/ # 期望看到 runInstaller install/ stage/ response/ rpm/ ...-q是静默解压避免几万行文件名刷屏。-d /u01/soft/里的尾斜杠建议统一加上防止两个包解到/u01/soft和/u01/soft2这种不一致的位置。验证那一步别看文件名差不多就放过去install/和stage/缺任一个都是第二个包没解全的表现。解压完把目录属主改给oracle安装器运行时会往stage/下写临时日志用 root 解压后不给权限安装器会直接闪退且不给任何提示。3.2 交互流程里真正要动脑的只有四个选择以oracle用户身份进图形界面启动安装器# 切到 oracle 用户进入解压目录启动 su - oracle cd /u01/soft/database ./runInstaller如果界面显示不全先把分辨率调到 1024×768 以上虚拟机环境里显示不全通常是缺少图形驱动支持把窗口模式切一下基本能解决。整个流程大部分是 Next真正需要判断的只有下面几处界面步骤建议选择为什么这么选配置安全更新取消勾选内网环境无法外联勾了只会在检查阶段卡住安装选项仅安装数据库软件软件和库分开做建库失败不用重装软件系统类单实例数据库安装非 RAC 场景选错后面会多出一堆集群检查项产品语言英文 简体中文英文日志便于对照检索中文界面便于核对提示数据库版本企业版分区表、并行查询这些特性只有企业版有安装位置与ORACLE_HOME一致和.bash_profile里写的必须一字不差清单目录/u01/app/oraInventory与ORACLE_BASE分开重装软件时不用动它操作系统组oinstall清单/dba数据库与建用户时给的组对上先决条件检查忽略并继续检查项会写进日志装完再回头核对「仅安装数据库软件」这一项值得多说一句。安装器在这里给的两个选项一个是软件加库一起装一个是只装软件。选后者的好处是把「软件安装」和「建库」两件事解耦——软件装坏了重装一次十几分钟库建坏了用dbca删掉重建也就几分钟。生产环境按这个顺序做出问题时的回滚成本低很多。先决条件检查那一屏会给出所有检查项的结果缺包、内存不足、内核参数不对都会在这里列出来。当时我那台机器因为内存低于推荐值报了警告这个可以忽略但如果是缺 package 或者shmmax不够建议退回去补完再继续别硬闯。全部检查项的结果会落在/u01/app/oraInventory/logs/下文件名带时间戳装完之后有问题回头翻这一份比翻屏幕截图靠谱。点 Finish 进入真正的文件复制和链接阶段这一步耗时取决于磁盘SSD 上大概十分钟出头。结束后会弹出一个对话框提示用 root 执行两个脚本。3.3 root.sh 与安装后校验别急着点 Close弹窗里的两个脚本有先后顺序先oraInstRoot.sh再root.sh两个都以 root 身份执行# root 身份执行注意先用 root.sh 前先确认路径 /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shorainstRoot.sh干的事是把清单目录的权限改成oinstall:dba 775并写/etc/oraInst.loc指向清单位置。root.sh干的事更多写/etc/oratab、给部分可执行文件加 suid 位、配置/etc/init.d下的启停脚本。所以这两个脚本必须以 root 执行以 oracle 身份跑会静默跳过大部分内容表面上不报错后面netca起不来才发现问题。执行完别急着关窗口先做三项校验# 1. oratab 里应该有刚装的实例条目 grep -v ^# /etc/oratab # 2. 软件版本能打印出来 su - oracle -c \$ORACLE_HOME/bin/sqlplus -V # 3. 清单注册信息能列出来 su - oracle -c \$ORACLE_HOME/OPatch/opatch lsinventory | head -20/etc/oratab里那一行的格式是SID:ORACLE_HOME:Y/N末尾的Y表示允许dbstart自动拉起装完默认是N按需改。sqlplus -V能输出Release 11.2.0.x.0就说明软件层已经完整opatch lsinventory能列出 patch 信息说明清单注册成功后面打补丁全靠它。这一步全过了软件安装就算结束。接下来是监听和建库那是另外两件事放到后面单独讲。4. 避坑与排查装 Oracle 11gR2 最常见的五个翻车点11gR2 的报错有个共性现象和原因隔得很远报错信息还偏笼统。下面这五条是我在不同机器上真遇到过、并且每次重装都要重新确认一遍的东西按「现象 → 原因 → 解决」写遇到类似的直接对号入座。4.1 现象安装界面只显示半屏、按钮点不到现象./runInstaller能起来但窗口只占屏幕左上角一小块底部的 Next 按钮直接看不见拖也拖不动。原因安装器对分辨率有最低要求低于 1024×768 时会按固定尺寸绘制窗口而不做自适应。虚拟机里默认的 800×600 正好卡在这个坎上而且虚拟机的显示驱动没装全的话改分辨率也不生效。解决先把分辨率调到 1024×768 或更高。虚拟机环境里如果调不动说明图形驱动缺组件装上对应的增强工具再重启。还有一种更省事的做法是完全绕开图形界面用响应文件做静默安装# 静默安装跳过所有图形交互 ./runInstaller -silent -ignorePrereq \ -responseFile /u01/soft/database/response/db_install.rsp \ -waitforcompletion-ignorePrereq是忽略先决条件检查里失败的那些项第一次装不建议直接加先看检查结果。-waitforcompletion让命令在前台阻塞到安装结束否则它会立刻返回后面脚本跑起来找不到软件目录。响应文件里的ORACLE_HOSTNAME、ORACLE_BASE、ORACLE_HOME、oracle.install.db.config.starterdb.type这几项必须改其余按默认走。4.2 现象先决条件检查报缺包但 yum 说已经装了现象检查页列出七八个包「未安装」按提示yum install之后重跑安装器报的还是同一批。原因安装器检查的是 RPM 的精确包名和架构yum install libstdc-devel装上的可能是更新版本的包包名变了但功能在安装器认不出来。32 位兼容包缺失在 64 位系统上也属于这一类。解决先用rpm -qa | grep确认实际装上的包名再判断能不能放行。功能上确实不缺的直接选「忽略并继续」检查结果会写进日志事后能查到忽略了哪几项。真正缺的比如libaio完全没装上不能忽略那会在实例启动阶段变成ORA-27302排查起来比现在麻烦得多。4.3 现象root.sh 执行到一半报错退出现象以 root 执行root.sh前几行正常中间突然报Failed to create /etc/oratab或者提示某个文件 permission denied。原因多半是$ORACLE_HOME的属主不对。前面如果用 root 解压并把文件留在了 root 名下root.sh里的部分操作会以 oracle 身份回写文件权限对不上就中断。另一个原因是root.sh被重复执行过第二次跑的时候/etc/oratab已存在脚本某些分支会直接报错退出。解决先确认属主ls -ld $ORACLE_HOME应该显示oracle:oinstall# 属主不对的话整体改回来再重新执行 root.sh chown -R oracle:oinstall /u01/app/oracle chmod -R 775 /u01/app/oracle /u01/app/oracle/product/11.2.0/dbhome_1/root.sh重复执行的情况不用慌root.sh本身有一定幂等性第二次跑会把已有条目跳过。真正要确认的是/etc/oraInst.loc的内容指向了正确的清单目录这个文件错了后面opatch全部失效。4.4 现象以 root 身份跑 netca / dbca 起不来现象按某些资料的写法装完之后切到 root 直接跑netca窗口一闪就没了终端里只有一行Xlib: connection refused或者干脆什么都不打印。原因netca和dbca都是 Oracle 自带的图形程序它们读的是当前用户的环境变量。root 用户下没有ORACLE_HOME、LD_LIBRARY_PATH、DISPLAY程序找不到库也找不到显示目标自然起不来。而且就算能起来以 root 创建的监听配置文件和数据库文件属主会是 root后续 oracle 用户读写全部受限。解决这两个工具必须以 oracle 身份、在图形环境下运行root 只负责执行root.sh不碰这两个工具。正确的调用方式是# 以 oracle 身份在带图形环境的会话里执行 su - oracle export DISPLAY:0.0 # 本地图形界面远程则改成 客户端IP:0.0 $ORACLE_HOME/bin/netca # 配置监听器 $ORACLE_HOME/bin/dbca # 创建数据库DISPLAY的值取决于你是本地终端还是远程连进来的。远程场景下需要在客户端侧允许 X11 转发并且DISPLAY要写成客户端的 IP 加显示号。这一步如果折腾不通netca和dbca都支持静默模式-silent -responseFile ...命令行参数和图形界面一一对应反而更可控。4.5 现象库建好了插中文变问号现象dbca建库一路顺利sqlplus连进去insert一条中文再select出来是???。原因字符集在建库那一刻就定死了之后改库字符集基本等于重建。建库时如果选了默认字符集通常是WE8MSWIN1252或AL32UTF8之外的某个单字节集中文直接存不进去。另一个常见原因是客户端NLS_LANG和服务端字符集不一致数据存进去了但显示成乱码。解决建库时字符集选AL32UTF8这个在dbca的最后几屏里默认值不是它必须手动改。已经建错的话用dbca删库重建比改字符集快得多# 确认服务端实际字符集 sqlplus -S / as sysdba EOF select parameter, value from nls_database_parameters where parameter in (NLS_CHARACTERSET,NLS_NCHAR_CHARACTERSET); EOF输出里NLS_CHARACTERSET应该是AL32UTF8。客户端侧则确认NLS_LANG的第三段与之一致AMERICAN_AMERICA.AL32UTF8对应服务端的AL32UTF8两边对齐之后中文才不会在传输层被二次编码。5. netca 与 dbca 的收尾技巧把 SID、服务名和字符集一次对齐软件装完只是半成品能不能连、连上之后中文对不对全看监听和建库这两步。这两件事单独看都不复杂但它们共享同一批标识符——SID、服务名、字符集——任何一个对不上后面排查起来都要绕一大圈。5.1 监听器netca 生成的 listener.ora 什么时候需要手改netca走完默认流程会在$ORACLE_HOME/network/admin/下生成listener.ora和tnsnames.ora监听名默认是LISTENER、端口 1521。单机场景下这份默认配置基本够用唯一值得动的是监听地址。默认配置会监听所有网卡但如果你在/etc/hosts里没写主机名解析生成的HOST会是回环地址外部客户端连不上。# 启动监听并查看实际监听地址 lsnrctl start lsnrctl statuslsnrctl status的输出里「监听端点摘要」那一段的HOST就是实际绑定的地址。如果是127.0.0.1或者主机名解析不出来需要手工把listener.ora里的(HOST ...)改成实际 IP然后lsnrctl reload。改完再用tnsping从客户端侧验一次连通性比在服务端自测有意义。5.2 建库时把 SID、服务名、字符集三个值钉死dbca的交互步骤很多但真正影响后续使用的只有三个值建议在建库之前就写在纸上值来源常见错误SID.bash_profile里的ORACLE_SID建库时随手改成别的名字导致sqlplus / as sysdba连不上服务名一般与 SID 相同也可以不同客户端tnsnames.ora里写的是服务名两边不一致就连不上字符集AL32UTF8用默认值中文丢失SID 和ORACLE_SID一致这一条是硬约束。sqlplus / as sysdba走的是操作系统认证它会读当前 shell 的ORACLE_SID去找实例两者不同就会报ORA-01034: ORACLE not available——这个报错的字面意思容易让人以为实例没启动实际是找错了实例。5.3 一条从监听状态到中文插入的验证链路装完之后我固定会跑一条验证链路从网络层一路验到数据层四步全过才算这套环境可用# 1. 监听状态确认监听已起、服务已注册 lsnrctl status | grep -E READY|Service # 2. 本地连接走操作系统认证不依赖监听 sqlplus -S / as sysdba EOF select instance_name, status from v$instance; exit EOF # 3. 网络连接走监听验证客户端配置 sqlplus -S system/密码orcl EOF select sysdate from dual; exit EOF # 4. 中文往返建表、插中文、读回来 sqlplus -S system/密码orcl EOF create table t_zh (id number, name varchar2(50)); insert into t_zh values (1, 测试中文); commit; select * from t_zh; drop table t_zh; EOF四步的失败位置直接指向不同层第 1 步失败是监听没起或者listener.ora有问题第 2 步失败是实例没起或者ORACLE_SID不对第 3 步失败是监听注册或客户端tnsnames.ora的问题第 4 步只有中文出问题那就是字符集或者NLS_LANG。这条链路的价值在于把「连不上」这个笼统现象拆成了四个可以独立定位的环节。血泪经验是第 2 步和第 3 步一定要分开测。很多人图省事直接用sqlplus system/密码orcl测一旦失败就分不清是实例的问题还是网络的问题最后把监听配置改了三遍才发现实例压根没起来。从那以后我每次装完 11gR2都必须把这条链路从头到尾走一遍才敢交付宁可多花十分钟也不要在业务上线当天被叫起来查ORA-12541。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →