最近接到一个任务:在一台全新的CentOS 7服务器上,通过xmanager把Oracle 11g的图形安装器拉起来,装好数据库之后再部署Tomcat,跑通整个业务流程。说实话,Oracle 11g这套老家伙在CentOS 7上装起来并不轻松,坑一个接一个;而Tomcat相对简单,但要把两者串起来,中间有不少细节容易卡壳。这篇文章就是一份完整到可以直接照着操作的全流程记录,写给那些和我一样,手里既没有显示器、又不想折腾VNC的兄弟们。
如果你也在内网服务器上装过Oracle 11g,应该知道最头疼的不是命令本身,而是安装界面怎么弹出来。Xmanager在这个场景里算是比较顺手的方案:Windows客户端装Xmanager,远程通过X11协议把Oracle的图形界面拉到本地,配置比VNC简单,而且和Xshell配合得很舒服。这套流程跑下来,我前后花了大半天时间,其中一半耗在环境准备和各种诡异的报错上。下面的步骤我尽量把坑提前排掉,让你能少走弯路。
1. 为什么选Xmanager,以及这套方案的适用边界
1.1 这台服务器是什么情况
先说下我的环境。服务器是内网的一台戴尔机器,系统是CentOS 7.9 x86_64,CPU 4核,内存8G,磁盘给 /opt 分了50G。数据库版本选的是Oracle 11g R2 11.2.0.4,这个版本是11g系列里最成熟、网上资料最多的一个;Web容器用Tomcat 9,JDK用1.8。选这些组合的原因是业务系统比较老,很多兼容性问题只有这套组合能兜住。
如果你手里是一台2C4G的小机器,装Oracle 11g也能跑,但建议Swap给到4G,SGA别超过1.5G,否则后期DBCA建库很容易报错。内存8G是我认为比较舒服的底线,因为Oracle 11g安装器本身很吃内存,再加上Tomcat和系统本身,低于4G基本是折磨自己。
1.2 为什么不用VNC而用Xmanager
其实VNC也能干这事,但我在这次任务里选了Xmanager,原因有三个。
第一,VNC需要在服务器上装服务端、配桌面环境、设置systemd服务,还要处理登录认证。服务器没有装图形桌面,用VNC就得先装个GNOME或者Xfce,太重了。Xmanager只需要在Windows端装一个客户端,服务器端只要装好X11相关的xauth和字体包就行,不需要完整桌面。
第二,VNC走的是独立VNC协议,穿透防火墙和NAT要额外配置,Xmanager走的是SSH X11转发,只要22端口通,图形界面就能拉到本地。内网环境里这几乎零成本。
第三,Xmanager和Xshell来自同一家,手里本来就有Xshell管理服务器,再开个Xmanager非常自然。Xmanager开机后在Passive模式常驻,Xshell里勾上X11转发,运行图形程序时窗口直接跳到Windows桌面,体验和本地差不多。
当然,Xmanager是商业软件,需要授权。如果公司没有,用开源的VNC或者其他X Server也可以,底层逻辑一样。本文按Xmanager讲,但里面的原理和大多数坑是通用的。
1.3 版本组合与准备工作清单
在动手之前,先把需要用到的文件准备好:
| 角色 | 版本/文件 | 说明 |
|---|---|---|
| 操作系统 | CentOS 7.9 x86_64 | 内核3.10,和11g兼容性全靠补依赖 |
| 数据库 | Oracle 11.2.0.4 Linux x64 | 两个zip包,约2GB |
| 客户端 | Windows 10 + Xmanager 7 | 最好和Xshell配套 |
| JDK | Oracle JDK 8u202 | Tomcat运行需要 |
| Tomcat | apache-tomcat-9.0.73 | 长期支持版本 |
| JDBC驱动 | ojdbc6.jar | 让Tomcat连Oracle用的 |
服务器端需要能联网,至少能访问内网yum源,因为安装过程中要装很多依赖包。如果服务器完全离线,就需要提前准备好依赖rpm。这个我放在第二章细说。另外,Oracle 11g在CentOS 7上并不是官方支持的组合——Oracle官方只支持到RHEL 6,所以下面的做法本质上是在“非官方环境”上强行跑,适合测试、准生产或内部系统。如果是银行、医疗之类的正经生产环境,建议要么换Oracle 12c以上,要么用Oracle Linux。
2. 系统底子不打好,后面步步是坑
2.1 网络与防火墙策略调整
Oracle安装过程要对外开发1521端口(监听器)和可能用到的其他端口;Tomcat要开发8080端口。为了不让防火墙成为排查变量,我直接把firewalld关掉了。
systemctl stop firewalld systemctl disable firewalld同时SELinux也建议关掉。Oracle 11g安装器和CentOS 7默认的SELinux策略之间的问题很玄学,比如明明权限对了还是会报“ Permission denied”,查半天都查不出原因。既然是内网服务器,我直接修改/etc/selinux/config:
SELINUX=disabled然后执行setenforce 0让当前会话立即生效。注意,如果只改了配置文件不重启,当前系统还是Enforcing模式;setenforce 0只是临时生效,重启后配置文件接管。装完Oracle和Tomcat之后再决定是否重新开启,本文按关闭讲。
2.2 依赖包一次性装齐
Oracle 11g的安装器要求一堆老掉牙的依赖包,CentOS 7默认仓库里有一部分,但有两个很容易缺:compat-libcap1和compat-libstdc++-33。另外,Oracle 11g虽然是64位软件,但安装过程里会调用大量32位的辅助程序,所以32位兼容库也是刚需。
我在命令行里直接执行:
yum install -y binutils compat-libcap1 compat-libstdc++-33 \ gcc gcc-c++ glibc glibc-devel libaio libaio-devel \ libgcc libstdc++ libstdc++-devel libXext libXtst libXau libXi \ libXrender make net-tools sysstat ksh如果 yum 提示No package compat-libstdc++-33 available,说明你的源里没有这个包。CentOS 7的官方源里确实没有它,建议先安装epel源再试:
yum install -y epel-release如果还是不行,就只能从网上下载老版本的rpm手动安装。这里有个小提醒:compat-libstdc++-33在64位系统上装64位版本就行,但有些机器会同时需要32位版本,报错时再补。
接下来是两个极易被忽略的包:
yum install -y xorg-x11-xauth xorg-x11-fonts-*xorg-x11-xauth是X11认证必需的,没有它Xmanager的转发会报“Authorization required”。xorg-x11-fonts-*是字体包,远程X转发时如果缺字体,Oracle安装界面会出现一行行的方块或者乱码,看着非常头疼。
再补一组32位库。这一步是我在一台机器上踩坑后总结出来的:
yum install -y glibc.i686 libaio.i686 libXext.i686 libXtst.i686 \ ncurses-libs.i686 gcc-c++.i686为什么强调这个?因为Oracle 11g安装器在链接阶段会调用32位的库,如果缺少,就会出现后面第四章那个经典的makefile 'all_no_orcl'报错。提前装上,能省一次返工。
2.3 内核参数、用户组和目录权限
安装Oracle必须创建专用用户,不能直接用root。我按Oracle官方的惯例来:
groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle目录规划也很重要。我把所有Oracle相关文件放在/opt/oracle下:
mkdir -p /opt/oracle/oracle_home mkdir -p /opt/oracle/data mkdir -p /opt/oracle/install chown -R oracle:oinstall /opt/oracleoracle_home是Oracle软件安装目录,data放数据文件,install放安装包和解压文件。实际生产中数据文件可能放在独立存储上,但这里先按单机磁盘来。
然后修改/etc/sysctl.conf,加入以下内容:
fs.aio-max-nr=1048576 fs.file-max=6815744 kernel.sem=250 32000 100 128 kernel.shmall=2097152 kernel.shmmax=536870912 kernel.shmmni=4096 net.core.rmem_default=262144 net.core.rmem_max=4194304 net.core.wmem_default=262144 net.core.wmem_max=1048576 net.ipv4.ip_local_port_range=9000 65500保存后执行sysctl -p立即生效。这里重点解释一下kernel.shmmax和kernel.shmall。shmmax是单个共享内存段的最大字节数,我设了512M(536870912字节),如果物理内存是8G,这个值不要超过内存的一半。shmall是共享内存页总数,设成2097152页(默认页大小4K),等于8G。Oracle的SGA就是通过共享内存实现的,设小了会报ORA-27125或者无法分配共享内存。
同时修改/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 32768nofile是文件描述符限制,Tomcat连接Oracle时线程多、连接数多,如果限制太小会出现“Too many open files”。nproc是进程数限制,Oracle的ASM等进程很吃这个。改完后需要重新登录oracle用户才会生效,可以用ulimit -a验证。
2.4 hosts文件与主机名检查
这个坑必须要单独拿出来说。Oracle 11g的监听器对主机名解析有依赖,如果/etc/hosts里主机名和IP对不上,监听只监听在127.0.0.1上,远程永远连不上。
我先把主机名设置了:
hostnamectl set-hostname oratest然后编辑/etc/hosts:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.100 oratest.example.com oratest注意,主机名里不要带下划线,比如oracle_test这种,Oracle的安装器可能直接报错。同时还要保证hostname命令输出的内容和/etc/hosts里第二列保持一致。
检查方式很简单:
hostname ping $(hostname)如果 ping 显示的是192.168.1.100而不是127.0.0.1,说明映射正确。这个步骤直接影响后面DBCA建库和远程连接,别跳过。
3. Xmanager图形会话建立:到底选Xstart还是Xshell的SSH隧道
3.1 Xmanager Passive模式与DISPLAY规则
Xmanager安装好之后,默认会有一个Xmanager - Passive的会话模式,只要启动它,你的Windows机器就会作为一个X Server在后台运行,理论上只监听本地回环地址,SSH转发时会自动把数据接过来。
很多新手不理解“DISPLAY”到底是什么,可以简单理解为:远程程序需要知道往哪块“屏幕”上画窗口。DISPLAY的值通常长这样localhost:10.0,表示X显示服务在本地6000端口上,编号10,显示器0。通过SSH X11转发时,SSH服务端会动态分配一个Display编号,从10开始往上排。你不需要自己手动设置,SSH会自动帮你配置好。
但有个前提:服务器的SSH配置必须允许X11转发。查看/etc/ssh/sshd_config,确保有这两行:
X11Forwarding yes X11UseLocalhost yes改完要重启sshd:
systemctl restart sshd3.2 用Xstart启动oracle用户图形环境
Xmanager自带的另一个工具叫Xstart,专门用来启动远程X应用。我的配置是这样的:
- 协议:SSH
- 主机:192.168.1.100
- 端口:22
- 用户名:oracle
- 认证:Password
- 执行命令:
/usr/bin/xterm -ls
连接成功后,Windows桌面上会弹出一个xterm终端窗口。注意,这一步我没有直接启动runInstaller,而是先启动xterm,理由是安装Oracle时需要多次点击下一步、选择目录,如果在xterm里操作,环境变量和当前目录都保持着,比每次重新配置Xstart要方便得多。
连上后,在xterm里执行:
echo $DISPLAY如果输出类似oratest:10.0,说明X11转发已经成功。如果你看到的是空输出或者DISPLAY not set,说明xauth或sshd配置没生效,回3.3排查。
这里再多说一句,Xstart里的“执行命令”也可以直接填xterm -ls -display 127.0.0.1:0之类,但在Passive模式下,没必要手动指定DISPLAY,SSH转发已经做了全套。手动指定反而可能因为X认证失败而连不上。
3.3 DISPLAY没生效的排查套路
我在第一次试验时遇到过窗口完全弹不出来的情况,报错是:
Xlib: connection to "localhost:10.0" refused by server Xlib: No protocol specified这个问题的根子通常在“X11转发链路没打通”和“Windows防火墙拦了TCP 600x端口”。按顺序排查:
第一步,确认Xmanager处于Passive模式。看Windows右下角托盘有没有Xmanager的图标,如果没有,单独启动一下。
第二步,在服务器上安装xauth,很多精简系统没有这个包:
yum install -y xorg-x11-xauth第三步,检查Windows防火墙是否允许Xmanager监听。如果你用的是SSH转发模式,理论上不需要开放6000端口,但如果你手动用DISPLAY指定了Windows IP,就必须放行。
第四步,用ssh -X手动测试:
ssh -X oracle@192.168.1.100 xterm如果这个都弹不出来,那就是sshd配置或xauth的问题;如果这个能弹出来,说明Xstart配置有问题。
我那次问题出在/etc/ssh/sshd_config里多了一行X11UseLocalhost no,导致DISPLAY变成了远程主机名而不是localhost,X认证对不上。改成X11UseLocalhost yes就没问题了。这类玄学问题,最有效的验证方法就是把变量一减到底。
4. Oracle 11g安装器全流程实战
4.1 解压安装包和runInstaller的启动方式
把两个zip包上传到/opt/oracle/install后,先解压:
cd /opt/oracle/install unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip解压完成后,会生成一个database目录,里面就是安装器。记得把整个目录属主改成oracle:
chown -R oracle:oinstall /opt/oracle/install/database然后切换到oracle用户:
su - oracle cd /opt/oracle/install/database ./runInstaller很多人会用./runInstaller -ignoreSysPrereqs跳过环境检查,我建议先不加这个参数,让安装器自检一遍。如果前面依赖包装齐了,自检一般只会提示几个可忽略项。启动方式看似简单,但有一个前提:你必须在X11转发环境里执行,否则会直接报:
DISPLAY not set. Please set DISPLAY.如果在xterm里执行,就不会有这个问题。
4.2 安装选项:从“仅安装数据库软件”到DBCA
runInstaller启动后,第一屏可能会问是否接收安全更新,网络环境不好的话直接跳过。接着要选安装类型:
- “Install database software only” —— 只装数据库软件,不建库。
- “Install database and configure” —— 软件和实例一起装。
我强烈建议选第一项“Install database software only”,然后用DBCA单独建库。理由是安装器自动建库时往往会探测监听状态、分配SGA,任何一个环节出问题都要从头跑;分开来做,每一步都可以单独验证,排查范围小很多。
之后选“Single instance database installation”,然后选语言。这里选English和Simplified Chinese都行,安装器界面的语言和你后续数据库字符集没有直接关系,数据库字符集是DBCA里单独配的。
再下一步是选择企业版。Oracle 11g只有企业版,这个没啥好纠结。接着填入Oracle基目录和Oracle主目录:
- Oracle Base:
/opt/oracle - Software Location:
/opt/oracle/oracle_home
安装器会检查环境,如果有未通过的项,点击“Ignore All”继续。但如果你看到compat-libstdc++-33缺失,建议还是回去装上,硬着头皮继续很容易在最后阶段翻车。
4.3 关键配置:字符集、监听端口、内存管理
虽然安装软件阶段还不需要配置数据库字符集和内存,但有几个点现在想清楚,后面建库才不慌。
字符集这块,如果你的业务系统要存中文,数据库字符集一定要选AL32UTF8。很多老系统为了省空间用了ZHS16GBK,导致后续迁到云上变成乱码,非常痛苦。Oracle 11g的AL32UTF8支持完整Unicode,和Java应用对接也最顺手。
监听端口默认是1521。如果你机器的1521被占了或者想避开扫描,可以改1522,但后面所有连接串、防火墙规则都要跟着改。本文按1521讲。
内存管理方面,Oracle 11g支持自动内存管理(AMM),也就是MEMORY_TARGET参数。在8G内存的机器上,我建议给Oracle分配的SGA+PGA总量在3G到4G之间。如果设太大超过共享内存限制,DBCA建库会报ORA-27125,这里在第5章专门讲。
4.4 安装中段最常见的makefile报错与修复
软件安装到大约75%的位置,有相当高的概率会遇到这个报错:
Error in invoking target 'all_no_orcl' of makefile '/opt/oracle/oracle_home/rdbms/lib/ins_rdbms.mk'错误日志里通常会跟着libnnz11.a或者libclntsh.so相关字样。别慌,这个不是Oracle许可证问题,也不是硬件问题,绝大多数是因为32位库没装齐。我当时在一台机器上补装了这些后重试就成功了:
yum install -y libaio.i686 glibc-devel.i686 ncurses-libs.i686如果补了库之后,安装器还是卡在同一个位置,可以手工进入目录执行make命令来定位具体依赖:
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk client_shared它会直接打印缺失的符号或头文件。看到ld: cannot find -l...什么库,就装对应的包。这种手工make的方式在每次安装时都很有用,比反复重跑runInstaller快得多。
还有另一种情况是make时提示-lclntsh找不到,这通常是Oracle主目录的lib目录下连接库没创建。可以执行:
cd $ORACLE_HOME/bin ./relink all重新链接所有Oracle命令,能解决不少玄学问题。
5. Oracle实例创建与Tomcat部署衔接
5.1 DBCA建库,字符集AL32UTF8如何选
软件安装完成后,回到xterm里运行dbca:
dbca如果环境变量没配好,会提示找不到dbca命令。这时先确认$ORACLE_HOME/bin在PATH里,没有就手动执行:
export ORACLE_HOME=/opt/oracle/oracle_home export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/libDBCA弹窗后,我选择了“Create a Database”,数据库模板选“General Purpose”,这个模板适合大多数业务系统。然后设置:
- Global Database Name:
orcl.example.com,SID:orcl - 管理选项:取消Enterprise Manager配置,省得额外起一堆进程
- 数据库口令:SYS和SYSTEM分别设置强密码
- 存储类型:文件系统
- 数据文件位置:
/opt/oracle/data - 字符集:
AL32UTF8,国家字符集:AL16UTF16
建库过程中,DBCA会启动实例,分配SGA,创建数据字典。这一步一般持续10到20分钟。完成后,DBCA会提示执行alter user sys account unlock之类的选项,按需处理。
建库完成后,先用sqlplus看实例状态:
sqlplus / as sysdba SQL> select status from v$instance;如果返回OPEN,说明实例没问题。再确认监听:
lsnrctl status看到 “Service 'orcl' has 1 instance(s)” 就说明监听也正常。
5.2 环境变量与开机自启脚本
安装好Oracle之后,必须把环境变量固化到oracle用户的配置里,否则每次登录都要手动source。编辑/home/oracle/.bash_profile,加入:
export ORACLE_BASE=/opt/oracle export ORACLE_HOME=/opt/oracle/oracle_home export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib export NLS_LANG=AMERICAN_AMERICA.AL32UTF8NLS_LANG影响sqlplus显示中文的编码,如果不设置,查询中文数据可能出现乱码。AMERICAN_AMERICA.AL32UTF8是业界最常见的组合。
然后是开机自启。编辑/etc/oratab,把这一行的最后一个字段改成Y:
orcl:/opt/oracle/oracle_home:N改成:
orcl:/opt/oracle/oracle_home:Y接下来编辑/etc/rc.d/rc.local:
su - oracle -c "lsnrctl start" su - oracle -c "dbstart"给rc.local执行权限:
chmod +x /etc/rc.d/rc.localdbstart会读取oratab,启动标记为Y的实例。这里要注意,dbstart的日志在$ORACLE_HOME/startup.log,如果重启后没起起来,先看这个文件。
5.3 部署Tomcat:JDK版本和CORS、UTF-8这些细节
Tomcat部署和Oracle比起来轻松很多。把jdk和tomcat包解压到 /opt 下:
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt tar -zxvf apache-tomcat-9.0.73.tar.gz -C /opt mv /opt/apache-tomcat-9.0.73 /opt/tomcat设置JDK环境变量,修改/etc/profile或/home/tomcat/.bash_profile:
export JAVA_HOME=/opt/jdk1.8.0_202 export PATH=$JAVA_HOME/bin:$PATH export CATALINA_HOME=/opt/tomcat我这次创建了一个专门的tomcat系统用户来跑Tomcat,没有直接用oracle用户。虽然oracle和tomcat放在同一台机器上,但数据库用户和应用容器用户分开管理更清爽,也避免一个用户权限过大。
useradd -r -s /bin/false tomcat chown -R tomcat:tomcat /opt/tomcatTomcat的内存参数编辑/opt/tomcat/bin/catalina.sh,在文件开头加:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m -Dfile.encoding=UTF-8"关于编码,Tomcat 9默认已经是UTF-8,但老项目里可能在server.xml里配置过URIEncoding="GBK",必须改回来。打开/opt/tomcat/conf/server.xml,找到Connector节点,加上或确认:
URIEncoding="UTF-8"如果应用服务器要接收POST参数,body编码也要在web.xml里配置CharacterEncodingFilter,这是应用层面的事,但Tomcat侧先保证能传输UTF-8。
5.4 让Tomcat能连上Oracle:JDBC驱动和连接池配置
先把ojdbc6.jar放到Tomcat的lib目录:
cp ojdbc6.jar /opt/tomcat/lib/ojdbc6.jar对应JDK 8,如果你用的是ojdbc8.jar,也能连11g,但建议保持版本匹配。至于为什么不用ojdbc6之外的版本,因为Oracle 11g官方JDBC驱动就是ojdbc6,何必给自己加戏。
放好驱动后,我选择在/opt/tomcat/conf/context.xml里配置JNDI数据源,这样应用代码里不用写死连接地址,后期换库很方便。在<Context>节点内加入:
<Resource name="jdbc/orcl" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@//localhost:1521/orcl" username="tomcatuser" password="你的密码" maxTotal="20" maxIdle="10" maxWaitMillis="10000"/>连接串里有两种写法,很容易搞混:
- 服务名方式:
jdbc:oracle:thin:@//localhost:1521/orcl - SID方式:
jdbc:oracle:thin:@localhost:1521:orcl
DBCA默认创建的是服务名,所以用//localhost:1521/orcl。如果你用的是SID方式,用冒号分隔。
然后在数据库里创建业务用户:
create user tomcatuser identified by "你的密码"; grant connect, resource to tomcatuser;如果应用不仅查数据还要建表,还需要额外grant unlimitted tablespace。这一步在DBCA权限最小化原则下需要按需授予。
应用代码里通过JNDI获取连接池数据源的方式:
Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/orcl"); Connection conn = ds.getConnection();这样Tomcat就能通过连接池访问Oracle了。
6. 最后过一遍验证链路,以及我踩过的坑
6.1 从Tomcat到Oracle的完整验证
整套环境装完后,不能只看进程活着就算成功,必须从Tomcat访问Oracle,走一条完整的JDBC链路。
我为了方便快速验证,在/opt/tomcat/webapps/ROOT下放了一个test.jsp:
<%@ page import="java.sql.*" %> <%@ page contentType="text/html;charset=UTF-8" %> <% Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@//localhost:1521/orcl", "tomcatuser", "你的密码"); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("select sysdate from dual"); while (rs.next()) { out.println(rs.getString(1)); } rs.close(); st.close(); conn.close(); %>启动Tomcat:
/opt/tomcat/bin/startup.sh然后在本机验证:
curl http://localhost:8080/test.jsp如果输出当前数据库时间,说明Oracle监听、JDBC驱动、连接串、用户权限全部正常。
接着再验证远程访问。从Windows浏览器打开:
http://192.168.1.100:8080/test.jsp如果访问不了,先确认Tomcat进程是否监听在0.0.0.0:8080:
ss -tlnp | grep 8080如果显示127.0.0.1:8080,说明Tomcat只绑定在了本机。修改server.xml的Connector,把address="127.0.0.1"去掉,或者设置address="0.0.0.0",重启Tomcat。
6.2 回看几个容易让人崩溃的问题
这次实战里,几个最折磨人的问题我整理成了表格,方便你对照:
| 环节 | 现象 | 根因 | 解决 |
|---|---|---|---|
| 安装器启动 | texttt{DISPLAY not set} | Xstart没配置X11转发 | 在xterm里运行runInstaller,先echo $DISPLAY确认 |
| 依赖检查 | 缺少compat-libstdc++-33 | yum源里没有 | 装epel源或用老rpm包 |
| 链接阶段 | Error in invoking target 'all_no_orcl' | 32位库缺失 | yum install libaio.i686 glibc-devel.i686 ncurses-libs.i686 |
| DBCA建库 | ORA-27125 | /dev/shm不够 | 增大shm或调小memory_target |
| Tomcat连接 | SQLRecoverableException: Connection refused | 监听没启动或连接串写错 | lsnrctl status确认服务,检查URL格式 |
| JSP中文乱码 | 参数乱码 | URIEncoding不对 | 在server.xml中设置为UTF-8 |
还有一个在重启后才会暴露的坑:Oracle的监听器没有自启。很多教程只让你手动lsnrctl start,一重启机器就傻眼。所以别漏掉第5.2小节的rc.local配置。我用这套方案连续重启了两次,确认Oracle监听和Tomcat都能自己起来。
最后再说两个经验。第一个是安装Oracle 11g时千万不要在安装器自检时盲目勾选“Ignore All”,有些项确实可以忽略,但如果是缺少libaio、gcc这种基础库,后面报错时再回头来查,浪费时间不说,还容易把系统环境搞乱。第二个是养成先做快照的习惯。Oracle安装会往系统里写入一堆内核参数和用户配置,如果不满意想重来,直接恢复快照比手动清理干净得多。我在这次安装过程中就恢复过两次快照,每次恢复后按本文重新走一遍,效率反而更高。
如果你也要在CentOS 7上跑这套组合,强烈建议把每个阶段的验证命令都执行一遍,不要跳步。装完Oracle后再去调Tomcat的JDBC连接,如果失败,很难分清是哪一层的问题。按顺序来,每一步确认绿灯后再往下走,实际花费的时间反而最少。