Linux环境下Oracle安装(图文详解)先说句实在话数据库这东西方案选型因人而异有人钟情开源阵营有人被困在老旧系统里动弹不得。但只要你还在企业级环境里混Oracle始终是绕不开的一座山头。这套Linux下的安装流程我前前后后折腾过不下二十次从早期的各种依赖报错到后来闭着眼都能把响应文件写出来中间踩过的坑远比文档里写的多。这篇东西不追求教科书式的面面俱到只求把一条从零到能跑通的生产级路径给你捋清楚每个关键步骤都附上“为什么这么做”和“当时发生了什么”让你少走几趟弯路。先交代一下这次安装的目标环境与版本选型思路操作系统使用主流的RHEL/CentOS 7.x系列数据库选用Oracle 11g R2因为大部分存量生产系统仍然跑在这套组合上网上能查到的踩坑记录也最全。等把这套流程吃透再迁移到12c、19c也会顺手很多。本文覆盖从系统准备、依赖包安装、内核参数调整、用户与环境变量配置到静默安装、监听配置、建库、初始化验证的完整过程附带常见故障排查表。适合刚接手数据库运维的同事也适合准备在测试环境复现一遍的开发者参考。1. 安装前的整体思路与规划1.1 为什么选择静默安装而不是图形界面Oracle安装方式大致分三种图形界面交互、静默模式、手动解压配置。生产服务器上最常见的是前两种。图形界面runInstaller带GUI适合一台一台慢慢点能直观看到进度条但一旦涉及远程终端、无显示器的机房机器就要折腾X11转发延迟高、容易断体验非常差。我个人的习惯是能静默就静默原因有三静默安装通过响应文件固化所有选项可重复执行方便在多个节点复制同样的配置。不依赖图形环境PuTTY、MobaXterm、甚至Windows自带的SSH客户端都能直接搞定。排错更可控日志文件里每一步都有记录比盯着进度条猜强得多。当然静默安装的前提是响应文件得写对一个参数写错报错信息却可能在半小时后才蹦出来。所以下文会把响应文件里容易踩坑的字段逐一说明。1.2 系统版本与安装条件确认动手之前先把环境确认这一步做扎实避免装到一半才发现系统不满足最低要求。以CentOS 7.9为例安装Oracle 11g R2前需要满足检查项最低要求说明内存至少2GB推荐4GB以上内存不够会导致安装过程卡死或OOMSwap内存的1.5~2倍内存4GB时建议至少8GB swap磁盘空间/opt或安装目录预留15GB以上软件约5GB数据文件按业务增长预留操作系统64位内核版本3.10以上Oracle 11g对内核版本有一定兼容范围依赖包binutils、glibc、libaio等十几个缺一个装到后面都会报错建议一次性装齐我的建议是使用最小化安装的系统镜像因为依赖冲突的概率更低。如果系统里已经有其他业务软件先确认端口、资源占用不会互相干扰。数据库服务器最好独立部署不要和Web应用挤在同一台机器上。注意Oracle 11g R2官方文档对Red Hat系操作系统的支持列表有明确说明。CentOS 7属于兼容发行版生产环境建议做兼容性测试后再上线。1.3 内核参数的调整思路内核参数这个东西很多人装完Oracle就把它忘了但数据库运行时的共享内存、信号量、文件句柄、网络连接能力全都由这些参数控制。Oracle安装前的预检查脚本runInstaller自带的check会直接扫描这些值如果不符合会提示错误。少部分人能跳过强制检查继续安装但运行时迟早会在高并发场景下暴露问题。常见需要调整的内核参数包括kernel.shmall、kernel.shmmax、kernel.sem、fs.file-max、fs.aio-max-nr等。这些参数的具体含义和推荐值下文会逐项拆解并给出可直接复制的sysctl.conf配置段。另外要注意的是内存4GB和内存64GB的机器参数值不能一样直接抄网上配置的人往往在这上面栽跟头。2. 系统准备与依赖环境搭建2.1 依赖包的安装与版本校验CentOS 7默认的软件源里就能找到大部分Oracle所需的依赖包。建议用一个命令安装完整列表省得来回补装yum install -y binutils compat-libcap1 compat-libstdc-33 gcc gcc-c glibc glibc-devel ksh libaio libaio-devel libgcc libstdc libstdc-devel libX11 libXau libXi libXtst libXrender libXt make sysstat unixODBC unixODBC-devel elfutils-libelf elfutils-libelf-devel这里有几个冷门包要提醒compat-libstdc-33 在默认源里可能没有需要先启用EPEL或下载离线rpm。如果系统是精简版minimal可能连X11库都没有需额外确认libXext、libXrender等是否装全。ksh是Oracle脚本运行需要的shell缺少会直接报 /bin/ksh: No such file or directory 这类错误。依赖包的版本校验也很重要。Oracle安装程序会调用 clib包里的检查脚本如果版本不一致会提示“某些系统需求未通过”。这种提示通常可以勾选忽略但建议还是把缺失的包装上避免后续运行 oracle 用户下的命令时缺东西。2.2 创建用户和目录结构Oracle要求用独立的系统用户来运行数据库进程不能直接用root。这既是出于安全考虑也是为了避免进程以过高权限运行导致的误操作。规划如下groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle目录规划我习惯分几层软件目录、数据文件目录、备份目录彼此分开方便后续扩容和备份策略落地路径用途建议大小/u01/app/oracleOracle基础目录软件安装位置至少15GB/u01/app/oracle/oradata数据文件、控制文件、日志文件根据业务量预留/u01/app/oracle/flash_recovery_area快速恢复区和数据量成正比/backup逻辑备份和归档日志备份酌情分配这里有一个新手容易忽视的问题ORACLE_BASE和ORACLE_HOME是两个不同的概念。ORACLE_BASE是“安装根目录”ORACLE_HOME是“具体某个版本的软件目录”。比如export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1如果ORACLE_HOME设置错误后续所有命令都会找不到sqlplus、lsnrctl。安装阶段默认会创建一套完整的目录结构但提前规划好父目录总是没错的。2.3 配置内核参数与资源限制编辑 /etc/sysctl.conf追加以下内容。这里给出的是内存4GB~8GB的环境配置内存更大的机器需按比例调整# 共享内存相关 kernel.shmall 2097152 kernel.shmmax 4294967295 kernel.shmmni 4096 # 信号量 kernel.sem 250 32000 100 128 # 文件句柄与异步IO fs.file-max 6815744 fs.aio-max-nr 1048576 # 网络参数 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单个共享内存段的最大字节数。Oracle SGA如果超过这个值需要配置多个内存段或者调大shmmax。以11g为例SGA通常不超过内存的一半4GB内存配置约4GB的shmmax即可。kernel.shmall共享内存页总数一般设置为shmmax除以页大小默认4KB。页大小可以通过 getconf PAGE_SIZE 查看。kernel.sem四个数字分别对应信号量数组最大值、系统最大信号量数、每个信号量的操作数、信号量数组个数。Oracle官方建议值就是 250 32000 100 128。fs.file-max系统全局文件句柄上限数据库打开大量数据文件、日志文件时不够会报“too many open files”。改完后立即生效sysctl -p再补充 /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 10240nofile表示打开文件数的限制stack表示栈大小。这些值如果不调整监听器启动或数据库并发连接升高时会出现奇怪的连接拒绝现象。改完limits.conf后需要重新登录oracle用户才能生效。2.4 关闭防火墙与SELinux生产环境的安全策略各有不同但数据库安装调试阶段建议先关闭防火墙和SELinux排除干扰因素。后续再根据公司的安全基线重新开启并配置放行规则。systemctl stop firewalld systemctl disable firewalldSELinux修改 /etc/selinux/configSELINUXpermissive设置为permissive而不是disabled是为了保留SELinux的审计日志能力同时不阻止Oracle进程运行。有些服务器部署了安全加固软件即使SELinux设置permissive也可能拦截进程需要额外加白名单。3. 安装介质准备与响应文件配置3.1 安装文件的获取与传递Oracle 11g R2的安装包有两个zip压缩文件分别对应基础安装文件和第二个光盘内容。把它们统一放在 /u01/install 目录下建议下载后立即检查md5校验值避免传输过程中损坏。从本机上传到Linux服务器我习惯用scpscp linux.x64_11gR2_database_1of2.zip root目标IP:/u01/install/ scp linux.x64_11gR2_database_2of2.zip root目标IP:/u01/install/如果服务器能访问外网也可以直接wget下载。解压后目录结构如下cd /u01/install unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip解压完成后会得到 database 目录里面包含runInstaller、response、stage等子目录。response目录下的*.rsp文件就是静默安装要用的模板。3.2 响应文件的关键参数解读Oracle 11g R2的响应文件通常是 db_install.rsp。这份文件里有大量参数但真正影响安装结果的只有十几个。我的做法是复制一份模板再逐项修改cp /u01/install/database/response/db_install.rsp /u01/install/db_install_my.rsp chmod 755 /u01/install/db_install_my.rspvim打开后重点修改下面几个参数oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory SELECTED_LANGUAGESen,zh_CN ORACLE_HOSTNAMEdb-server ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.isCustomInstallfalse oracle.install.db.DBA_GROUPdba oracle.install.db.OPER_GROUPdba其中几个容易出问题的字段Oracle.install.option这里选择INSTALL_DB_SWONLY表示只安装数据库软件不创建数据库。建库动作放到后面用DBCA单独执行这样每一步的日志更清晰排错更容易。ORACLE_HOSTNAME必须和 /etc/hosts 里的主机名一致否则网络配置会出错。INVENTORY_LOCATIONOracle的中央清单目录记录了所有Oracle产品的安装痕迹。目录要放在共享存储或本地磁盘上权限必须属于oinstall组。SELECTED_LANGUAGES建议包含zh_CN后续使用dbca、sqlplus时语言环境更友好但不加也不影响核心功能。3.3 静默安装执行与日志查看响应文件准备完毕后切换到oracle用户执行su - oracle cd /u01/install/database ./runInstaller -silent -responseFile /u01/install/db_install_my.rsp安装过程会持续10~30分钟不等取决于机器性能和磁盘速度。执行完如果没有报错最后一段会提示以root身份执行两个脚本orainstRoot.sh 和 root.sh。忘记执行这两个脚本是极其常见的坑结果就是安装程序虽然显示成功但数据库始终无法启动。在执行root脚本之前先把安装日志找出来看一眼。日志默认在 /u01/app/oraInventory/logs/ 目录下有个 installActionsXXXX.log 文件。检查末尾有没有“Success”字样或者搜索“FATAL”关键字。如果出现 fatal 错误多半是依赖包缺失、内核参数不匹配、目录权限不对按日志里的提示逐项排查。3.4 执行root脚本与权限校正root脚本是Oracle安装流程里不可跳过的一步su - root /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shorainstRoot.sh负责设置中央清单目录的权限root.sh负责对Oracle Home目录做一些符号链接、权限初始化。执行root.sh时如果有多个ORACLE_HOME系统会问你“是否将本地bin目录链接到Oracle Home”一般本地bin选n即可。执行完后用oracle用户执行以下命令验证安装是否正常cd $ORACLE_HOME/bin ./sqlplus -v如果能输出版本号说明软件这一层已经通了。如果提示无法打开libclntsh.so这类共享库错误多半是缺少32位兼容库或者LD_LIBRARY_PATH没配置好。4. 监听配置与数据库创建4.1 监听配置文件listener.ora数据库软件装好后下一步是配置网络监听让客户端能连上来。监听器的配置文件listener.ora一般位于 $ORACLE_HOME/network/admin/ 目录下。新手推荐直接用netca命令来配置不推荐手写su - oracle netca -silent -responseFile /u01/install/database/response/netca.rsp如果想手动管理一个最简的listener.ora长这样LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST db-server)(PORT 1521)) ) )几个要点HOST 填主机名不要填localhost否则远程客户端连不上。PORT 默认1521如果和业务冲突再改。监听器本身不需要配置SIDSID的映射关系是在tnsnames.ora或动态注册中体现的。启动监听lsnrctl start lsnrctl status如果 status 里看到“The command completed successfully”说明监听已经起来了。如果监听起不来查看 $ORACLE_HOME/network/log/listener.log 末尾的错误信息常见的有端口被占用、主机名解析失败、权限不足。4.2 DBCA建库的静默参数软件装好了监听也起来了接下来就是建库。Oracle 11g提供了dbca命令图形界面方式相对直观但远程环境还是静默参数方式更稳。我常用的一种建库命令dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -sysPassword Oracle_123 \ -systemPassword Oracle_123 \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/flash_recovery_area \ -characterSet AL32UTF8 \ -memoryPercentage 40 \ -emConfiguration NONE参数说明templateName选择General_Purpose.dbc还是OLTP.dbc两者在初始数据文件大小、表空间规划上有差异。通用型足够业务起步使用。gdbName 和 sid在非RAC环境下两者通常一致RAC环境下gdbName是集群数据库名这里无需复杂化。characterSet强烈建议 AL32UTF8。字符集一旦创建很难修改后期为兼容其他系统而使用ZHS16GBK虽然能节省空间但扩展性和国际化的坑很多。memoryPercentageSGAPGA合计占用物理内存的百分比一般设40~50。剩余内存留给操作系统和后台进程。emConfiguration如果可以不用Enterprise Manager直接NONE减少后台进程开销和端口占用。dbca执行时间取决于磁盘IO和模板复杂度通常10~20分钟。日志在 $ORACLE_HOME/cfgtoollogs/dbca/ 下有错误可以在对应实例日志里搜索。4.3 初始化参数与数据库验证连接建库完成后数据库实例已经自动启动。这时用sqlplus验证核心状态sqlplus / as sysdba SQL select status from v$instance;状态是OPEN才算正常。假如状态是MOUNTED或STARTED多半是某个后台参数没配好先查alert日志tail -100 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log初始化参数里有几个在生产环境里经常被忽视但建议提前确认的processes默认150偏小业务稍微复杂一点就容易报“ORA-12520: TNS 监听程序无法为请求的服务器类型找到可用的处理程序”。我习惯直接设为1000。sessions这个值是自动推导的一般等于1.1倍processes加5不用手动设。db_block_size默认8KB大多数业务足够但注意建库之后不可更改。undo_tablespace 和 undo_retention如果要保证长时间运行的查询不出现ORA-01555undo_retention建议设置到900秒以上并配套扩展UNDO表空间。临时修改示例SQL alter system set processes1000 scopespfile; SQL shutdown immediate; SQL startup;这里需要说明processes参数修改后必须重启实例才能生效因为共享内存段里需要预留进程槽位。可以用show parameter processes和show parameter sessions确认当前值再决定是否需要调整。4.4 配置tnsnames.ora与客户端连接测试建库后还需要保证客户端能通过连接串访问。tnsnames.ora里的条目形如ORCL (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST db-server)(PORT 1521)) ) (CONNECT_DATA (SERVICE_NAME orcl) ) )这里SERVICE_NAME不能写成SID除非你对两者区别非常清楚。简单理解SERVICE_NAME是逻辑服务名SID是实例名在非RAC环境下通常一样但规范写法用SERVICE_NAME。本机测试sqlplus system/Oracle_123orcl能进入SQL提示符就说明监听、网络、认证全链路通畅。如果客户端在另一台机器上还要注意机器防火墙是否放行1521端口以及telnet测试是否通过。5. 安装后的初始化验证与常见故障排查5.1 安装后的完整验证命令清单数据库装完建好库很多同事以为万事大吉结果第二天早上来发现监听挂了、磁盘满了、归档日志把空间爆了。我每次装完都会跑一遍固定验证清单把当时的反馈记录下来验证项命令期望结果监听状态lsnrctl status服务就绪端口监听正常实例状态sqlplus / as sysdbaselect status from v$instanceOPEN数据库可用性select name from v$database返回数据库名数据文件状态select file_name,status from dba_data_files全部AVAILABLE日志归档模式archive log list按规划处于归档或非归档模式表空间使用率select tablespace_name,used_percent from dba_tablespace_usage_metrics各表空间使用率正常无超90%会话连接数select count(*) from v$session与业务预期相符后台进程ps -ef | grep ora_ | grep -v grep看到dbwr、lgwr、ckpt等进程如果只是测试环境归档模式可以先不开等确认业务介入前再开启。但生产环境强烈建议从一开始就开启归档模式否则一旦磁盘故障或误删除数据恢复的难度会呈指数级上升。5.2 权限、环境变量与PATH遗漏Oracle安装过程中最烦人的一类错误是“sqlplus: command not found”或者“lsnrctl: command not found”。这不是命令不存在而是环境变量没配对。oracle用户登录后 ~/.bash_profile 里至少要包含export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1 export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib很多人只配置了PATH忘了LD_LIBRARY_PATH结果sqlplus能启动但运行时提示找不到libclntsh.so。另外要记得每次修改环境变量后执行 source ~/.bash_profile 使其生效或重新登录一次。目录权限也很容易踩坑。Oracle用户需要对以下目录有写权限$ORACLE_HOME$ORACLE_BASE/oradata$ORACLE_BASE/flash_recovery_area临时目录 /tmp如果建目录时用了root用户忘了chowndbca建库时会报“ORA-01031: 权限不足”或“ORA-27072: File I/O error”。我习惯在创建目录后统一执行chown -R oracle:oinstall /u01 chmod -R 755 /u015.3 典型故障ORA-01078、ORA-12541、ORA-27102ORA-01078 和 ORA-27102 一起出现时通常是内核参数导致共享内存分配失败。报错内容类似ORA-01078: failure in processing system parameters ORA-27102: out of memory Linux-x86_64 Error: 28: No space left on device这里“No space left on device”不是磁盘满了而是/dev/shm 或共享内存段空间不够。Oracle 11g的自动内存管理会使用共享内存文件系统检查 /dev/shm 大小df -h /dev/shm如果 /dev/shm 只有默认的64MB而数据库SGA设了2GB必然报这个错。解决方式有几种修改 /etc/fstab给 /dev/shm 增加tmpfs挂载大小例如tmpfs /dev/shm tmpfs defaults,size8G 0 0或者改用手动管理SGA设置较小的 sga_target、pga_aggregate_target减少共享内存需求。ORA-12541 “TNS: 监听程序当前无法识别连接描述符中请求的服务”一般有以下原因tnsnames.ora 中的 SERVICE_NAME 与数据库实际服务名不一致。查询数据库实际服务名可以通过show parameter service_names。监听器未动态注册到数据库实例。在非静态监听配置下PMON进程会定期注册服务名如果数据库还处于nomount状态注册就会失败。此时可通过alter system register手动触发。主机名解析问题。listener.ora 和 tnsnames.ora 中的HOST必须能被双方解析建议在 /etc/hosts 中明确写好映射避免依赖DNS。ORA-01031 “权限不足”则多半是登录用户不在dba组里或者尝试通过sudo以错误身份连接。使用 sqlplus / as sysdba 的前提是当前系统用户属于dba组确认命令id oracle输出里必须包含 dba 组。5.4 补丁升级与后续维护建议安装完成后建议尽早打上最新的PSU补丁更新或RURelease Update。11g R2的补丁程序更新包通常比较大但可以显著修复已知的Bug和安全漏洞。补丁下载后解压到 $ORACLE_HOME 外部用 opatch 工具应用cd $ORACLE_HOME/OPatch ./opatch apply /u01/install/patch/p6880880_112000_Linux-x86-64.zip注意opatch版本和补丁版本要匹配。opatch lsinventory 可以查看当前已安装的补丁列表。另一件事是开启归档模式后要设置归档日志清理策略。很多生产故障不是因为数据库本身而是归档目录写满导致数据库hang住。建议在部署初期就设定alter system set db_recovery_file_dest_size20G scopeboth; alter system set db_flashback_retention_target1440 scopeboth;并配置RMAN定期备份与归档删除策略。如果团队还没有完善的备份体系至少也要先用expdp做逻辑备份兜住数据安全底线。6. 实操过程回顾与心得安装Linux下的Oracle数据库表面看是一连串命令实质上是系统资源管理、权限模型、日志排查和网络配置的综合演练。很多问题并不是Oracle本身的Bug更多是环境准备阶段少了某一步、参数理解不到位、日志看得不够细心。回顾整个流程我个人的体会是把每个步骤的“为什么”想清楚比背下整段命令更重要。比如kernel.shmmax为什么要设那么大是因为11g共享内存需要连续地址空间服务名和SID的区别决定了你写连接串时填什么字段。想通了这些后面遇到任何衍生问题你都能独立推导出排查方向。最后再分享一个冷门小技巧静默安装或者dbca执行期间如果看起来卡住了别急着按CtrlC先看日志的尾部是不是还在滚动更新。Oracle安装脚本在创建数据库时经常会有几分钟“看似沉默”的阶段实际上是在压缩数据字典或做双写校验。拿不准的时候在另一个终端执行ps -ef | grep java或top -u oracle看看资源消耗如果CPU有波动就耐心等着。等你完整装过几遍之后嗅到日志的“异常气味”都会比翻文档快得多。这套流程虽长却是值得认真走一遍的路。
阅读完成 · 觉得有帮助?