☰
Linux部署Oracle 11g R2完整指南:环境准备、静默安装与避坑
2026/10/3 19:02:49 网站建设 项目流程

简介:在Linux上部署Oracle 11gR2常因依赖包缺失、环境配置复杂而让新手却步,这份图解文档精准覆盖了安装全过程中的关键环节。资源为单个doc文档,压缩包仅1.73MB,却以图文对照形式完整呈现了从准备到建库的详细步骤,适合边看边操作。文档不仅列出了系统必备的gcc、binutils、kernel-headers、glibc-devel等软件包,还指导创建oracle用户与oinstall/dba组,并设置ORACLE_HOME、PATH等环境变量;安装部分详解了runInstaller启动、分辨率调整、安装类型选择、错误信息忽略原则、Inventory目录指定及系统检查清单。后续也给出了用netca配置监听、用dbca建库时服务名与ORACLE_SID一致、选择UTF-8字符集等实践要点。已有131人学习下载,对准备在Linux生产或学习环境中安装Oracle 11gR2的IT人员,是节省排查时间的实用参考。

1. 为什么在 Linux 上装 Oracle 11g R2 会在第一步就劝退人:认清环境再动手

很多人以为装 Oracle 和装 MySQL 一样,yum 装个包就能跑。真正动手才发现,Oracle 11g R2 对操作系统版本、共享内存参数、用户权限、图形环境都极其挑剔。它往往会在依赖检查、图形界面、监听启动、dbca 建库四个阶段各卡一次;更难受的是,报错信息常常是误导性的,比如明明显示缺库文件,实际是本地 yum 源没配好;明明说内存不足,实际是共享内存段太小。这篇笔记把从环境准备到监听和建库的完整过程拆开,按步骤给出命令和参数,同时把几个高频翻车现场单独列出来。适合要在生产环境部署 11g 的 DBA,也适合刚开始接触 Oracle 的运维同学照着完整做完一遍。

2. 装前准备:先把 Linux 环境调成 Oracle 11g R2 愿意落地的样子

安装失败大多发生在我们以为根本不重要的前置环节。Oracle 不像普通应用软件,它对内核参数、依赖包、目录权限有一套硬性要求。很多时候不是 Oracle 难装,而是我们在系统还没有准备好的时候就点了下一步。

2.1 选对操作系统版本和安装包:Linux 镜像与 Oracle 11g R2 的匹配

Oracle 11g R2 的认证环境里,RHEL 6 和 Oracle Linux 6 是最稳的组合。如果只能用 CentOS 7 或 RHEL 7,尽量选 11.2.0.4 以上补丁包,因为 11.2.0.1 在 7 上存在 glibc 和 systemd 兼容问题。我一般装测试库用 CentOS 6.10,装生产库用 RHEL 7.9 加 11.2.0.4,能省掉不少莫名其妙的报错。这里说的“Linux 镜像”,不是让你去下精简版系统镜像,而是建议准备一套和正式环境一致的安装 ISO,后面配本地 yum 源、补依赖包时最可靠。

检查完系统后,还要确认资源情况。Oracle 安装包会解压出 4GB 左右文件,数据库创建时又要额外空间,所以 /u01 所在分区至少留 10GB。内存建议不低于 2GB,swap 按内存的 1.5 倍分配。在动手前先把这些信息记录下来,后面排错时会发现这些数据非常有用。

# 查看操作系统版本 cat /etc/os-release # 查看内存与swap free -m # 查看 /u01 分区剩余空间 df -h /u01

第一条命令确认系统是 64 位以及版本号是否在 Oracle 支持列表里;第二条看内存和 swap 是否够用,Oracle 11g 在 swap 不足时往往会在建库阶段才报 ORA-04030;第三条是给安装目录留底,别等到解压中途磁盘写满才来找我。

2.2 依赖包补齐:一次 yum 搞定,还是手工 rpm 硬扛

Oracle 11g R2 依赖包众多,包括 binutils、compat-libcap1、compat-libstdc++-33、gcc、glibc、libaio、make、sysstat、unixODBC 等。最省事的方式是安装 RHEL/CentOS 自带的预安装包。在 CentOS 6/7 的安装介质里有一个包叫 oracle-rdbms-server-11gR2-preinstall,装了它之后,官方要求的依赖基本都会自动拉起来。

# 用本地 Linux 镜像做 yum 源,然后安装 preinstall 包 yum install -y oracle-rdbms-server-11gR2-preinstall # 如果源里没有这个包,手动补齐常用依赖 yum install -y binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst libX11 libXau libXi make sysstat unixODBC unixODBC-devel # 检查关键包是否已就位 rpm -q --queryformat "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" binutils compat-libstdc++-33 libaio-devel libXext make

preinstall 包最大的价值不只是拉依赖,它会把后面要改的内核参数、资源限制、oracle 用户和组都一并建好。如果它不存在,手动安装时要特别留意 compat-libstdc++-33,这个包在 RHEL 7 的默认源里没有,需要到安装镜像的 Packages 或 AppStream 目录里找。最后一条 rpm 命令用于确认 64 位版本在,如果报 not installed 就说明之前安装漏了。不要看到“No package”就换源,先确认当前源里有没有。

2.3 内核参数、用户和目录:Oracle 在等一个专门的“钉子户”

安装检查会读/etc/sysctl.conf。最常见的要改的是共享内存相关参数、信号量和端口范围。共享内存参数决定了 Oracle 的 SGA 能不能分配出来,如果太小,安装和建库时都可能触发 ORA-27102 或 ORA-00845。

cat >> /etc/sysctl.conf <<'EOF' # 共享内存段的最大字节数,建议不小于 SGA 需求,这里是物理内存的一半 kernel.shmmax = 2147483648 # 所有共享内存段的总页数,约等于物理内存页数 kernel.shmall = 1048575 kernel.shmmni = 4096 # 信号量:SEMMSL, SEMMNS, SEMOPM, SEMMNI kernel.sem = 250 32000 100 128 # 端口范围,监听和 RAC 会用 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 # 文件句柄与异步 IO fs.file-max = 6815744 fs.aio-max-nr = 1048576 EOF sysctl -p

shmmax 的单位是字节,如果你的服务器内存是 8GB,shmmax 可以设 4GB 左右;shmall 是共享内存页数,一般用getconf _PHYS_PAGES的值来填。不要直接照抄网上的数字,先结合本机内存做调整。信号量四元组一般保持这个值足够,除非你在同一台机器上跑多个实例。

资源限制也是必改项。Oracle 数据库同时打开的文件数远高于普通进程,默认 1024 不够用。

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 10240 EOF

nofile 是文件描述符数,stack 是进程栈大小。stack 设太小会导致安装器或 oracle 进程直接崩溃,且报错完全不指向这里。调整后退出 shell 重新登录,用ulimit -n和ulimit -s验证。

用户和目录创建是另一个常见坑位。Oracle 要求安装用户和组预先存在,最常见的规划是 oinstall 作为 inventory 组,dba 作为管理组。

groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle id oracle mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app

oracle 用户的主组是 oinstall,附加组是 dba,这样安装目录的权限归属不会乱。目录不要放在 /home 下,避免用户配额限制。另外,安装前最好把 SELinux 设为 permissive,因为 Oracle 11g R2 的二进制在 enforcing 模式下偶尔会触发 avc denial,导致数据库起不来。修改/etc/selinux/config中的 SELINUX=permissive。防火墙方面,测试环境可以直接关掉 firewalld,生产环境放行 1521 端口即可。

sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config systemctl stop firewalld systemctl disable firewalld

这一步做完,再跑一次sysctl -p和id oracle,确认参数和用户没问题,就可以进入安装包解压阶段了。

3. 解压安装包并运行 runInstaller:图形界面和静默安装两条路都走通

安装包拿到手,很多人直接双击 runInstaller 就开始下一步,但 11g R2 的安装器有它自己的脾气。明明有图形环境却起不来界面、明明解压了两个 zip 却还是缺文件、root 脚本漏跑导致后面监听起不来,这些都发生在这一阶段。

3.1 合并解压两个 zip 包:细节决定成败

把两个 zip 上传到同一个目录,例如 /u01/install,然后依次解压。这里的关键是:两个 zip 必须放进同一个目录,解压后才会自动合并成一个 database 目录。如果分开解压到不同目录再手动合并,很可能会出现组件缺失。

cd /u01/install unzip -q linux_11gR2_database_1of2.zip unzip -q linux_11gR2_database_2of2.zip ls -l database/runInstaller

第一个 zip 里的 database 目录已经有基础结构,第二个 zip 把剩余组件填进去。解压完成后看到 runInstaller 才算成功。有很多人是只解压了第一个 zip,然后安装到一半提示找不到某个组件,回去查才发现第二个包没解压。下载时如果做过 md5 校验,这一步会非常稳,也不会踩到 zip 损坏的问题。

3.2 准备响应文件:把“下一步请选择……”预先填好

图形安装需要 X11 转发或 VNC 桌面。如果你面对的是机房里的无显示服务器,响应文件加静默安装才是正确姿势。响应文件像黑匣子,每个参数都要知道它是干什么的,不能照抄网上模板。

安装包自带的响应文件模板在 database/response/db_install.rsp。先复制出来再改,保持原模板不变,方便出错时对照。

cp /u01/install/database/response/db_install.rsp /u01/install/db_install.rsp chown oracle:oinstall /u01/install/db_install.rsp vim /u01/install/db_install.rsp

需要修改的关键参数如下:

oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en,zh_CN ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_HOME_NAME=OraDb11g_home1 oracle.install.db.InstallEdition=EE oracle.install.db.DBA_GROUP=dba oracle.install.db.OPER_GROUP=oinstall DECLINE_SECURITY_UPDATES=true SECURITY_UPDATES_VIA_MYORACLESUPPORT=false

INSTALL_DB_SWONLY表示只装数据库软件,建库交给后面的 dbca。这种拆法有个好处:软件装失败不会影响后续建库的排错边界,避免一条命令里各种错误混在一起。INVENTORY_LOCATION是安装清单目录,不要放在 ORACLE_HOME 里面,否则以后升级或卸载时会出现 inventory 找不到的情况。DECLINE_SECURITY_UPDATES必须设成 true,否则安装器会在配置阶段卡在 My Oracle Support 账号输入,这一步就能劝退一半初学者。

3.3 运行安装器并执行 root 脚本:最关键的两个交互点

以 oracle 用户执行静默安装:

su - oracle cd /u01/install/database ./runInstaller -silent -responseFile /u01/install/db_install.rsp -ignorePrereq

-ignorePrereq是跳过预检查。但注意,它不是必需的。如果依赖包没补齐,先不要加这个参数,让安装器把缺的包名打印出来,根据报错补包。只有确认环境没问题时才加。强行跳过预检查往往会在安装中途暴露问题,那时日志更难读。

安装完成后,界面会提示以下脚本需要用 root 用户执行:

su - root /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.sh

orainstRoot.sh 给 inventory 目录写入权限;root.sh 会生成 /etc/oratab、设置二进制所有者为 oracle,并配置好 dbstart 依赖的文件。执行 root.sh 时一路回车即可,默认值都可用。漏跑 root.sh 会导致后面dbstart命令无法识别数据库,监听也会出现权限异常。

安装日志通常会输出到安装目录下的 cfgtoollogs 里,比如$ORACLE_HOME/cfgtoollogs/installContainers。遇到失败时,用tail -200看最后一段,搜 FATAL 或 Error。这个日志是黑匣子,不用从头读,抓尾部错误信息足够定位大多数问题。

软件装完后检查一下:

ls $ORACLE_HOME/bin/sqlplus

有这个文件,说明软件安装基本成功。接下来配置监听和建库。

4. 监听与建库:netca 和 dbca 的双人舞

数据库软件只是骨架,监听器和实例才是让业务连上来的关键。很多环境里软件装得好好的,结果卡在监听起不来或建库半途失败。这一章把两个工具分开讲清楚。

4.1 用 netca 配置监听:图形界面和命令行都行

监听器负责接收客户端请求并转发给数据库实例。最直观的方式是在 X11 或 VNC 环境里以 oracle 用户执行netca,弹出的图形窗口按下面步骤走:选择 Listener configuration,然后 Add,Listener name 填 LISTENER,协议选 TCP,端口填 1521。完成后运行lsnrctl status,看到listening on (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=主机名)(PORT=1521)))说明监听已工作。

没有图形环境时,可以用静默方式:

$ORACLE_HOME/bin/netca -silent -responseFile $ORACLE_HOME/network/response/netca.rsp

这个响应文件是安装目录自带的模板,会自动生成一份默认监听配置。执行完后查看$ORACLE_HOME/network/admin/listener.ora,确认 HOST 是本机可解析的主机名或 IP。如果模板文件不存在,可以直接手工建 listener.ora,但用 netca 生成更规范,不容易踩格式坑。

监听配置完,用下面的命令测试:

lsnrctl status lsnrctl start LISTENER

如果 start 时提示端口占用,先查一下是不是装了其他应用占了 1521。用netstat -tlnp | grep 1521检查进程。

4.2 用 dbca 创建数据库:模板选择、字符集和内存分配

dbca 是建库工具,图形界面信息量很大,第一次跑很容易点错。模板建议选 General Purpose,而不是 OLTP 或 Data Warehouse,因为后两者默认参数更激进。字符集是建库前要想清楚的事,一旦建完,再改就是血泪史。

静默建库命令如下:

dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -sysPassword Oracle_12345 \ -systemPassword Oracle_12345 \ -characterSet AL32UTF8 \ -nationalCharacterSet UTF8 \ -memoryPercentage 40 \ -storageType FS \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -emConfiguration NONE \ -listeners LISTENER

-gdbName是全局数据库名,-sid是实例名,一般保持一致。-characterSet建议选 AL32UTF8,如果以后要迁移老库,先确认源库字符集,不然后面改字符集几乎等于重建库。-memoryPercentage 40表示把物理内存的 40% 分配给 Oracle 实例,设太大可能造成系统 OOM,太小共享池容易报 ORA-04031。-emConfiguration NONE表示不创建 Enterprise Manager,省掉一堆端口和后台进程。-recoveryAreaDestination是快速恢复区,如果磁盘空间不足,可以去掉这个参数,但建议保留,RMAN 备份会用到。

建库成功后会返回一段输出,包含数据文件和控制文件位置。如果失败,日志在$ORACLE_BASE/cfgtoollogs/dbca/orcl下,主日志名一般是 trace.log。

4.3 设置环境变量和开机自启:装完数据库不配这个等于白装

oracle 用户的~/.bash_profile要补上数据库相关环境变量,否则每次登录后sqlplus都不在 PATH 里。

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_SID=orcl export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib EOF source /home/oracle/.bash_profile

ORACLE_SID 一定要带,否则 sqlplus 会尝试连接一个默认不存在的实例,报错 ORA-01034。LD_LIBRARY_PATH 缺失时,一些工具会报 libclntsh.so 找不到。

开机自启依赖 /etc/oratab 文件,这个文件在 root.sh 执行时已经生成。把里面orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N最后的 N 改成 Y,dbstart 才会处理它。

sed -i 's/\(^orcl:.*\):N/\1:Y/' /etc/oratab

CentOS 6 环境可以沿用 rc.local:

echo "$ORACLE_HOME/bin/dbstart $ORACLE_HOME" >> /etc/rc.d/rc.local echo "$ORACLE_HOME/bin/lsnrctl start" >> /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local

CentOS 7 上 rc.local 默认不执行,更推荐写 systemd 服务:

cat > /etc/systemd/system/oracle11g.service <<'EOF' [Unit] Description=Oracle 11g R2 After=network.target [Service] User=oracle Group=oinstall Type=forking ExecStart=/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart /u01/app/oracle/product/11.2.0/dbhome_1 ExecStop=/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbshut /u01/app/oracle/product/11.2.0/dbhome_1 RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF systemctl enable oracle11g

dbstart 会读取 /etc/oratab 中标为 Y 的条目,所以 oratab 必须先改。这个 systemd 服务只是套壳,真正逻辑还是 dbstart。测试时可以systemctl start oracle11g,然后看监听和实例状态。

5. 避坑手册:Oracle 11g R2 安装中最常见的 5 个翻车现场

下面这些坑都是我在测试和生产环境里帮人排查时真实遇到的。每条按现象、原因、解决三步写,方便你对照操作。

5.1 现象:xhost + 之后还是显示 Unable to open display

现象:终端执行 ./runInstaller,安装器立刻退出,弹出一句Unable to open display或DISPLAY未设置。原因:X11 转发没有启用,或 DISPLAY 指向的 IP 不对。解决:检查 SSH 登录时是否用了ssh -X;如果用的是 VNC,则export DISPLAY=:1再执行 runInstaller。不要反复xhost +,那只是把访问权限放开,不会解决转发问题。还要确认/etc/hosts里主机名能正确解析,图形界面起不来时先看这个。

5.2 现象:依赖检查提示缺少 libaio-devel 等,yum install 却说找不到包

现象:预检查报告Package: libaio-devel is missing,执行yum install -y libaio-devel又提示没有可用软件包。原因:yum 源没配好,或对应仓库没有启用。在 CentOS 7 中,部分依赖包在默认 BaseOS 里找不到。解决:挂载 Linux 镜像配置本地源,或用安装光盘里的 Packages 目录手动rpm -ivh libaio-*.rpm libaio-devel-*.rpm。配完源先跑yum repolist,输出数字大于 0 才说明源可用。还有 compat-libstdc++-33,这个包在 RHEL 7 里也必须从光盘里找。

5.3 现象:lsnrctl status 卡住十几秒

现象:输入lsnrctl status后停在Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))这一行,十几秒才返回。原因:监听在启动时对主机名做反向解析,而/etc/hosts里没有本机主机名条目,DNS 查询超时。解决:在/etc/hosts加一行127.0.0.1 你的主机名,同时检查 listener.ora 里的 HOST 是否用了可解析的主机名。如果监听已经启动,这个问题可能只影响 status 命令,但数据库连接也可能因此变慢。

5.4 现象:dbca 建库到一半报 ORA-27102: out of memory

现象:dbca 进度到 4% 左右直接退出,日志里写Linux-x86_64 Error: 12: Cannot allocate memory。原因:kernel.shmmax小于 SGA 请求,或者 oracle 用户的memlock被限制。解决:用sysctl -p确认 shmmax 是否生效,shmmax 建议大于物理内存一半;在 limits.conf 里加oracle soft memlock unlimited和oracle hard memlock unlimited。调整后必须重新登录才能生效,不要只改文件不重新登录。如果还不行,用ipcs -lm查看当前最大段大小。

5.5 现象:启动实例报 ORA-00845: MEMORY_TARGET not supported

现象:sqlplus / as sysdba执行 startup 时直接报ORA-00845: MEMORY_TARGET not supported on this system,提示/dev/shm大小不够。原因:Oracle 11g 默认启用自动内存管理(AMM),它把内存文件映射到/dev/shm,而这个目录通常只有物理内存的一半。解决:用mount -o remount,size=4G /dev/shm临时扩大,或写进/etc/fstab永久生效。如果物理内存只有 2G,可以调小 memory_target 参数,但不建议低于 300MB。改完/dev/shm再df -h /dev/shm确认。

6. 安装后的验证命令与关键文件:数据库跑没跑起来,十分钟内见分晓

数据库装完不代表交付完成。我见过太多装完后进程在但监听没起、或者实例 open 但客户端连不上的情况。这里提供一套固定的验证流程,十分钟内能判断这套系统是否真的可用。

6.1 用一组 Linux 常用命令确认数据库可用

# 监听是否在线 lsnrctl status # 实例和数据库状态 sqlplus / as sysdba SQL> select instance_name, status from v$instance; SQL> select name, open_mode from v$database; SQL> quit # 实例进程是否存在 ps -ef | grep smon | grep -v grep

如果v$database返回READ WRITE,说明数据库已经打开。若实例启动但数据库没有 open,可能是上次非正常关闭留下了恢复步骤,手动执行alter database open;即可。在最终交付前,我建议重启一次实例,验证 dbstart 配置是不是真的生效。执行shutdown immediate; startup;完整走一遍,比单纯看进程状态可靠得多。

6.2 一张表记住关键日志和配置文件的位置

文件/路径作用排查时看什么
/etc/oratab指定实例与 ORACLE_HOME 的映射,决定 dbstart 是否启动实例最后字段是否为 Y
$ORACLE_BASE/diag/rdbms/实例名/实例名/trace/alert_$ORACLE_SID.log实例警告日志,启动/停止/ORA 错误全在这里搜索 ORA- 和 ORA-600
$ORACLE_HOME/network/log/listener.log监听器日志,连接被拒绝时看搜索 TNS-
$ORACLE_HOME/network/admin/listener.ora监听配置文件HOST/PORT 是否与 netstat 一致
$ORACLE_HOME/network/admin/tnsnames.ora客户端连接字符串配置SERVICE_NAME 与 dbca 建库时是否一致

这几条路径不需要刻意背,但要知道它们在哪。遇到问题先看对应日志,而不是反复重启。比如客户端连不上,先看 listener.log,再看 alert 日志,基本能定位是网络层还是数据库层的问题。

我装完一套 Oracle 11g R2 的保留习惯是:先lsnrctl status,再sqlplus查 v$instance 和 v$database,最后tail -50看一眼 alert 日志,三个全绿才认为这台机器交付。这个习惯帮我躲过了好几次“进程活着但监听没起来”的情况。把这一套验证流程固定下来,后面再遇到类似环境,你会发现自己越来越能分清楚哪些报错值得追查,哪些只是噪音。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询