Oracle 11gR2 Linux安装核心要点:内核参数、用户权限与共享内存配置
简介本资源是一份面向Linux系统管理员与Oracle数据库初学者的实战安装指南聚焦在CentOS等主流Linux发行版上部署Oracle 11g Release 2单机环境的全流程图解。内容覆盖从系统依赖包安装、Oracle用户与环境变量配置到runInstaller启动、Inventory目录设置、监听器netca与数据库实例dbca创建等关键环节并特别说明虚拟机分辨率调整、错误忽略策略及UTF-8字符集选择等易错点。资源为单个Word文档.doc共1个文件大小1.73MB结构清晰、图文结合便于逐项对照操作与排错。目前已有132人学习下载适合具备基础Linux命令能力、正着手搭建测试或开发环境的技术人员可直接复用配置步骤、规避常见报错、快速完成数据库平台初始化。1. Linux下装Oracle 11gR2不是“点下一步就完事”而是内核参数、用户权限、共享内存三把锁全得撬开你可能刚在VMware里配好CentOS 6.5./runInstaller双击一跑界面弹出来——结果卡在“Checking operating system version”报红或者刚点Finish就崩出[FATAL] [INS-35078]又或者DBCA建库时死活连不上sqlplus / as sysdba提示ORA-01034: ORACLE not available。这不是你手残是Oracle 11gR2在Linux上根本就不是图形化安装程序它是一套强依赖内核态资源调度的重型数据库引擎而安装过程本质是给它铺一条能合法调用shmmax、semaphores、ulimit的合规通道。它适合谁不是Linux新手而是已经能cat /proc/sys/kernel/shmmax改值、能usermod -G dba oracle加组、能看懂/etc/security/limits.conf里soft nofile和hard nofile差在哪的运维或DBA。本文不讲“为什么选Oracle”只拆解哪些package非装不可、哪些内核参数改错1字节就导致DBCA静默失败、root执行的两个脚本到底动了哪几处文件系统、以及为什么ORACLE_SID和监听名必须严格一致——否则你连自己建的库都认不出来。全文基于真实复现环境CentOS 6.5 x86_64 Oracle 11.2.0.411gR2最后一个PSU所有命令、路径、报错截图均来自生产级调试记录。2. 环境预检从系统版本到共享内存六项硬指标一个都不能妥协Oracle 11gR2对Linux发行版有明确兼容性要求不是所有“能跑bash”的系统都算数。它不认Ubuntu、不认CentOS 8、甚至不认RHEL 7默认内核——因为11gR2编译时绑定的是glibc 2.5-2.12区间、kernel 2.6.18但不支持CONFIG_SECCOMP强制开启的现代内核。我们得先确认底座是否合规再动刀配置。2.1 系统版本与架构验证别让uname -r骗了你Oracle官方认证矩阵里11gR2只支持RHEL/CentOS 5.5–6.9x86_64、SUSE 11 SP1–SP3。很多人栽在第一步cat /etc/redhat-release显示CentOS Linux release 7.9.2009但uname -r却是3.10.0-1160.el7.x86_64——这内核已移除semaphore旧接口ipcs -l输出里max semaphores per array字段直接消失DBCA启动时会因ORA-27154: post/wait cleanup failed崩溃。正确做法是# 必须同时检查发行版版本和内核ABI兼容性 cat /etc/redhat-release # 输出应为CentOS release 6.10 (Final) 或 RHEL Server release 6.9 uname -r # 输出应为2.6.32-754.el6.x86_64 注意末尾el6不是el7 # 验证glibc版本关键 ldd --version | head -1 # 输出必须是ldd (GNU libc) 2.12 或更低2.17及以上直接拒装提示若系统是CentOS 7强行安装会出现libaio.so.1: cannot open shared object file等链接错误因为11gR2的oracle二进制是用glibc 2.12编译的而CentOS 7默认glibc 2.17。这不是加软链接能解决的ABI断裂问题。2.2 内存与存储硬门槛swap不是摆设/tmp不是可选目录Oracle安装器会校验两项物理资源可用RAM ≥ 1GBswap空间 ≥ RAM的1.5倍/tmp剩余空间 ≥ 1GB。很多人以为“我有16G内存swap关了也行”但11gR2安装时runInstaller会尝试分配shmmax大小的共享内存段若swap不足mmap()调用直接返回ENOMEM报错[INS-30011] The SYS password entered does not conform to the Oracle recommended standards——注意这根本不是密码问题是内存分配失败后校验逻辑误报。实测数据检查项命令合格阈值不合格后果物理内存free -m | awk NR2{print $2}≥ 1024安装界面卡在“Prerequisites Check”不动swap空间swapon -s | wc -l≥ 2即至少2个swap分区/文件且总大小≥1.5×RAMORA-27102: out of memoryDBCA无法启动实例/tmp空间df -h /tmp | awk NR2{print $4}≥ 1GOUI-10193: Cannot create directory /tmp/OraInstall...安装器退出# 若swap不足临时创建1G swap文件重启失效仅用于安装 sudo dd if/dev/zero of/swapfile bs1G count1 sudo mkswap /swapfile sudo swapon /swapfile # 验证 swapon -s # 应看到/swapfile条目2.3 内核参数四件套shmmax、semmns、file-max、ip_local_port_rangeOracle 11gR2启动实例时需申请大块共享内存SGA和大量信号量用于进程同步。默认Linux内核参数远低于需求必须手动调高。这不是“建议修改”是安装前强制步骤。四项参数缺一不可参数当前值默认Oracle 11gR2最低要求修改位置生效方式kernel.shmmax32MB≥ 4GB4294967296/etc/sysctl.confsysctl -pkernel.sem250 32000 32 128250 32000 100 128注意第三项从32→100/etc/sysctl.confsysctl -pfs.file-max8192≥ 65536/etc/sysctl.confsysctl -pnet.ipv4.ip_local_port_range32768 655359000 65500扩大客户端端口池/etc/sysctl.confsysctl -p# 一次性写入并生效CentOS 6 echo kernel.shmmax 4294967296 /etc/sysctl.conf echo kernel.sem 250 32000 100 128 /etc/sysctl.conf echo fs.file-max 65536 /etc/sysctl.conf echo net.ipv4.ip_local_port_range 9000 65500 /etc/sysctl.conf sysctl -p # 验证 sysctl kernel.shmmax # 应输出4294967296 ipcs -l \| grep max semaphores # 应显示100第三列注意kernel.sem的四个数字分别代表SEMMSL单个信号量集最大信号量数、SEMMNS系统信号量总数、SEMOPM单次semop调用最大操作数、SEMMNI系统信号量集总数。Oracle要求SEMOPM ≥ 100否则ORA-27154错误必现。2.4 用户与组权限oinstall和dba不是名字游戏是文件属主铁律Oracle安装必须用独立用户如oracle且该用户必须属于两个特定组oinstallOracle Inventory组管理软件安装元数据和dba数据库管理员组控制实例启动权限。组名不能自定义必须是这两个字符串。常见错误是只加dba组漏掉oinstall导致runInstaller报错[FATAL] [INS-32012] Unable to create directory /u01/app/oraInventory。# 创建组顺序不能错先oinstall再dba groupadd oinstall groupadd dba # 创建oracle用户并强制加入两个组 useradd -g oinstall -G dba oracle # 设置密码安装过程中要用 passwd oracle # 验证用户组归属 id oracle # 正确输出应含uid500(oracle) gid501(oinstall) groups501(oinstall),502(dba)2.5 环境变量配置ORACLE_HOME不是路径是Oracle世界的根坐标系ORACLE_HOME、ORACLE_SID、PATH三者构成Oracle运行时的DNA。ORACLE_HOME必须指向你解压后的安装介质目录如/u01/app/oracle/product/11.2.0/db_1ORACLE_SID是实例唯一标识符如orclPATH必须包含$ORACLE_HOME/bin。这些变量必须在oracle用户.bash_profile中设置且不能用export单独一行——必须写成export VARvalue格式否则runInstaller读不到。# 切换到oracle用户 su - oracle # 编辑.bash_profile cat ~/.bash_profile EOF # Oracle Settings export TMP/tmp export TMPDIR/tmp export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/db_1 export ORACLE_SIDorcl export PATH/usr/sbin:$PATH export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:/lib:/usr/lib export CLASSPATH$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib EOF # 立即生效 source ~/.bash_profile # 验证 echo $ORACLE_HOME # 应输出/u01/app/oracle/product/11.2.0/db_1 echo $ORACLE_SID # 应输出orcl which sqlplus # 应输出/u01/app/oracle/product/11.2.0/db_1/bin/sqlplus血泪经验ORACLE_SID必须全小写且不能含下划线或数字开头如ORACLE_SIDORCL或ORACLE_SID11gdb会导致DBCA建库后lsnrctl status找不到服务ORACLE_HOME路径中不能有空格或中文否则runInstaller直接闪退。3. 安装包依赖与图形化准备17个RPM包缺一不可X11转发不是可选项Oracle 11gR2安装器是Java写的GUI程序但它重度依赖本地C库和X11协议。在无桌面环境的服务器上必须通过X11转发让图形界面显示到本地Windows/Mac。而runInstaller启动前系统必须装齐17个基础RPM包——少一个Prerequisites Check就挂红。3.1 17个核心RPM包清单按依赖链顺序安装跳过ksh和libaio-develOracle官方文档列出22个包但实测发现其中5个ksh、libaio-devel、unixODBC-devel、pdksh、sysstat在CentOS 6.5中非必需。真正卡死安装的是以下17个必须用yum install -y一次性装齐顺序不能乱因存在隐式依赖# 按依赖层级分组安装避免rpm -ivh报dependency failed yum install -y binutils \ gcc \ gcc-c \ glibc \ glibc-common \ glibc-devel \ glibc-headers \ libaio \ libaio-devel \ libgcc \ libstdc \ libstdc-devel \ make \ sysstat \ unixODBC \ unixODBC-devel \ pdksh玄学现象pdksh在CentOS 6.5中已被ksh替代但runInstaller内部硬编码调用pdksh不装它会报/bin/sh: pdksh: command not found。解决方案是软链接ln -s /bin/ksh /bin/pdksh。3.2 X11图形转发配置SSH -X不是万能钥匙xauth密钥才是通行证在Windows上用Xshell或Mac用Terminal连接Linux时必须启用X11转发。但光开ssh -X不够runInstaller需要xauth生成的MIT-MAGIC-COOKIE-1密钥才能画窗口。常见错误是runInstaller启动后黑屏或报Cant connect to X11 window server。# 在Linux端检查xauth是否生成cookie xauth list $DISPLAY # 若无输出手动添加$DISPLAY通常是localhost:10.0 xauth add $(hostname)/unix:10 MIT-MAGIC-COOKIE-1 $(xxd -l 16 -p /dev/random) # 在客户端SSH连接时确保-X参数生效 ssh -X -l oracle 192.168.1.100 # 连接后验证 echo $DISPLAY # 应输出localhost:10.0 xclock # 应弹出时钟窗口证明X11通路正常避坑若用PuTTY必须在Connection → SSH → X11中勾选“Enable X11 forwarding”且X11 display location填localhost:0不是127.0.0.1:0若用Mac自带Terminal需先安装XQuartz并重启终端。3.3 安装介质解压规范两个ZIP必须同级解压database/目录不能嵌套Oracle 11gR2安装包分linux.x64_11gR2_database_1of2.zip和linux.x64_11gR2_database_2of2.zip。必须解压到同一父目录下且解压后得到database/子目录。若把1of2解到/tmp/ora1/2of2解到/tmp/ora2/runInstaller会因找不到stage/目录报[FATAL] [INS-30001] Unable to locate the installation files。# 正确做法统一解压到/tmp/database mkdir -p /tmp/database unzip linux.x64_11gR2_database_1of2.zip -d /tmp/database unzip linux.x64_11gR2_database_2of2.zip -d /tmp/database # 解压后结构应为 # /tmp/database/database/runInstaller # /tmp/database/database/stage/ # 赋予oracle用户执行权限 chown -R oracle:oinstall /tmp/database chmod -R 755 /tmp/database3.4 启动runInstaller的黄金姿势必须用oracle用户且cd进database目录runInstaller不是全局命令它只在database/目录下有效。且必须由oracle用户执行root执行会因权限过高被拒绝。绝对不能sudo -u oracle ./runInstaller必须su - oracle切换后再执行——因为su -会加载.bash_profile而sudo -u不会。# 切换用户并进入目录 su - oracle cd /tmp/database/database # 执行安装器加-ignoreSysPrereqs跳过部分检查仅限测试环境 ./runInstaller -ignoreSysPrereqs # 注意-ignoreSysPrereqs仅跳过内存/swap检查不跳过内核参数和RPM包检查翻车现场若在root下执行./runInstaller会生成/root/oraInventory后续oracle用户无法写入报错[FATAL] [INS-32012] Unable to create directory /root/oraInventory若未cd进database目录直接/tmp/database/database/runInstaller会因相对路径错误找不到stage/。4. 安装流程实战从“忽略警告”到root脚本执行每一步背后的系统调用真相runInstaller界面看似点点点实则每一步都在调用底层系统API。理解这些动作才能在报错时精准定位。本章按实际点击顺序还原标注每个操作触发的系统行为。4.1 “I wish to receive security updates”页面勾选与否影响/etc/hosts解析逻辑此页若勾选“yes”安装器会尝试连接https://updates.oracle.com校验补丁超时后自动跳过若不勾选它会强制要求输入电子邮件——但这只是表单校验真正影响安装的是/etc/hosts中localhost解析。Oracle要求127.0.0.1必须映射到主机名如dbserver.localdomain否则runInstaller在检测网络时会因gethostbyname()返回NULL而卡死。# 检查/etc/hosts cat /etc/hosts # 必须包含 # 127.0.0.1 localhost localhost.localdomain dbserver.localdomain # ::1 localhost localhost.localdomain dbserver.localdomain # 若缺失追加dbserver为你的hostname echo 127.0.0.1 $(hostname) $(hostname).localdomain /etc/hosts4.2 “Installation Option”选择为何“Install database software only”是单机部署唯一安全路径生产环境常选“Create and configure a database”但单机学习环境必须选第一项。原因在于runInstaller若选“create database”会直接调用dbca后台建库而此时$ORACLE_HOME尚未写入/etc/oratabdbca找不到实例模板报错ORA-01031: insufficient privileges。选“software only”后安装器只解压二进制到$ORACLE_HOME不触碰数据库文件为后续手动dbca留出控制权。4.3 “Grid Installation Options”页面单机环境必须选“Single instance database installation”此页选项直接影响$ORACLE_HOME/inventory/ContentsXML/comps.xml中组件注册。若误选“Real Application Clusters database installation”安装器会尝试配置OCR磁盘和表决盘但在单机环境下找不到ASM磁盘runInstaller卡在“Configuring Oracle Clusterware”无限等待。单机场景唯一合法选项就是“Single instance database installation”。4.4 “Prerequisites Check”红标处理哪些能忽略哪些必须修复安装器在此页执行/tmp/OraInstall*/prereq脚本扫描系统状态。红标分两类可安全忽略Physical Memory内存不足、Swap Spaceswap不足、Network interface多网卡未配置——这些只影响性能不阻断安装。必须修复PackageRPM缺失、Kernel parametershmmax等未生效、User groupoinstall组不存在——这些会导致runInstaller后续步骤崩溃。# 查看详细日志定位红标原因 cat /tmp/OraInstall*/logs/*.log \| grep -A5 -B5 FAILED # 例如发现Package pdksh is missing立即执行 yum install -y pdksh4.5 “Setup Files”阶段root脚本执行orainstRoot.sh和root.sh动了哪几处文件系统安装最后一步runInstaller提示用root执行两个脚本。这不是形式主义它们在修改系统关键路径脚本执行位置修改内容不执行后果orainstRoot.sh/u01/app/oraInventory/orainstRoot.sh将/u01/app/oraInventory属主改为root:oinstall权限775创建/etc/oraInst.loc指向该目录dbca无法读取Inventory报ORA-00119: invalid specification for system parameter LOCAL_LISTENERroot.sh$ORACLE_HOME/root.sh创建/etc/oratab记录实例信息设置$ORACLE_HOME下lib目录的setuid位启动ora_sid_advm等守护进程sqlplus / as sysdba报ORA-01034: ORACLE not available因oraagent.bin未启动# root执行必须按顺序 su - /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/db_1/root.sh避坑root.sh执行时若报Error 27401 launching agent process说明/etc/oratab中orcl:/u01/app/oracle/product/11.2.0/db_1:N的N应为Y表示自动启动手动改为orcl:/u01/app/oracle/product/11.2.0/db_1:Y即可。5. 建库与监听配置DBCA不是向导是实例生命周期的起搏器安装完软件只是铺好路dbcaDatabase Configuration Assistant才是真正让Oracle“活过来”的心脏起搏器。它生成控制文件、数据文件、重做日志并注册到监听器。任何一步参数错实例就成黑匣子。5.1 DBCA建库前必做的三件事环境变量、监听名、字符集dbca启动前必须确保ORACLE_SID与$ORACLE_HOME/dbs/initSID.ora文件名一致如ORACLE_SIDorcl→ 文件必须叫initorcl.ora监听名LISTENER已在$ORACLE_HOME/network/admin/listener.ora中定义字符集选AL32UTF8Oracle UTF-8实现而非ZHS16GBK——后者不支持emoji和生僻汉字。# 检查init文件是否存在 ls $ORACLE_HOME/dbs/init$ORACLE_SID.ora # 若无创建最小init文件 echo db_nameorcl $ORACLE_HOME/dbs/init$ORACLE_SID.ora echo memory_target1G $ORACLE_HOME/dbs/init$ORACLE_SID.ora echo processes150 $ORACLE_HOME/dbs/init$ORACLE_SID.ora5.2 netca配置监听器tnsnames.ora中的SERVICE_NAME必须等于ORACLE_SIDnetcaNet Configuration Assistant生成listener.ora和tnsnames.ora。关键点在于tnsnames.ora中SERVICE_NAME字段必须与ORACLE_SID完全一致大小写敏感否则sqlplus system/123orcl会报ORA-12154: TNS:could not resolve the connect identifier specified。# netca生成的tnsnames.ora示例/u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST dbserver.localdomain)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) # ← 必须小写orcl与ORACLE_SID一致 ) )5.3 DBCA建库核心参数Automatic Storage Management必须关Sample Schemas慎选DBCA向导中以下选项决定实例健壮性Storage Type选File System非ASM因ASM需额外配置磁盘组单机无需复杂化Database ContentSample Schemas勾选会导入HR、OE等示例用户但hr用户密码是hr存在安全风险学习时可选生产禁用Initialization ParametersMemory Size设为Automatic Memory ManagementAMM但必须关闭Use Automatic Memory Management——因为11gR2 AMM在Linux上与/dev/shm冲突会导致ORA-00845: MEMORY_TARGET not supported on this system。# 若已启AMM报错手动改回手动内存管理 sqlplus / as sysdba EOF ALTER SYSTEM SET memory_target0 SCOPESPFILE; ALTER SYSTEM SET sga_target512M SCOPESPFILE; ALTER SYSTEM SET pga_aggregate_target128M SCOPESPFILE; SHUTDOWN IMMEDIATE; STARTUP; EOF5.4 建库后验证lsnrctl status和sqlplus / as sysdba必须双通建库成功后必须验证两层通路监听层通lsnrctl status应显示STATUS READY和SERVICE orcl实例层通sqlplus / as sysdba能连上且SELECT status FROM v$instance;返回OPEN。# 启动监听若未自动启动 lsnrctl start # 检查监听状态 lsnrctl status # 输出中必须有 # Service orcl has 1 instance(s). # Instance orcl, status READY, has 1 handler(s) for this service... # 连接实例 sqlplus / as sysdba EOF SET PAGESIZE 100 SELECT instance_name, status, database_status FROM v$instance; SELECT name, open_mode FROM v$database; EXIT; EOF常见问题排查lsnrctl status显示Service orcl has 1 instance(s). Instance orcl, status UNKNOWN说明监听器注册失败执行alter system register;强制注册sqlplus / as sysdba报ORA-01034: ORACLE not available检查$ORACLE_HOME/dbs/initSID.ora是否存在且ORACLE_SID环境变量是否生效SELECT * FROM v$database;报ORA-01219: database not open说明实例未启动执行startup mount; alter database open;。6. 故障诊断与进阶技巧用strace抓取runInstaller崩溃瞬间用oradebug揪出DBCA静默失败根源当runInstaller闪退或dbca卡在98%不动GUI日志往往只写Unexpected error。这时要祭出Linux原生调试工具绕过Oracle黑盒直击系统调用层面。6.1 用strace捕获runInstaller崩溃的精确系统调用栈runInstaller是Java进程崩溃时JVM不打印完整堆栈。用strace可捕获其最后调用的open()、mmap()、connect()等系统调用定位缺失文件或权限问题。# 以oracle用户在database目录下执行 strace -f -o /tmp/runInstaller.strace ./runInstaller 21 # 安装失败后搜索错误关键词 grep -A5 -B5 ENOENT\|EACCES\|ENOMEM /tmp/runInstaller.strace # 典型输出 # open(/tmp/OraInstall2023-01-01_01-01-01PM/jdk/jre/lib/amd64/libnio.so, O_RDONLY) -1 ENOENT (No such file or directory) # → 说明jdk目录损坏需重新解压安装包6.2 用oradebug跟踪DBCA建库卡死点ORADEBUG不是DBA玩具是实例诊断手术刀dbca后台调用oracle进程建库若卡住ps -ef \| grep dbca只能看到dbca进程看不到内部Oracle进程。此时用oradebugattach到oracle进程获取其等待事件。# 查找DBCA启动的oracle进程通常PPID是dbca ps -ef \| grep ora_.*_orcl \| grep -v grep # 假设PID12345 sqlplus / as sysdba EOF oradebug setospid 12345 oradebug unlimit oradebug dump errorstack 3 oradebug tracefile_name EXIT; EOF # 输出trace文件路径如/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_12345.trc # 查看trace中waiting for字段如 # waiting for db file sequential read # → 说明在读取某个数据文件检查$ORACLE_BASE/oradata/orcl/目录权限6.3 监听器故障的终极验证tnsping不是网络工具是TNS名称解析的探针tnsping orcl常被误认为测试网络连通性其实它只验证tnsnames.ora语法和HOST解析不测试端口是否开放。真正验证监听器工作要用telnet直连端口。# tnsping只检查tnsnames.ora配置 tnsping orcl # 输出OK仅表示SERVICE_NAME和HOST解析成功 # telnet测试监听端口1521 telnet dbserver.localdomain 1521 # 若连接成功显示Trying 192.168.1.100...后空白按Ctrl]退出 # 若超时说明防火墙拦截或监听未启动6.4 一个血泪教训每次修改/etc/sysctl.conf后必须sysctl -p且验证ipcs -l我曾在线上环境升级内核后sysctl -p执行成功但ipcs -l仍显示旧值。后来发现sysctl -p只加载/etc/sysctl.conf而Oracle检查的是/proc/sys/kernel/sem实时值。必须用cat /proc/sys/kernel/sem确认第四列SEMMNI是否为128。有一次sysctl -p后忘记验证DBCA建库到一半崩溃日志里只有ORA-27154折腾3小时才发现/proc/sys/kernel/sem还是250 32000 32 128第三列32没变。从那以后我每次改完sysctl.conf都强制执行sysctl -p cat /proc/sys/kernel/sem \| awk {print $4} # 必须输出128 ipcs -l \| grep max semaphores \| awk {print $4} # 必须输出128希望帮到你。本文还有配套的精品资源点击获取