简介:这是一份 Oracle 9i 的 Linux x86-64 平台补丁压缩包,面向仍需维护或部署旧版数据库系统的人员,可用于在 64 位 Linux 环境下完成数据库软件的安装配置。包体大小约四百六十四点六七兆字节,内含安装说明文档与主要安装组件,覆盖图形化安装引导、核心文件及初始化所需内容。该版本包含数据仓库优化、在线重定义与高级复制等特性,安装时涉及环境变量、系统权限和网络参数设置,资源对这些操作具有直接参考价值;目前已有百余人学习下载。需要留意的是,Oracle 9i 属于较老版本,官方支持已终止,可能不完全兼容现代安全规范,更适合存量系统维护或技术研究场景,使用前应仔细阅读包内文档,确认系统版本、硬件与磁盘空间等前提条件,并做好后续升级规划。
1. Oracle 9i 的 64 位 Linux 部署没那么玄学:p4547809_92080 这个 9.2.0.8 介质包就是答案
某制造企业的核心报表库还在跑 Oracle 9i,史前系统迁到 64 位 Linux 服务器后,前后两任 DBA 装了三次都是半路崩溃。问题就出在没人认真拆过 p4547809_92080_Linux-x86-64.zip 这个 9.2.0.8 补丁集介质——它不是简单解压就能跑的安装盘,而是带了一堆 64 位平台专属的兼容要求和安装顺序。这个包能解决的核心问题有三个:在 AMD64/Intel x86-64 架构 Linux 上完整部署 Oracle 9i、把旧库的还原环境跑起来、以及给暂时迁不动数据的老业务系统兜底。适合接手旧系统维护的 DBA,也适合需要在测试环境复现 9i 行为的技术人员。先提醒一句,这个版本的安装流程和现代数据库差别不小,坑集中在图形界面起不来、共享内存配置、字符集选择这三块,下文逐个拆。
2. 拆包先认清介质与组件:Disk1 与 README.html 的用途和 64 位兼容边界
2.1 压缩包里有什么:Disk1 与 README.html 的用途
文件名 p4547809_92080_Linux-x86-64.zip 承载的信息比想象中多。p4547809 是补丁集编号,92080 对应 9.2.0.8,Linux-x86-64 是平台标识。9.2.0.8 是 9i 第二版(9.2)的最后一个 patch set,基本是 9i 在 Linux 上最成熟的介质。如果你手上还有早期安装介质还在 9.2.0.4 甚至 9.0.x 版本,这个包相当于补票升级,能顺带修复一批已记录的问题。
解压后第一层通常就是 Disk1 子目录和 README.html。Disk1 里是安装主程序的内容,包括 runInstaller、stage 目录、install 目录,标准 Oracle 介质布局原本会分 Disk1、Disk2、Disk3,但 9.2.0.8 在 Linux x86-64 上往往只给一个 Disk1,大部分组件都装进去了,后面几个盘的内容只在选装高级组件时才会提示。我一般先把包解压到一个固定目录,方便后续反复调用:
mkdir -p /opt/oracle_media mv p4547809_92080_Linux-x86-64.zip /opt/oracle_media/ cd /opt/oracle_media unzip -q p4547809_92080_Linux-x86-64.zip解压命令本身没有技术含量,但我会在解压前用zipinfo先看一眼包内文件结构,确认 Disk1 目录是否完整、有没有 p4491726 之类的依赖补丁说明:
zipinfo p4547809_92080_Linux-x86-64.zip | head -20然后找到 README.html,用浏览器打开。这份文档里写了系统需求、内核版本要求、已知问题和解决建议。9i 属于经常有前置补丁要求的版本,README.html 相当于官方给的一份安装前检查清单。我踩过的最典型的坑就是跳过 README 直接开始装,结果装到 48% 卡住,回头翻文档才发现系统缺一个 x86-64 兼容库。
2.2 让老 OUI 在 64 位 Linux 上活过来:32 位库与 LD_ASSUME_KERNEL
Oracle 9i 的图形安装程序 runInstaller 本质上是 32 位程序。虽然介质包名为 Linux-x86-64,但 OUI 本身在 64 位系统上运行要靠 32 位兼容库撑着。这里的核心矛盾是:9i 那个年代 Linux 发行版普遍是 32 位,而现在的 64 位系统默认不装 32 位库,导致 runInstaller 启动报错或直接闪退。
常见做法是补装 glibc 的 32 位版本、libaio 的 32 位版本、libXp 的 32 位版本。在 RHEL 6 上我会执行:
yum install -y glibc.i686 glibc-devel.i686 libaio.i686 libXp.i686 libXt.i686 libXtst.i686参数说明:glibc.i686 提供 32 位 C 运行库,runInstaller 和 sqlplus 都要依赖它;libaio.i686 是 32 位异步 IO 库,Oracle 的 IO 进程会用到;libXp.i686 是 X11 打印扩展库,OUI 图形界面需要它绘制窗口。缺任何一个,表现都是 OUI 启动时报error while loading shared libraries。
还有另一个经典兼容开关LD_ASSUME_KERNEL。9i 时代 Linux 内核线程模型还是 NPTL 与 LinuxThreads 并存的过渡期,9.2.0.8 在较新内核上偶尔出现核心进程崩溃,我会在启动 runInstaller 前设置:
export LD_ASSUME_KERNEL=2.4.19 ./runInstaller注意,LD_ASSUME_KERNEL=2.4.19是让动态链接器模拟老内核的行为,强制采用旧线程模型,能绕开 9i 与新版 glibc 的 NPTL 冲突。但这不是万能钥匙,Red Hat 系的系统在新版本上如果 glibc 太新,这个变量可能失效甚至引起段错误,需要根据实际内核版本决定是否使用。
2.3 内核参数与专用账户:9i 的共享内存和信号量门槛
Oracle 9i 对共享内存和信号量的要求比现代版本更刚性。64 位系统默认的kernel.shmmax经常只有 32MB,而 Oracle 9i SGA 启动时至少要上百 MB,两者直接冲突。我先把内核参数调整到位,避免安装后实例起不来:
| 参数 | 推荐值 | 作用 |
|---|---|---|
| kernel.shmmax | 2147483648(2GB) | 单个共享内存段上限,决定 SGA 能否分配 |
| kernel.shmall | 536870912 | 系统总共享内存页数上限 |
| kernel.sem | 250 32000 100 128 | 信号量参数:SEMMSL、SEMMNS、SEMOPM、SEMMNI |
| fs.file-max | 65536 | 文件句柄上限,影响并发连接 |
| net.ipv4.ip_local_port_range | 1024 65000 | 扩大端口范围,避免连接数多时端口耗尽 |
设置方式:
cat >> /etc/sysctl.conf <<'EOF' kernel.shmmax = 2147483648 kernel.shmall = 536870912 kernel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 EOF sysctl -p创建专用账户也是安装前必做的动作。9i 不允许用 root 用户启动 OUI,常规做法是建一个 oracle 用户和 dba 组:
groupadd dba useradd -g dba -d /home/oracle -m oracle passwd oracle然后编辑 /etc/security/limits.conf,把 oracle 用户能打开的进程数和文件数调大:
oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536这一步的目的很直接:数据库后台进程数多,跑起来后每会话都要占用文件描述符,不调大后面会遇到ORA-12518: TNS:listener could not hand off client connection或者进程 fork 失败。
3. 跑通 runInstaller:图形与静默两套流程把 Oracle Home 装进 64 位系统
3.1 先别急着点下一步:环境变量与 dba 组准备
装 Oracle 前必须先把 oracle 用户的环境变量规划好。9i 不像 12c 以后那样有 OCI 自动配置,ORACLE_HOME、ORACLE_SID、PATH、LD_LIBRARY_PATH 全手工指定。我习惯把环境变量写在 oracle 用户的.bash_profile里,内容如下:
# oracle 用户的 .bash_profile export ORACLE_BASE=/opt/oracle export ORACLE_HOME=/opt/oracle/product/9.2.0/db_1 export ORACLE_SID=orcl export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib export LANG=C umask 022每个变量各管一摊事:ORACLE_BASE 是 Oracle 软件根目录;ORACLE_HOME 指向实际的数据库软件安装位置;ORACLE_SID 决定当前实例名,后面建库、启库都要参考它;LD_LIBRARY_PATH 保证 sqlplus、lsnrctl 这些工具能找到 libclntsh.so、libnnz9.so 这些运行库;LANG=C 是防止图形界面中文乱码。
设置好之后让环境变量生效:
source ~/.bash_profile echo $ORACLE_HOME3.2 图形安装:runInstaller 的安装步骤与输入项
环境变量就绪后,进入 Disk1 目录启动安装程序。我需要以 oracle 用户身份执行,而且要在能显示 X 窗口的会话里:
cd /opt/oracle_media/Disk1 export LD_ASSUME_KERNEL=2.4.19 ./runInstallerOUI 启动后是一套老式的 Java 图形向导,我按实际经验把关键输入项列出来。第一个界面选择 Inventory 目录,默认值是/opt/oracle/oraInventory,这个目录记录已安装产品的清单,权限必须归 oracle 用户;随后选择 UNIX 组名,填 dba。第二个界面是安装类型,选 Enterprise Edition 完整版本;接下来指定 ORACLE_HOME 路径,必须与.bash_profile里配置一致。最后 OUI 会要求填 Unix 组名和运行安装的登录用户,直接选 oracle。
中间还会遇到一个 "ORACLE_SID 与监听端口" 的输入步骤,SID 填 orcl,监听端口用默认的 1521。字符集选择是很关键的一步,9i 的字符集清单里没有 AL32UTF8,我一般选 Unicode 标准 UTF-8 编码,选错字符集后面建库会出现字符集不匹配的连锁问题。
安装过程中 OUI 会提示以 root 执行两个脚本。先是在弹窗里让填 root 脚本路径,我打开新终端执行:
su - root /opt/oracle/product/9.2.0/db_1/root.shroot.sh 会自动把 Oracle 二进制文件的属主改成 root,同时把一些需要特权访问的目录权限设置正确,还会生成/etc/oratab文件,这个文件记录 ORACLE_HOME 与 ORACLE_SID 的对应关系。
3.3 静默安装:responseFile 一次跑完
图形界面在批量部署时太痛苦,生产环境我反而更常用静默安装。OUI 支持通过响应文件传入全部配置项。9i 的响应文件模板在 Disk1 的install目录下,路径类似install/oracle/9.2.0/response。静默安装命令是:
cd /opt/oracle_media/Disk1 ./runInstaller -silent -responseFile /opt/oracle_response/install.rsp响应文件里必须改几个关键参数。我用一个简化版来说明:
# install.rsp 关键参数摘录 ORACLE_HOME=/opt/oracle/product/9.2.0/db_1 ORACLE_HOME_NAME=OraHome92 ORACLE_SID=orcl COMPONENT_LANGUAGES={"en","zh_CN"} INSTALL_TYPE="EE" UNIX_GROUP_NAME=dba # 以下两个参数用于声明忽略系统依赖检查 FROM_DEFAULT_ORACLE_HOME=false SHOW_ALL_SW_AGREEMENTS=falseRUNINSTALL 参数含义:-silent表示免交互执行;-responseFile指向响应文件的绝对路径;响应文件里 INSTALL_TYPE="EE" 对应 Enterprise Edition,UNIX_GROUP_NAME 必须与创建 oracle 用户的组一致,否则 OUI 会在权限检查处直接中断。
静默安装最容易翻车的地方是 oracle 用户对响应文件的读权限。我处理的方法是把 install.rsp 复制到 oracle 用户家目录下,并确保属主正确:
chown oracle:dba /opt/oracle_response/install.rsp chmod 600 /opt/oracle_response/install.rsp另外还要注意,静默安装同样要求 root.sh 脚本被手动执行,安装到结尾 OUI 会打印一个日志路径,里面明确标注 "Please execute /opt/oracle/product/9.2.0/db_1/root.sh"。这一步不会自动完成,漏掉就会留下一个半成品安装目录。
4. 避坑排查:从 OUI 起不来表到 DBCA 建库崩,这几条血泪经验直接抄
4.1 现象:runInstaller 启动后界面一闪而过或报缺库
最常见的场景:执行./runInstaller后屏幕输出error while loading shared libraries: libXp.so.6: cannot open shared object file,然后进程退出。原因就是 64 位系统缺少 32 位 X11 库,OUI 这个 32 位程序找不到对应运行库。解决方式就是前面第 2.2 节里的库安装命令,逐一把缺的库补上。我一般用ldd直接查看 runInstaller 的依赖关系,精准定位缺哪个:
ldd /opt/oracle_media/Disk1/runInstaller | grep "not found"输出几行not found,缺哪个装哪个,比逐个乱试效率高得多。
4.2 现象:安装没问题,但建库或启动时报 ORA-27102: out of memory
ORA-27102 听起来像内存不够,但实际往往不是物理内存不足,而是内核共享内存参数有问题。我在某测试服务器上就遇到一次,机器 8GB 内存,SGA 才配 512MB,照样报 ORA-27102。排查办法是查看当前共享内存上限:
sysctl kernel.shmmax如果返回值只有 33554432(32MB),那 SGA 根本分配不出来。解决方式就是按第 2.3 节的 sysctl.conf 配置改参数并执行sysctl -p,然后重启数据库实例验证。
4.3 现象:启动时报 semget 失败,ORA-27121: unable to determine size of shared memory segment
这组报错和信号量参数不匹配有关。9i 的信号量要求包含 SEMMSL、SEMMNS、SEMOPM、SEMMNI 四个值,前面表格里给的那组250 32000 100 128是经过验证的组合。如果 SEMMNS 太小,数据库进程一多信号量就耗尽。先看当前生效值:
sysctl kernel.sem如果第二个数字(SEMMNS)小于 1000,基本可以确定是这里的问题。把/etc/sysctl.conf里 kernel.sem 改成250 32000 100 128再sysctl -p。
4.4 现象:DBCA 建库时字符集下拉列表里找不到 AL32UTF8
这是 9i 最容易踩的坑之一。AL32UTF8 是 10g 之后才支持的 Oracle 字符集名,9.2.0.8 的 DBCA 里根本没有这个选项。如果我建库时选了 UTF-8 字符集,后续数据迁移到新库时经常出现字符集转换的告警。我的习惯是在 9i 上统一选 UTF-8(数据库字符集),国家字符集选 AL16UTF16,这样与 10g/11g 的兼容性最好。建库后验证一下当前字符集:
SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';4.5 现象:数据库装完重启服务器后,实例起不来,sqlplus 报 ORA-12547: TNS:lost contact
这个报错大多不是监听挂了,而是 root.sh 没执行干净或者/etc/oratab配置有问题。装完 9i 以后,/etc/oratab里应该有一行类似orcl:/opt/oracle/product/9.2.0/db_1:N,如果这行不存在,监听和实例启动脚本都找不到数据库配置。排查办法是先看 oratab 内容:
cat /etc/oratab没有的话重新执行一次 root.sh。执行时要注意,root.sh 在交互过程中会问是否把 oratab 里的条目启动标志改成 Y,这取决于是否需要随系统自启动。
5. 装完先验证再收工:一套 5 分钟的 sqlplus 健康检查与回滚方案
软件装完、数据库建好,别急着注册服务,先做一次最低限度的健康检查。我会花 5 分钟跑一遍下面这组命令:
# 切换 oracle 用户,确认环境变量生效 su - oracle sqlplus / as sysdbaSQL*Plus 里依次执行三件套:
-- 1. 确认实例能启动 STARTUP; -- 2. 看数据库状态 SELECT instance_name, status FROM v$instance; -- 3. 看后台进程是否齐活 SELECT program FROM v$process WHERE program LIKE '%DBW%' OR program LIKE '%LGWR%';正常输出应该是 instance_name 返回 orcl,status 为 OPEN,DBW0、LGWR 这些后台进程在列里。如果 STARTUP 卡住不动,立刻去检查$ORACLE_HOME/network/log/listener.log和 alert 日志——9i 的告警日志默认在$ORACLE_HOME/admin/orcl/bdump/alert_orcl.log。
健康检查通过后,我没有立刻收工,而是把三件套文件备份一份。9i 的配置一旦被误改,恢复全靠这些文件:
cp $ORACLE_HOME/network/admin/listener.ora /opt/backup/listener.ora.bak cp $ORACLE_HOME/network/admin/tnsnames.ora /opt/backup/tnsnames.ora.bak cp $ORACLE_HOME/dbs/initORCL.ora /opt/backup/initORCL.ora.bak这三份文件分别控制监听、客户端连接解析、实例初始化参数。当初我在一个模拟项目 X 里就是没做这个备份,某次改监听端口后把 listener.ora 写坏,恢复无门,白白浪费了一个晚上。从那以后我每次装完 9i,这三件套都先复制到独立目录,验证过内容再继续调业务。
关于 9i 在 64 位 Linux 上的生产使用,我的最终建议是:这个版本能做历史数据的查询和报表支撑,但新业务不要往里面写,安全补丁和官方支持都已经停了,尽量把它当成一个"存量系统运行环境"而不是"新应用承载平台"。如果你拿到的介质是 p4547809_92080 系列,照着这套流程走,解压、装库、验证三步都能落地。希望帮到你。
本文还有配套的精品资源,点击获取