☰
CentOS 6.5与el5错配下的Oracle 10g虚拟机部署避坑
2026/10/28 13:50:20 网站建设 项目流程

简介:这份资源是面向 Linux 运维初学者与需要搭建测试环境的技术人员的 CentOS 6.5-x86_64 系统安装配置文档,聚焦虚拟机环境下从零搭建一套可用的开发与自动化测试基础环境。内容覆盖操作系统安装、静态 IP 与 DNS 网络配置、VMware 虚拟工具安装、用户创建,以及 SSH、FTP、Telnet、SVN、JDK、buildc、RF 与 Oracle 数据库等组件的部署与验证,并针对 root 远程访问受限、FTP 无法列目录、密码验证缓慢等常见问题给出排查思路,可作为搭建实验环境的操作参照。资源包内仅含 1 个 docx 文档,约 32KB,按安装与配置环节分节编排,便于按步骤对照执行,适合作为部署检查清单使用。目前该资源已有 384 人学习,对刚接触 Linux 部署或需复现旧版 CentOS 环境的读者具备一定参考价值。

1. 版本先对齐:文档名写着 CentOS 6.5,要装的其实是 el5 那一套

虚拟机里装 Linux 跑 Oracle 测试环境,翻车点几乎都不在安装过程本身,而在版本对齐。文档名写的是 CentOS6.5-x86_64,可配套的软件包后缀全是 el5:vsftpd-2.0.5-16.el5_5.1、telnet-server-0.17-39.el5,Oracle 是 10201,JDK 是 6u37。真按 CentOS 6.5 装下去,vsftpd 版本对不上,Oracle 安装检查第一步就报 must be redhat-3。这套环境的正确底座是 RHEL 5.6 x86_64(CentOS 5.x 同源),30G 磁盘、中文界面、防火墙关掉。适合要在一台虚拟机上同时跑 Oracle 10g、JDK 6 和老式自动化测试框架的人。装错一个版本号,后面每个组件都要返工,这是我在 Linux 部署里踩得最深的一次。

2. 系统底座与网络:30G 磁盘、中文界面、VMware Tools 和三个网络文件

把虚拟机建出来到能 ping 通外网,这一段是整个环境的地基。地基没打好,后面装 JDK、装 Oracle 全是连锁反应:磁盘小了 Oracle 装到一半空间不足,防火墙没关 FTP 连不上,网卡没配静态 IP 监听起不来。这一章把虚拟机规格、安装界面里的三个开关、虚拟机工具和网络配置一次做完。

2.1 虚拟机规格:硬盘为什么必须给到 30G

磁盘容量是这套环境里最容易被低估的参数。Oracle 10.2.0.1 的安装介质解开后接近 2G,装上软件本身占掉 4~5G,再建一个实例、导入测试数据,加上自动化测试跑起来会往表空间里灌数据,20G 左右是常态消耗。系统盘本身还要留出 /tmp 和归档日志的空间。

我一般这么分:虚拟磁盘总容量 30G,分区上/给 20G,/home单独给 8G(Oracle 装在/home/oracle下),swap 给 2G。内存不要低于 1G,低于 1G Oracle 的图形化安装界面会直接起不来;CPU 单核够用,这套是老环境,不需要堆资源。

虚拟网络适配器选 NAT 或者桥接都行,取决于你要不要让同网段的其他机器访问。选 NAT 的时候,虚拟网卡拿到的是 192.168.x.x 网段,后面配静态 IP 要按 NAT 的网关来写,这一点在第 2.5 节会单独说。

2.2 安装界面的三个选择:语言、安装号、防火墙

系统安装向导里有三处必须停下来改的地方,改错了要么中文乱码,要么后面服务全被拦。

第一是语言。安装时选简体中文,装完之后/etc/sysconfig/i18n里的LANG会是zh_CN.UTF-8之类的值。但后面 Oracle 的.bashrc里会强制把LANG改成zh_CN.GB18030,两处不一致会导致终端里中文显示成方块。稳妥做法是装的时候选中文,装完先别急着改,等配置 Oracle 环境变量时统一处理。

第二是安装号。向导会要求输入安装序列号,按你手上的授权填,不同批次的介质序列号不通用,填错了会在复制软件包阶段报错退出。

第三是防火墙。向导里可以直接把防火墙设为禁用,SELinux 也一并关掉。这一步别犹豫,后面 vsftpd 的 21 端口、Oracle 的 1521 端口、telnet 的 23 端口都要单独放行,与其一个个加规则,不如在测试环境里直接关掉。

# 安装完成后确认防火墙和 SELinux 的实际状态 service iptables status # 有输出说明防火墙还活着 getenforce # 期望输出 Disabled cat /etc/sysconfig/selinux | grep SELINUX # 期望 SELINUX=disabled

getenforce返回Enforcing说明 SELinux 还开着,/etc/sysconfig/selinux里的修改要重启才生效;临时生效用setenforce 0,但重启后会回到配置文件里的值。这两处必须同时改,只改一处是很多人后面 FTP 传不了文件、SSH 登不上 root 的根源。

2.3 装完先装 VMware Tools 9.6.1

虚拟机装完第一件事不是配网络,是装 VMware Tools。没有它,分辨率固定在 800x600,鼠标移进虚拟机就出不来,共享文件夹也用不了。Oracle 的图形化安装界面在小分辨率下按钮会被裁掉,点不到“下一步”。

# 挂载 VMware Tools 光盘后,把压缩包拷到本地临时目录 mkdir -p /home/temp cp /media/VMware\ Tools/VMwareTools-9.6.1-1378637.tar.gz /home/temp cd /home/temp # 解压:先 gzip 解一层,再 tar 解一层 gzip -d VMwareTools-9.6.1-1378637.tar.gz tar -xvf VMwareTools-9.6.1-1378637.tar # 进入解压目录执行安装脚本,一路回车用默认值 cd vmware-tools-distrib ./vmware-install.pl

cp那行路径里带空格,必须用反斜杠转义,否则会被当成两个参数,报cp: cannot stat '/media/VMware'。vmware-install.pl执行过程中会问一堆路径,全部回车走默认即可,问到最后会提示重启,重启后分辨率自适应和剪贴板共享才生效。这套流程在 el5 和 el6 上基本一致,差异只在光盘挂载点:el5 是/media/VMware Tools,部分 el6 镜像挂到/media/VMwareTools。

装完之后用lsmod | grep vmw能看到 vmw_balloon、vmwgfx 之类的模块,说明工具已经加载。分辨率如果还是不对,手动改/etc/X11/xorg.conf里的驱动为vmware,重启 X 服务。

2.4 网络配置:ifcfg-eth0 逐行拆开

网络配错是这套环境里最高频的故障源。配置文件就一个,但每一行的取值都有讲究。

# /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 # 网卡接口名,el5 一般是 eth0 BOOTPROTO=static # 静态地址;写 dhcp 就是动态获取;写 none 表示不指定协议 HWADDR=B2:23:38:50:3E:6B # 物理地址,必须和虚拟机网卡的实际 MAC 一致 ONBOOT=yes # 开机自动激活网卡,写成 no 的话每次开机都要手动 ifup IPADDR=10.10.126.235 # 本机 IP,同一网段内不能冲突 NETMASK=255.255.255.0 # 子网掩码 GATEWAY=10.10.126.1 # 默认网关,写错就上不了外网 TYPE=Ethernet # 连接类型 USERCTL=yes # 允许普通用户启停这块网卡 IPV6INIT=no # 关掉 IPv6 初始化,老环境没必要开 PEERDNS=yes # 允许 DHCP 下发的 DNS 覆盖 resolv.conf,静态配置下影响不大

HWADDR这一行是关键。虚拟机克隆或者改过网卡设置之后,MAC 地址会变,配置里写的还是旧地址,网卡就起不来,日志里报Device eth0 has different MAC address than expected。查实际 MAC 用ifconfig eth0看HWaddr字段,或者cat /sys/class/net/eth0/address,把值抄回配置文件里再重启网络。

GATEWAY只在第一个网卡配置文件里写,配多块网卡时不要把网关写成多个,否则路由表会出现多条默认路由互相打架。BROADCAST那行在原文里出现过,现代做法可以省略,系统会按 IP 和掩码自动算出来。

2.5 resolv.conf 与 NAT 模式的第二套写法

DNS 配置文件独立于网卡配置,改的是/etc/resolv.conf:

# /etc/resolv.conf,按顺序生效,最多写三个 nameserver 202.107.117.11 nameserver 210.83.210.155

nameserver按顺序查询,第一个超时才走第二个,所以把响应快的放前面。这个文件会被网络服务重启覆盖,如果PEERDNS=yes且走 DHCP,你必须把 DNS 写进ifcfg-eth0的DNS1=里才不会丢。静态配置下没有这个风险。

虚拟机用 NAT 模式时,网段由虚拟机软件分配,走的是另一套参数:

# NAT 模式下的 ifcfg-eth0,网关指向 NAT 虚拟网卡 DEVICE=eth0 BOOTPROTO=none # 等价于 static,不主动获取地址 ONBOOT=yes IPADDR=192.168.50.132 # 必须落在 NAT 子网内,且不在 DHCP 池里 NETMASK=255.255.255.0 GATEWAY=192.168.50.1 # NAT 网关地址,通常是 .1 或 .2 TYPE=Ethernet USERCTL=yes IPV6INIT=no

NAT 模式下IPADDR不要随便填,得落在虚拟机软件分配的网段里,否则网关不可达。查网段的方法是在宿主机上看虚拟网卡的地址,或者在虚拟机里临时切dhcp拿一次地址,ifconfig看一眼网段再改成静态。BOOTPROTO=none和static在 el5 上行为一致,写哪个都行,别写成dhcp又同时写死IPADDR,那样地址会被覆盖。

改完之后重启网络并验证:

service network restart ifconfig eth0 # 确认 IP 和掩码已生效 ping -c 3 10.10.126.1 # 通网关 ping -c 3 202.107.117.11 # 通 DNS nslookup www.example.com # 域名解析正常

ping网关通但pingDNS 不通,问题在网关或路由;pingDNS 通但不能解析域名,问题在/etc/resolv.conf或者/etc/nsswitch.conf里的 hosts 顺序。这两步分开验证,比直接ping www.baidu.com一次看结果要省时间得多。

3. 账号与远程访问:appuser/oracle 用户、SSH、vsftpd、telnet、SVN

网络通了之后要给环境建账号,然后把远程访问的几条路打开。这一段最容易被跳过,因为安装向导里 SSH 默认就装好了,感觉“能登就行”。实际上默认状态下 root 登不上 SSH、FTP 不让 root 登录、telnet 连上就断,每个都是一条独立的配置。

3.1 建用户与建组:dba 组要提前规划

# 建业务账号和数据库账号 useradd appuser passwd appuser useradd oracle passwd oracle # 数据库组和用户归属,gid 151 是为了和既有环境的组 ID 对齐 groupadd -g 151 dba usermod -a -G dba oracle usermod -a -G dba appuser usermod -a -G oracle appuser

-a -G两个参数必须一起用,-a是 append,漏掉它会把用户从原有组里踢出来只保留新组,这是血泪经验:漏掉-a之后 oracle 用户不在 oinstall 组里,装数据库时权限检查直接失败。

appuser是自动化测试跑批的账号,oracle是数据库账号。把appuser加进oracle组是为了让它能读 Oracle 的安装目录,加进dba组是为了后面它能用sqlplus / as sysdba连库。组 ID 151 不是随便写的,如果这个环境要和别的机器共享存储或者做 NFS,gid 不一致会导致文件属主显示成数字。

3.2 SSH:关掉 SELinux 和 DNS 反解

SSH 默认装好,但两个默认行为要改:root 不能登录,以及登录时卡几秒。

# 1. 关闭 SELinux,改配置文件后重启生效 vi /etc/sysconfig/selinux # 把 SELINUX=enforcing 改成 SELINUX=disabled # 2. 关闭 DNS 反向解析,解决 SSH 登录慢 vi /etc/ssh/sshd_config # 文件末尾追加一行 UseDNS no service sshd restart

UseDNS no解决的是登录慢的问题。SSH 服务端默认会拿客户端的 IP 去做一次反向解析,解析不到就等超时,表现是输入密码后卡 5~10 秒才进 shell。内网环境没有反向解析记录,这一行必加。

SELinux 那一项要重启才生效,急着用可以先setenforce 0临时关掉。注意:/etc/sysconfig/selinux是个软链接,实际改的是/etc/selinux/config,两个路径都能改,改完用getenforce确认状态。

root 登录被拒的另一个原因在/etc/ssh/sshd_config里的PermitRootLogin,el5 默认是yes,某些加固过的镜像会改成no,登不上时先 grep 这一行。

3.3 vsftpd 2.0.5:让 root 能登录的四个开关

FTP 用来在宿主机和虚拟机之间传安装包,所以 root 必须能登。vsftpd 有三层限制,得一层层拆。

# 安装并启动 rpm -ivh vsftpd-2.0.5-16.el5_5.1.x86_64.rpm service vsftpd start chkconfig vsftpd on # 开机自启 # 放行 21 端口,编辑 /etc/sysconfig/iptables,在 REJECT 规则之前加一行 -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT service iptables restart

第一层是/etc/vsftpd/ftpusers,这个文件里列的用户一律禁止登录,root 在列。第二层是/etc/vsftpd/user_list,当userlist_enable=YES且userlist_deny=YES时,这个文件也是黑名单。第三层是userlist_enable本身。

# 1. 注释掉 ftpusers 里的 root vi /etc/vsftpd/ftpusers # root -> #root # 2. 注释掉 user_list 里的 root vi /etc/vsftpd/user_list # root -> #root # 3. 关闭 userlist 限制 vi /etc/vsftpd/vsftpd.conf # userlist_enable=YES -> userlist_enable=NO service vsftpd restart

userlist_enable=NO之后,user_list整个文件失效,所以前两步的注释在关闭它之后其实不起作用,但如果以后有人把开关改回 YES,注释过的文件能省一次排查。这属于配置上的后悔药,多改两行不吃亏。

FTP 能登录但列不出目录、建不了文件,八成还是 SELinux:getenforce返回Enforcing就去改/etc/selinux/config把SELINUX=disabled,重启。FTP 每次验证密码卡很久,跟 SSH 那个问题同源,把/etc/resolv.conf里的nameserver全注释掉再重启 vsftpd 即可(仅限纯内网、不需要域名解析的场景)。

3.4 telnet 与 /etc/securetty

telnet 明文传输,安全性差,但这套老环境里有些自动化脚本只认 telnet,所以还是得装。

rpm -ivh telnet-server-0.17-39.el5.x86_64.rpm # 启用 telnet,把 disable 改为 no vi /etc/xinetd.d/telnet # disable = yes -> disable = no service xinetd restart

telnet 服务由 xinetd 托管,重启的是xinetd不是telnet,这俩名字太像,重启错了服务会以为配置没生效。

root 用 telnet 登录会被拒,因为/etc/securetty里没登记伪终端。网上流传的改/etc/pam.d/login注释pam_securetty.so那行,实测重启后仍然登不上,别在这上面浪费时间。

# 直接在 /etc/securetty 末尾追加允许的终端号 cat >> /etc/securetty <<'EOF' pts/0 pts/1 pts/2 pts/3 EOF

改完不需要重启,立即生效。pts/N是伪终端编号,telnet 每次连接分配的编号会递增,加到pts/3意味着同时开四个会话之后第五个就登不上了,实际用的时候按并发数多写几行。

3.5 SVN 中文路径:LC_ALL 那一行

SVN 客户端 el5 默认已经安装,但要处理中文路径还得加一行环境变量,否则导出带中文名的目录直接报错。

# 写进当前用户的 ~/.bashrc,登录即生效 echo 'export LC_ALL=zh_CN.GBK' >> ~/.bashrc source ~/.bashrc

不加这一行的报错是svn: Can't convert string from 'UTF-8' to native encoding。原因是 SVN 客户端把路径按 UTF-8 处理,而终端的 locale 设置成了别的编码,转换时对不上。zh_CN.GBK这个值要求系统装了对应的 locale,用locale -a | grep -i gbk确认,没有的话得先补语言包。

LC_ALL的优先级高于LANG,设了它其他语言相关的变量全部被覆盖,所以配 Oracle 环境时如果发现中文显示异常,先看.bashrc里是不是有这一行残留。

4. JDK 6u37、buildc 与 Oracle 10.2.0.5:一条依赖链按顺序装

JDK、编译框架、数据库三者的顺序不能乱。buildc 依赖 Python 和 JDK 环境,Oracle 的安装程序本身是 Java 写的,也依赖 JDK。先装 JDK 并让环境变量全局生效,再装框架,最后装数据库,这条链理顺了后面几乎不会再报“找不到 java”这类错。

4.1 jdk-6u37-linux-x64.bin 装到 /usr/java

Oracle 10g 对 JDK 版本敏感,6u37 是这套环境里验证过的版本,不要换成 7 或 8,换高版本 Oracle 的 OUI 界面起不来。

# 建目录并拷贝安装包 mkdir -p /usr/java cp /home/temp/jdk-6u37-linux-x64.bin /usr/java/ cd /usr/java chmod +x jdk-6u37-linux-x64.bin # 执行自解压安装,一路回车 ./jdk-6u37-linux-x64.bin # 安装完成后删掉安装包,省空间 rm -f jdk-6u37-linux-x64.bin

.bin包本质是自解压脚本,执行时会解到当前目录下生成jdk1.6.0_37目录,所以必须在/usr/java里执行,否则目录位置不对。安装过程中会问是否接受许可协议,输入yes继续,剩下的路径提示全部回车。

# 把 java 和 javac 链到 /usr/bin,省得配 PATH cd /usr/bin ln -s -f /usr/java/jdk1.6.0_37/jre/bin/java java ln -s -f /usr/java/jdk1.6.0_37/bin/javac javac

-f是强制覆盖已有链接,第一次装不加也行,重装时必须加。做软链接和配 PATH 二选一,两个都做容易互相干扰。我一般选软链接,因为有些脚本用su -c切用户执行时不会加载.bashrc,PATH 里的设置拿不到,软链接则全局有效。

4.2 环境变量写在哪:/etc/profile 还是 .bashrc

JDK 的环境变量要全局生效,写/etc/profile.d/jdk.sh比写/etc/profile更干净:

# /etc/profile.d/jdk.sh export JAVA_HOME=/usr/java/jdk1.6.0_37 export JRE_HOME=$JAVA_HOME/jre export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH

JAVA_HOME指向 JDK 根目录,JRE_HOME指向它下面的 jre,PATH追加 bin 目录,CLASSPATH里的.表示当前目录,漏掉它跑 Java 程序会报找不到类。

/etc/profile.d/下的脚本会被/etc/profile自动 source,登录 shell 生效。写.bashrc只对当前用户生效,写/etc/bashrc对所有用户的交互式 shell 生效但对非交互式脚本不生效。Oracle 的安装程序是图形化启动的,走的可能是非登录 shell,所以全局配置更保险。

验证:

source /etc/profile java -version # 应输出 1.6.0_37 javac -version echo $JAVA_HOME

java -version输出的是 1.6.0_37 才算对,如果输出了系统自带的 openjdk 版本,说明/usr/bin/java那个软链接指向了别处,用which java看实际路径。

4.3 buildc 0.3.2 与 rf_setup 的 python setup.py install

buildc 是这套环境的编译框架,从内网 SVN 取,路径按你们实际仓库替换。

cd /home/temp # 从 SVN 导出源码,导出不需要 svn 工作副本,比 checkout 干净 svn export http://10.10.125.156/svn0/app/users/someuser/kernel_buildc-0.3.2 cd kernel_buildc-0.3.2 python setup.py install # 需要 root 权限 # 装完之后给可执行文件放行权限 chmod 777 /usr/bin/buildc

svn export和svn checkout的区别是前者不带.svn隐藏目录,导出的就是纯源码,适合部署;后者带版本信息,适合开发。装到/usr/bin下的buildc默认权限可能只有 root 可执行,业务账号调不到,所以要用chmod 777放开。更好的做法是把appuser加进 root 组,但老环境里怎么快怎么来。

rf_setup 的装法一样,cd rf_setup && python rf_setup.py install。这一步在原文里标注为“不安装”,因为后面的 Java 版 trigger 不再用了。如果你们的流程里还有 Python 版的用例,就装上;不装的话后面的配置项可以跳过。

装完验证which buildc能看到路径,buildc --help能输出帮助信息。报ImportError: No module named xxx说明 Python 版本不对或者依赖包没装,el5 自带的是 Python 2.4,这套框架是按 2.4 写的,装 Python 3 会直接语法报错。

4.4 解包 Oracle 并调内核参数

Oracle 的安装介质是一个 cpio.gz 包,解法和 tar 不一样:

cd /home/temp gzip -d 10201_database_linux_x86_64.cpio.gz # 先解 gzip,得到 .cpio cpio -idv < 10201_database_linux_x86_64.cpio # 再解 cpio,解到当前目录下的 database/

cpio -idv三个参数分别是:解包、保留文件属性、显示处理过程。<是把文件喂给标准输入,cpio 不支持直接跟文件名参数,必须用重定向。解完之后当前目录下会多出database/目录,里面是runInstaller。

内核参数不调,Oracle 的安装检查会报一堆警告,有些版本会直接判失败:

cat >> /etc/sysctl.conf <<'EOF' # For Oracle 10g kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default = 262144 net.core.rmem_max = 262144 net.core.wmem_default = 262144 net.core.wmem_max = 262144 EOF /sbin/sysctl -p

kernel.sem的四个值依次是:信号量集合数量、系统级信号量总数、每个 semop 调用允许的操作数、系统级信号量最大值,顺序写错 Oracle 会报ORA-27154。kernel.shmmni是共享内存段的最大数量,Oracle 实例启动要分配多个共享内存段,值太小起不来。/sbin/sysctl -p重新加载配置,不执行这一步改了也白改。

再加上 shell 的限制:

cat >> /etc/security/limits.conf <<'EOF' oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 EOF # /etc/pam.d/login 里加上一行,让 limits.conf 生效 echo 'session required /lib/security/pam_limits.so' >> /etc/pam.d/login

soft是当前生效值,hard是上限,soft不能超过hard。nproc是进程数,nofile是文件句柄数,Oracle 开大量进程和文件,这两个值不够会在运行期报ORA-00059之类的错。

4.5 oracle 的 .bashrc 逐段拆解

Oracle 用户的所有环境变量都在.bashrc里,这一段是整套配置里最长也最容易抄错的地方:

# ~oracle/.bashrc LD_LIBRARY_PATH=/lib:/usr/lib; export LD_LIBRARY_PATH PATH=$PATH:/usr/sbin:/usr/local/bin; export PATH # 中文显示,保证 sqlplus 里中文不乱码 LANG=zh_CN.GB18030; export LANG LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN; export LANGUAGE # Oracle 主目录和实例名 ORACLE_BASE=/home/oracle; export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1; export ORACLE_HOME ORACLE_SID=orcl; export ORACLE_SID ORACLE_TERM=xterm; export ORACLE_TERM # 库路径 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib export LD_LIBRARY_PATH SHLIB_PATH=$ORACLE_HOME/lib32:$ORACLE_HOME/rdbms/lib32; export SHLIB_PATH # 可执行文件路径 PATH=$PATH:$ORACLE_HOME/bin; export PATH # Java 类路径 CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib export CLASSPATH # 字符集:图形化安装界面用这个组合,别用 GBK export NLS_LANG=AMERICAN_AMERICA.UTF8 export LC_ALL=C # 进程和文件句柄上限 if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi umask 022 fi

NLS_LANG=AMERICAN_AMERICA.UTF8和LC_ALL=C这一对是给图形化安装界面用的。如果这里写zh_CN.GBK,OUI 界面会出现乱码,按钮上的中文显示成问号,安装时根本看不清提示。装完数据库之后如果要让 sqlplus 里看中文,再把NLS_LANG改成AMERICAN_AMERICA.ZHS16GBK,两套配置对应两个阶段,不能混用。

umask 022决定新建文件的默认权限,022 表示属主可读写执行、其他用户只读。Oracle 的数据文件需要其他组的用户能读,umask 设成 077 会导致appuser访问不了数据文件。

ulimit -u 16384 -n 65536是进程数和文件句柄的硬限,和/etc/security/limits.conf里的值要匹配,两处不一致以较小的为准。

4.6 安装检查失败:must be redhat-3 的两种改法

跑./runInstaller时最常见的报错:

Checking operating system version: must be redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2 Failed <<<<

原因是 Oracle 10.2.0.1 的检查脚本里硬编码了一份支持的系统列表,RHEL 5.6 不在里面(这个版本发布时 RHEL 5 还没出)。两种改法:

第一种是改系统标识文件:

# 备份原文件再改 cp /etc/redhat-release /etc/redhat-release.bak echo 'Red Hat Enterprise Linux Server release 4 (Tikanga)' > /etc/redhat-release

装完之后记得改回来,否则系统里所有依赖版本判断的脚本都会误判。

第二种是改 Oracle 自己的检查参数文件:

vi /home/temp/database/install/oraparam.ini # 找到 [Certified Versions] 段,在 Linux= 那一行末尾追加 redhat-5 [Certified Versions] Linux=redhat-3,SuSE-9,redhat-4,UnitedLinux-1.0,asianux-1,asianux-2,redhat-5

我一般用第二种,改的是安装介质里的文件,不动系统文件,装完删掉解压目录就恢复原状,副作用最小。第一种改法在装完忘记改回来的时候会留下隐患,某次排查一个完全不相关的软件安装失败,查了半天发现是redhat-release还写着 4。

另外两个安装期常见报错:libXp.so.6: cannot open shared object file是缺图形库,装libXp-1.0.0-8.1.el5.i386.rpm;Xlib: connection to ":0.0" refused by server是 DISPLAY 权限问题,在 root 下执行xhost +再切回 oracle 用户跑安装程序。

4.7 打补丁 p8202632

装完主程序要打 10.2.0.5 的补丁包,据说是为了修 Java 版 trigger 的问题,虽然那个 trigger 后来不用了,但流程里这一步保留着。

# 先关库 su - oracle sqlplus / as sysdba SQL> shutdown immediate SQL> exit # 解压补丁并执行 unzip p8202632_10205_Linux-x86-64.zip cd Disk1 ./runInstaller # 补丁装完,进 sqlplus 跑升级脚本 sqlplus / as sysdba SQL> startup upgrade SQL> @/home/oracle/product/10.2.0/db_1/rdbms/admin/catupgrd.sql SQL> shutdown immediate SQL> startup

startup upgrade是升级模式,只允许 sysdba 连接,跑完catupgrd.sql之后必须重启到正常模式,否则数据字典还是旧版本,查询会报ORA-01092。

打补丁时如果报OUI-11108: Packages information not specified,还是/etc/redhat-release的版本号问题,按 4.6 节的第二种方法处理。

5. 避坑与排查:装完才暴露的 5 个坑

前面每一节都写了“这样配”,但真装起来,报错往往出现在你以为已经搞定的地方。这一章按现象、原因、解决三段式记 5 条,都是装完之后才暴露的。

5.1 系统与服务层的三个坑

坑一:mpiag 账号能登录,但 sqlplus 命令找不到

现象:su - appuser之后敲sqlplus,报command not found,但su - oracle是正常的。

原因:Oracle 的 PATH 只写在了oracle用户的.bashrc里,appuser的 PATH 里没有$ORACLE_HOME/bin。

解决:在appuser的.bashrc里追加export PATH=$PATH:/home/oracle/product/10.2.0/db_1/bin,或者更省事的办法是给/usr/bin做个软链接ln -s /home/oracle/product/10.2.0/db_1/bin/sqlplus /usr/bin/sqlplus。软链接对非交互式脚本也有效,比配 PATH 稳。

坑二:FTP 能登录,列目录报 425 Failed to establish connection

现象:命令行 FTP 输入账号密码能进,敲ls卡住然后报 425。

原因:FTP 被动模式需要额外端口,iptables 只放行了 21,数据连接被拦。

解决:在/etc/vsftpd/vsftpd.conf里固定被动端口范围,然后在 iptables 里一并放行:

echo 'pasv_min_port=30000' >> /etc/vsftpd/vsftpd.conf echo 'pasv_max_port=30010' >> /etc/vsftpd/vsftpd.conf service vsftpd restart # iptables 里追加放行 -A INPUT -m state --state NEW -m tcp -p tcp --dport 30000:30010 -j ACCEPT

如果只是临时传文件,客户端切主动模式也能绕过,但被动模式是默认行为,改服务端更彻底。

坑三:SSH 登录后终端中文全是乱码

现象:用 SSH 工具连上去,ls出来的中文文件名显示成问号或者方块。

原因:服务端的 locale 是zh_CN.GB18030,客户端默认按 UTF-8 解码,两边编码不一致。

解决:要么客户端改成 GBK 解码,要么服务端把LANG改成zh_CN.UTF-8。但改服务端会影响 Oracle 的中文显示,两难的情况下我一般保持服务端 GB18030 不动,在 SSH 客户端里把编码设成 GBK,只影响自己的终端,不影响服务器上跑的程序。

5.2 数据库层的两个坑

坑四:appuser 用 conn / as sysdba 连不上

现象:appuser执行sqlplus / as sysdba,报ORA-01031: insufficient privileges。

原因:sysdba 是操作系统认证,要求执行者在dba组里,光把用户加进oracle组不够。

解决:

su - root usermod -a -G dba appuser # 切回 appuser 后需要重新登录 shell 才生效 su - appuser sqlplus / as sysdba

usermod改的是用户所属组,已登录的会话不会自动刷新组信息,必须退出来重新su。这一步很多人卡住,以为命令没生效,其实是会话没刷新。

如果要让appuser用自己的账号连库而不是走 sysdba,在 oracle 用户下建一个:create user appuser identified by appuser;然后授权grant connect, resource to appuser;。

坑五:ORA-27121 unable to determine size of shared memory segment

现象:非 oracle 用户连库时报ORA-01034: ORACLE not available加ORA-27121,错误信息里带Linux Error: 13: Permission denied。

原因:$ORACLE_HOME/bin/oracle这个可执行文件的 setuid 位丢了,非 oracle 用户执行时拿不到足够的共享内存权限。

解决:

su - oracle cd $ORACLE_HOME/bin chmod 6751 oracle ls -l oracle # 期望看到 -rwsr-s--x,s 位就说明 setuid 和 setgid 都在

6751是四位八进制权限:6 是属主读写,7 是组读写执行加 setgid,5 是其他读执行,最前面的 6 是 setuid。数字顺序是 setuid+setgid、属主、组、其他,写成chmod u+s,g+s,751效果一样。这个坑的表现很有欺骗性,看着像内存不足,其实是权限问题。

6. 装完怎么验证:从 lsnrctl 到 sqlplus 的一条自检线

装完不等于装好。我见过太多次“一路绿灯装完,第二天用的时候发现连不上”的情况,问题都出在没做验证。验证不用多复杂,按依赖顺序从下往上走一遍,每一步的输出都确认过,再交给业务方。

第一步,确认监听起来了:

su - oracle lsnrctl start lsnrctl status

lsnrctl status的输出里要能看到Service "orcl" has 1 instance(s),说明监听和实例已经关联上。如果只看到监听在跑但没有 service,说明实例没启动,先往下走第二步。监听起不来的常见原因是$ORACLE_HOME/network/admin/listener.ora里的 HOST 写成了主机名而/etc/hosts里没有对应记录,改成 IP 或者补上 hosts 记录即可。

第二步,确认数据库能启动:

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

v$instance返回OPEN才算真正起来了。返回MOUNTED说明控制文件加载了但数据文件没打开,看告警日志$ORACLE_BASE/admin/orcl/bdump/alert_orcl.log里的具体报错。

第三步,确认业务账号能连上:

# 用应用账号和应用服务名连,而不是 sysdba sqlplus /nolog SQL> conn app28/app28@app28 SQL> select table_name from user_tables;

这一步最容易挂。conn app28/app28@app28里的第三个app28是 tnsnames 里配的服务名,对应$ORACLE_HOME/network/admin/tnsnames.ora:

app28 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.126.235)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ) )

HOST写的是数据库所在机器的 IP,PORT是监听端口 1521,SERVICE_NAME是实例的服务名。三个值任意一个不对都会报ORA-12541: TNS:no listener或ORA-12514。前者的意思是网络层连不上,检查防火墙和lsnrctl status;后者的意思是监听在但没这个服务,检查SERVICE_NAME拼写。

第四步,把整个链路串起来做个快速自检:

检查项命令期望结果
网卡地址ifconfig eth0IP、掩码与配置一致
网关连通ping -c 3 网关IP无丢包
SSH 服务service sshd statusrunning
FTP 服务service vsftpd statusrunning
JDK 版本java -version1.6.0_37
监听状态lsnrctl status有 orcl 实例
实例状态select status from v$instance;OPEN
业务账号conn app28/app28@app28连接成功

这张表我一般会存成check.sh放到/home/oracle下,交接环境的时候跑一遍,输出全绿才算交付。后来我学乖了,不管装什么环境,最后一律按“底层网络 → 服务进程 → 应用账号”这个顺序走一遍验证,绝不因为安装程序说了 success 就直接交出去。

这套环境的坑和救法基本就是上面这些,装一次记一遍,下次再遇到ORA-27121或者 FTP 425,至少不用从头查起。希望帮到你。

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

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

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

立即咨询