☰
CentOS 7无桌面用Xmanager装Oracle 11g+Tomcat
2026/10/19 9:02:31 网站建设 项目流程

部署Oracle 11g + Tomcat这种组合,在全新CentOS 7服务器上最折腾人的往往不是软件本身,而是图形界面。绝大多数企业机房里的CentOS 7都是最小化安装,装完只有一个黑乎乎的终端,而Oracle 11g的安装程序又偏偏离不开图形窗口。网上教程一大堆,但很多要么卡在X11转发上,要么装完了连不上数据库,要么Tomcat起不来。我前后折腾了两个晚上,把整条流程完整跑通了一遍,今天把每一步操作和踩过的坑全部整理出来。

这套流程解决的核心问题就是:在无显示器、无桌面环境的CentOS 7服务器上,用Xmanager把Oracle 11g和Tomcat干净利落地装好,并让两者正常连通。适合刚接手Linux服务器、需要在上面部署Java Web应用的运维或开发同学参考,整个环节涉及依赖处理、内核参数调整、图形化安装、监听配置、JDK部署和连接测试,任何一个环节出错都会卡住后续流程,我会把关键节点全部标注清楚。

1. 环境评估与方案选型:为什么用Xmanager而不是VNC

先交代一下我这次部署的环境。服务器是一台4核8G内存、100G磁盘的物理机,操作系统是CentOS 7.9,安装时选的Minimal模式,连桌面环境都没有。数据库用Oracle 11g 11.2.0.4,Web容器用Tomcat 9 + JDK 8,这组合在传统企业内部系统里非常常见。

1.1 Xmanager方案的优势

Oracle 11g的图形化安装必须依赖X Server提供显示环境,但服务器上没有任何桌面组件,这时候有两条路:给服务器装GNOME或KDE桌面,或者用远程X转发的方式把图形窗口映射到本地电脑。前者会占用大量系统资源和磁盘空间,生产服务器上这么干很不划算。后者就是Xmanager的核心用法。

Xmanager其实是NetSarang公司的一个工具套件,包含Xmanager Passive、Xshell、Xftp、Xstart等组件。安装Oracle时最关键的组件是Xshell和Xmanager Passive。Xshell负责SSH连接,Xmanager Passive负责接收服务器发来的图形显示请求。整个逻辑很简单:Oracle安装程序在服务器端运行时需要打开图形窗口,它通过SSH会话把图形渲染数据发到你本地电脑,Xmanager Passive在本地充当X Server,把窗口展示出来。你在本地窗口里点的每一个按钮,都会被传回服务器端程序,实现完整的远程图形交互。

之前我也试过用开源的Xming或者MobaXterm做类似的事,Xming的问题是配置比较麻烦,经常需要手动设置DISPLAY变量和访问控制;MobaXterm倒是开箱即用,但它集成了太多功能,单就纯图形转发稳定性来说,Xmanager的表现更让我放心。Xmanager家族里还有个Xstart工具,可以单独配置一个会话,直接通过图形界面启动远程应用,省去命令行设置,但用的核心机制都是X11转发。

1.2 版本与资源评估

Oracle 11g这个版本对系统资源的要求其实不高,官方文档里写的底线是1G内存,但实际部署时1G根本不够看,我建议至少2G,最好4G以上。内存不足的话,安装过程会非常卡顿,甚至出现莫名其妙的图形界面假死。磁盘方面,Oracle 11g完整安装大概需要5G左右的可用空间,加上Tomcat、JDK、日志和Oracle数据文件,最好预留至少30G空间。

还需要特别注意一个隐藏问题:Oracle 11g对Linux内核版本的兼容范围是2.6.x到早期3.x内核,CentOS 7使用3.10内核,理论上是可以跑的,但官方没有把CentOS 7列入正式支持列表。实操中只要把依赖包装全,跑起来完全没问题,这在很多企业里都验证过。

网络方面,服务器和你的本地电脑需要能够通过SSH正常通信,防火墙要放行22端口和X11转发所需的TCP端口。CentOS 7默认只开22端口,X11转发的通信走的是SSH隧道,不需要额外开端口,这比直接跑VNC要省心不少,也更安全。

2. 系统前置准备:依赖、目录和内核参数一步到位

Oracle 11g在CentOS 7上安装之所以容易翻车,90%的原因是系统依赖不完整。CentOS 7的默认软件源和Oracle官方要求的依赖包列表有出入,少装几个库文件就会在安装过程中报各种诡异的错误。

2.1 依赖包完整安装清单

我的习惯是直接用yum安装Oracle官方文档要求的全部依赖包,命令如下:

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

这里有几点要特别提醒。第一,compat-libstdc++-33这个包在默认源里可能找不到,如果报错,需要先安装EPEL源:

yum install -y epel-release yum install -y compat-libstdc++-33

第二,libXext、libXtst、libX11这几个包一定不能少,它们跟图形界面显示直接相关。我第一次装的时候就漏了libXtst,结果Oracle安装界面能弹出来,但鼠标点击没有任何反应,窗口半死不活,排查了半天才发现是少了个库。第三,ksh不是bash,Oracle的某些脚本在安装过程中会调用ksh解释器,CentOS 7默认不带这个包,不装的话后面运行root.sh时会报错。

2.2 用户、目录和内核参数配置

依赖装完后,先创建Oracle专用的系统用户和用户组。Oracle不允许用root账号直接安装,必须用普通用户,但需要给这个用户特殊的系统权限:

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

目录规划上,我习惯把Oracle软件和数据文件都放在/u01下,因为根分区的空间一般比较紧张,而且Oracle的ORACLE_BASE路径不能有中文和空格。/u01单独划一个分区或者直接用根分区的子目录都可以,但要注意df -h查看一下空间余量。

接下来调整内核参数,编辑/etc/sysctl.conf文件,追加以下内容:

fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmni = 4096 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 fs.aio-max-nr = 1048576 net.ipv4.ip_local_port_range = 9000 65500

然后执行sysctl -p让它生效。关于共享内存参数,这是Oracle最容易忽略的一项。shmmax表示单个共享内存段的最大大小,建议设为物理内存的一半,单位是字节。比如8G内存,就设成4294967296。shmall是共享内存页总数,一般是shmmax除以4096。如果这两个参数配得太小,Oracle启动数据库时会直接报ORA-27102错误,提示out of memory。

接下来限制oracle用户的进程数和文件打开数,编辑/etc/security/limits.conf,追加:

oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536

同时编辑/etc/pam.d/login,确认包含这一行:

session required /lib64/security/pam_limits.so

2.3 关闭SELinux和防火墙

CentOS 7默认开启SELinux,这会拦截Oracle创建文件和管理进程的大量操作。虽然也可以配SELinux策略让Oracle跑起来,但生产上很少有人这么干,基本都是直接关闭。

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0

防火墙方面,如果想省事,直接关掉再装:

systemctl stop firewalld systemctl disable firewalld

但生产环境我建议只关Oracle和Tomcat要用的端口,1521和8080:

firewall-cmd --zone=public --add-port=1521/tcp --permanent firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload

还有一个细节,/etc/hosts文件一定要配好,主机名要能正确解析到内网IP。我之前在这个文件上栽过跟头,/etc/hosts里没有本机的主机名记录,Oracle安装时网络配置检查直接报错,说无法解析主机名。正确写法类似:

192.168.1.100 db-server

主机名用hostname命令查看确认一致,这样才能过检查。

3. 用Xmanager图形化安装Oracle 11g全流程

前面所有前置工作做完后,接下来就是整个流程中最核心的部分:通过Xmanager拉起Oracle的图形安装界面。这个过程我拆解成两个阶段:先确保X11转发链路通,再跑runInstaller完成安装。

3.1 X11转发链路搭建与验证

安装包我提前下载好放在服务器/opt目录下。Oracle 11g R2的Linux x64安装包有两个zip文件:linux.x64_11gR2_database_1of2.zip和linux.x64_11gR2_database_2of2.zip,解压后合并到同一个database目录里。

unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip

合并之后会在/opt生成database目录,里面有个runInstaller脚本。然后打开本地电脑的Xshell,新建SSH连接,在连接属性里找到"隧道"或"转发"设置,勾选"转发X11连接到localhost",这个是Xmanager能弹出图形窗口的关键开关。完成这一步后,先不要急着跑Oracle安装程序,用一个小命令验证链路通不通:

xclock

如果Xmanager Passive托盘上出现了时钟小窗口,说明X11转发已经通了。如果提示xclock command not found,先yum install -y xclock。如果弹不出来,需要检查oracle用户的DISPLAY变量设置:

echo $DISPLAY

好多人卡在这个阶段,我仔细说一下原因和判断逻辑。X11转发的原理是:SSH服务器端把图形请求通过SSH隧道转发到客户端,Xmanager在本地创建一个虚拟X Server来渲染这些图形请求。你本地电脑相当于图形终端,但服务器端程序认为它在本地显示。普通的SSH连接会默认设置DISPLAY变量,但如果在Xshell里没勾选转发X11,或者本地的Xmanager Passive没运行,就弹不出窗口。

还有一种情况是Oracle安装程序弹不出来,但xclock能弹出来。这种一般不是转发链路的问题,而是Oracle的Java环境变量或者字体问题。后面我会在问题排查部分专门说。

3.2 runInstaller安装界面逐步操作

确认X11转发正常后,切换到oracle用户执行安装脚本:

su - oracle cd /opt/database ./runInstaller

这时候本地电脑的屏幕上应该会弹出Oracle Universal Installer的主窗口。出现窗口后,那一长串检查选项全部按规范走。安装选项选择"仅安装数据库软件",企业版;Oracle主目录路径填/u01/app/oracle/product/11.2.0/dbhome_1,这个路径后面配置环境变量时会用到;操作系统组选择dba和oinstall;执行安装前,OUI会弹出对话框要求确认inventory目录路径,默认是/u01/app/oraInventory,确认即可,随后会自动进行环境检查。

如果环境检查有某项标红,比如依赖缺失或内核参数不对,不要硬着头皮继续,先点击"Check Again"重新检测。我之前在内核参数上漏了一项,导致网络配置检查失败,修改后再点一次就通过了。检查过程中如果界面长时间不动,不要着急关窗口,它可能在后台安装依赖文件,稍微等一会儿。

安装进度走到100%时,OUI会提示你以root身份执行两个脚本:orainstRoot.sh和root.sh。打开另一个SSH窗口,root登录后依次执行:

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

root.sh脚本执行时会问你是否把Oracle设为开机自启动,我一般选N,因为后面我用systemd管理,避免脚本自动配置的启动机制和服务冲突。执行完毕后回到OUI窗口点击OK,完成安装。

3.3 配置监听和建库

软件装完只是第一步,还要配置网络监听并建库才能连上。先在root窗口执行:

su - oracle netca

netca会拉起Oracle Net Configuration Assistant图形界面,同样通过Xmanager显示。监听配置我建议全用默认值:监听名称LISTENER、端口1521、协议TCP。配置好后,用lsnrctl status确认监听状态,显示"Service LISTENER has 4 instance(s)"或者"Waiting for connections"就说明监听正常。

接下来用dbca建库,同样通过Xmanager弹出图形界面:

dbca

建库时几个关键选项说一下。数据库模板选择"一般用途或事物处理",这是日常使用最通用的模板。数据库标识符这块要特别注意,全局数据库名和SID保持一致,比如都叫orcl,避免后续连接时搞混。管理选项里启用EM Database Express,这个是Oracle 11g自带的管理界面,后面可以用浏览器访问,端口默认5500。口令管理里给SYS和SYSTEM用户设置密码,需要记住,后面配置数据源、连接测试都会用到。

数据文件存放位置默认就行,放在ORACLE_BASE/oradata目录。建库过程大约需要15到30分钟,期间进度条会走走停停,属于正常现象。如果建库过程中断或者报错,大多是内存不足,回到第2章排查内核参数和内存配置。建库完成后,用sqlplus验证一下:

sqlplus / as sysdba SQL> select status from v$instance;

看到OPEN状态,说明数据库正常运行,Oracle安装流程到此结束。

3.4 配置oracle用户环境变量

为了让oracle用户每次登录都能直接使用sqlplus、dbca、netca等命令,需要在/home/oracle/.bash_profile里配置环境变量:

export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=orcl export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

配置完执行source ~/.bash_profile生效。ORACLE_SID这个变量容易漏,如果不设置,sqlplus / as sysdba连接时会提示找不到Oracle实例。

4. Tomcat 9 + JDK 8部署与Oracle对接

数据库稳定运行后,接下来部署Java运行环境和Tomcat容器。这一步相对简单,但如果遇到Tomcat无法连接Oracle的问题,基本都是JDK版本和驱动包惹的祸。

4.1 JDK部署与环境变量配置

我用的是jdk-8u202-linux-x64.tar.gz,考虑到Tomcat 9对JDK版本的要求是8或更高,配这个版本兼容性最好。把安装包放在/opt下,解压到自定义目录:

tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/ ln -s /usr/local/jdk1.8.0_202 /usr/local/java

配置Java环境变量,编辑/etc/profile:

export JAVA_HOME=/usr/local/java export JRE_HOME=$JAVA_HOME/jre export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

source /etc/profile后执行java -version,能显示java version "1.8.0_202"就算成功。JDK环境变量一定要放在/etc/profile里或者tomcat用户的bash_profile里,不能只放Tomcat的setclasspath.sh里,否则systemd启动Tomcat时可能加载不到。

4.2 Tomcat安装与配置

Tomcat安装包用apache-tomcat-9.0.80.tar.gz,解压到/usr/local/:

tar -zxvf apache-tomcat-9.0.80.tar.gz -C /usr/local/ cd /usr/local/apache-tomcat-9.0.80

开始配置前先把JAVA_HOME和JRE_HOME写进Tomcat的启动脚本里,看着很简单,但很多人会直接省掉,导致Tomcat启动时报"Neither the JAVA_HOME nor the JRE_HOME environment variable is defined"。

export JAVA_HOME=/usr/local/java export JRE_HOME=/usr/local/java/jre

然后需要把Oracle JDBC驱动包放进来。这个环节最容易出错,Tomcat官方自带的是tomcat-jdbc.jar,但连接Oracle需要的是Oracle官方提供的ojdbc驱动。我用的是ojdbc8.jar,对应JDK 8和Oracle 11g完全没有问题。把驱动放到$CATALINA_HOME/lib下:

cp ojdbc8.jar /usr/local/apache-tomcat-9.0.80/lib/

启动Tomcat之前,先检查server.xml里的端口冲突。我习惯把8080端口改成8088,避免和其他Java应用冲突:

<Connector port="8088" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

配置好后启动Tomcat:

/usr/local/apache-tomcat-9.0.80/bin/startup.sh

启动后查看catalina.out日志确认没有异常,然后访问http://服务器IP:8088,能打开Tomcat默认首页就说明Tomcat部署完成。

4.3 部署应用并连通Oracle数据库

Tomcat和Oracle的连通性主要靠数据源配置。如果你用的是SpringBoot或SpringMVC项目,数据源配置写在application.properties里,核心是这几个参数:

jdbc.driver=oracle.jdbc.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.1.100:1521:orcl jdbc.username=system jdbc.password=你的密码

如果没有现成的应用,建议先写一个简单的JSP页面测试数据库连接。在Tomcat的webapps/ROOT下新建test.jsp:

<%@ page import="java.sql.*" %> <% Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.100:1521:orcl", "system", "你的密码"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select 1 from dual"); rs.next(); out.println("Oracle connection ok"); conn.close(); %>

访问http://服务器IP:8088/test.jsp,页面输出Oracle connection ok就说明整条链路完全打通。这一步我强烈建议亲自做一下,它能一次性验证JDBC驱动、数据库监听、账号权限、网络连通性,任何一个环节有问题都会在这里暴露。

4.4 配置Tomcat开机自启动

为了让Tomcat在服务器重启后自动运行,我给它配置了systemd服务。编辑/etc/systemd/system/tomcat.service:

[Unit] Description=Apache Tomcat After=network.target [Service] Type=forking Environment=JAVA_HOME=/usr/local/java Environment=CATALINA_HOME=/usr/local/apache-tomcat-9.0.80 Environment=CATALINA_BASE=/usr/local/apache-tomcat-9.0.80 ExecStart=/usr/local/apache-tomcat-9.0.80/bin/startup.sh ExecStop=/usr/local/apache-tomcat-9.0.80/bin/shutdown.sh User=root Group=root Restart=always [Install] WantedBy=multi-user.target

执行systemctl daemon-reload,再执行systemctl enable tomcat设置开机自启动。

5. 常见问题与排查技巧实录

整个流程走下来,我踩了不少坑,也帮别人排查过类似环境下的部署问题,这里集中整理一下高频故障和解决思路,按影响程度从高到低排列。

5.1 Oracle图形界面弹不出来的排查

这是最高频的问题。现象是xclock能弹出来,但runInstaller主窗口死活不出现,或者出现了但按钮点不动。

原因有几个,按出现概率排序:一是DISPLAY变量没有正确继承,解决办法是在oracle用户的bash_profile里固定写死,示例:

export DISPLAY=你的本地电脑IP:0.0

这个值不用改,前提是Xshell勾选了X11转发。

二是oracle用户权限不够连本地X Server。如果你用xhost命令,要保证本地电脑的X Server地址在访问控制列表里。Xmanager Passive默认是允许所有连接,但如果之前装过其他X Server,可能会有权限残留。我遇到过一次,xhost +强制放开后问题消失。

三是OUI的Java界面卡死,这多半是缺少某些图形相关的库。检查/lib中libXp.so.6是否存在,Oracle 11g特别依赖这个旧库。正常情况下CentOS 7不自带它,需要下载安装libXp-1.0.2版本,解压后把libXp.so.6拷到/usr/lib64/下。

5.2 磁盘空间和内存问题的排查

Oracle 11g安装时对磁盘空间检查非常严格。有次我在真实服务器上部署时,安装界面反复提示/tmp空间不足,但df -h看/tmp明明还有2G。后来发现Oracle检查的是/opt目录剩余空间,我解压安装包到/opt时把空间用满了。处理办法是安装包解压后,把database目录挪到磁盘空间大的分区再执行runInstaller。

内存问题也很典型。如果你的服务器内存只有2G,Oracle安装界面会出现窗口加载缓慢、点击后10秒才有反应的状况。更可怕的是dbca建库时直接报ORA-4031,表示共享池分配失败。4G内存的服务器建库时要控制SGA大小,我一般设成物理内存的40%左右,比如2G内存就设800M,4G内存设1.6G,不要贪心。

5.3 Tomcat连接Oracle时的报错排查

最常见的是ClassNotFoundException: oracle.jdbc.OracleDriver,几乎可以断定是ojdbc驱动没放到lib目录下,或者放错了位置。放到CATALINA_HOME/lib目录后重启Tomcat,这个错就能解决。

如果是连接超时或者提示ORA-12505,TNS监听器无法识别数据库实例,需要检查连接串里的SID是否和实际一致。用lsnrctl status查看当前注册的SERVICE名字,确认是orcl还是ORCL,区分大小写,然后对应修改连接串。

还有ORA-28009这个错,是Oracle 11g对system用户使用sysdba角色连数据库的限制。如果你连的是system账号,连接串里不要加role=SYSDBA,改成普通连接:

jdbc.url=jdbc:oracle:thin:@192.168.1.100:1521:orcl

5.4 局域网内其他机器连不上Oracle的排查

数据库装好后发现本机能连,但局域网内其他机器连不上,基本是防火墙或监听配置问题。先检查监听地址是不是localhost,如果是,要改成数据库服务器的实际IP。最简单的方式是修改$ORACLE_HOME/network/admin/listener.ora,把LISTENER条目下的HOST字段改成服务器实际IP,重启监听。

另外确认1521端口是否被防火墙拦截,执行firewall-cmd --list-all看8088和1521有没有在端口列表里。如果端口被占用,用netstat -tlnp查一下是谁占了1521,改端口后要同步修改Tomcat连接串。

5.5 开机自启动顺序问题的避坑经验

Oracle和Tomcat都设置开机自启动后,如果Tomcat起来得比数据库监听还早,应用连数据库时会失败,但Tomcat本身看起来是正常的。我实际遇到过一次,因为Tomcat服务没有声明对Oracle的依赖。解决的笨办法是给Tomcat的服务Unit里加一个延时:

ExecStartPre=/bin/sleep 30

这台服务器上Oracle用systemctl管理的话,更规范的做法是配置After=oracle.service,确保数据库先启动。如果Oracle是脚本方式开机自启,没法用systemd控制顺序,sleep 30就是最有效的手段。缺点是每次都多等30秒,但换来的是数据库稳定连接。

5.6 一张表总结常见错误信息和处理动作

错误现象可能原因处理手段
图形窗口弹不出来DISPLAY未设置、X11转发未开启检查Xshell转发选项,echo $DISPLAY确认变量
窗口能开但按钮无响应缺libXp库补装libXp并拷贝so文件到/usr/lib64
环境检查某项标红依赖缺失或参数配置不到位按第2章清单逐项核对并修正
ORA-27102内存不足shmmax和shmall设置偏小按物理内存重新计算并调整内核参数
ClassNotFoundException没放ojdbc驱动或放错位置把ojdbc8.jar放到CATALINA_HOME/lib
ORA-12505连接失败SID写错或监听未识别查lsnrctl status获取正确SERVICE名
ORA-28009授权错误system账号使用了SYSDBA角色连接参数里去掉role=SYSDBA
局域网机器无法连接防火墙拦截或监听绑定了localhost防火墙放行1521,监听地址改为实际IP
Tomcat起来了但连不上库启动顺序问题systemd配置After依赖或加ExecStartPre延时

我个人在实际操作中还有一个习惯:每次部署完Oracle,第一时间做一次冷备份的模拟演练,确认expdp导出和impdp导入命令可用,因为生产环境的数据比安装过程本身更珍贵。另外Xmanager这个工具在整套流程里的价值很难替代,它解决的不只是Oracle安装,后续日常维护里如果想跑一些需要图形界面的Oracle工具,一样可以用它拉起来,省心很多。最后再分享一个搭配技巧:把Xshell的会话保存好,隧道设置里勾上转发X11,后续每次连接服务器都有图形能力,不用反复配置,值得养成习惯。

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

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

立即咨询