1. 为什么偏偏是XE 11.2.0.2:离线环境下的选型取舍
做国产化替代和信创环境的朋友,应该对“银河麒麟高级服务器操作系统 V10”不陌生。它兼容Red Hat Enterprise Linux的应用程序接口,这让不少RHEL系的软件包可以直接迁移过去,Oracle Database 11g Express Edition (XE) 11.2.0.2 就是一个典型例子。我这次接的客户环境完全离线,内网没有yum源,没有外网权限,唯一能用的就是一个U盘。数据库选型时,客户明确要求用Oracle XE 11.2.0.2,理由也很现实:核心应用是早期基于Oracle开发的,11g的兼容性最好,19c XE还得改连接配置,很多旧存储过程根本不想动。
其实从技术角度讲,在银河麒麟 V10 上部署 Oracle Database 11g Express Edition 11.2.0.2,并不是什么高深操作。本质上就是把Oracle官方针对RHEL/CentOS 6编译的RPM包,装到一个兼容RHEL API的国产系统上。落地难点不在“装不上”,而在“离线依赖”和“内核参数调校”。这两件事处理不好,安装过程就会反复报错,好不容易装完,数据库也可能起不来。
选型时我特意对比过 Oracle XE 11.2.0.2 与新版 XE 的差异。新版 XE 从 18c 开始使用 RPM 包,也支持离线安装,但要求更高的内核版本和更多的依赖库。而 11.2.0.2 的 RPM 是针对 RHEL 6 构建的,依赖的 glibc、libaio、ksh 等软件包在老麒麟 V10 上普遍都有对应版本,内核也兼容。更重要的是,11.2.0.2 的配置过程是交互式脚本/etc/init.d/oracle-xe configure,没有那么多复杂的容器化、多租户概念,对不熟悉 Oracle 新架构的运维同事非常友好。下面这张表是我在选型时整理的对比:
| 对比项 | Oracle XE 11.2.0.2 | Oracle XE 19c / 21c |
|---|---|---|
| 安装包格式 | RPM压缩包 | RPM压缩包 |
| 基础OS要求 | RHEL 6 / 兼容内核 | RHEL 7+ / 兼容内核 |
| 内存下限 | 1GB左右可跑 | 建议2GB以上 |
| 配置复杂度 | init.d脚本交互式配置 | 需要手动初始化PDB |
| 典型依赖 | libaio, glibc, ksh, bc, net-tools | 更多,含compat-libstdc++等 |
| 离线友好度 | 高 | 中 |
如果你也接到一个内网、无外网、需要部署 Oracle 的任务,我建议先想清楚:需求是不是有 Web 管理界面?是不是有存量 SQL 要跑?内存资源有多少?如果内存只有 2GB 且业务不复杂,XE 11.2.0.2 完全够用。如果业务并发较高,那还是上企业版或者 19c XE,别在 11g 上死磕。
1.1 版本选择的现实约束
官方文档里 Oracle XE 11.2.0.2 的安装包是oracle-xe-11.2.0-1.0.x86_64.rpm.zip,解压后会得到Disk1/目录,里面有oracle-xe-11.2.0-1.0.x86_64.rpm和oracle-xe-11.2.0-1.0.x86_64.rpm所需的响应文件。奇怪的是,这个包虽然是给 Oracle Linux 6 准备的,但因为它只依赖基本的 glibc、libaio、unixODBC 等库,所以在一众兼容 RHEL 的操作系统上几乎都能装。银河麒麟 V10 的x86_64架构正好在对齐的轨道上。
另一个现实约束是补丁问题。11.2.0.2 的官方支持早已结束,不能指望 Oracle 再给出针对国产操作系统的补丁。所以部署时我们要把“能让它稳定运行”放在第一位,别一上来就去升级 PSU,很容易引入新的依赖。离线环境下,我的原则是:能用原装 RPM 启动,就不额外打补丁。
1.2 离线部署的整体思路
离线部署的完整逻辑链是这样的:准备一个能联网的跳板机,下载所有需要的 RPM 包和 Oracle 安装包,拷贝到内网机器上;然后在内网机器上先解决依赖顺序,再安装 Oracle RPM,最后执行 configure 脚本初始化数据库。整个过程可以分解成四个阶段:环境检查、依赖准备、包安装、配置验证。
这四步看似简单,但每一步都有坑。环境检查时最容易被忽略的是/dev/shm大小和tmpfs;依赖准备时容易被忽略的是pdksh或ksh的选择;包安装时容易被忽略的是rpm的安装顺序;配置验证时容易被忽略的是/etc/oratab和/etc/sysconfig/oracle的权限。下面我把每一步都展开讲,照着做就能少走弯路。
2. 部署前的环境准备:能省的事千万别省
环境准备阶段看似不产生任何“直接成果”,却是整个部署中最影响心情的部分。我见过太多人在这个阶段图省事,跳过了系统检查,结果装到一半发现库文件路径不对、内存限制过低、安装包缺依赖,最后又回去补课。准备工作做到位,后续安装可以在十分钟内完成。
2.1 检查操作系统版本、架构与内核参数
首先确认系统基本信息。在银河麒麟 V10 上执行以下命令,把结果记录下来:
cat /etc/os-release uname -a uname -m free -h df -h //etc/os-release会输出系统代号,比如Kylin V10 SP1或SP2,这决定你后续要不要更换软件源。uname -m必须返回x86_64,如果返回aarch64,那这个 amd64 的 Oracle XE 包就装不了,需要另找 ARM 版本(通常没有)。内存建议不少于 1.5GB,空闲磁盘不少于 10GB,否则 Oracle 的数据文件加上日志文件很容易把盘撑满。
内核参数是很多人忽略的坑。银河麒麟 V10 默认的内核参数不完全满足 Oracle 11g R2 的要求,尤其是信号量semmsl和共享内存shmall。最好在安装前就检查:
sysctl kernel.sem sysctl kernel.shmmax sysctl kernel.shmall cat /proc/sys/fs/file-max我遇到过一台机器kernel.sem的semmsl只有 250,Oracle 启动时报ORA-27102: out of memory,排查了很久才发现是信号量不足。所以建议提前一次性把参数配置好,配置方法见第 4 章。
2.2 创建专用用户与目录结构
Oracle 不允许直接用 root 运行数据库实例,需要创建专用用户。按照官方惯例,创建oracle用户,并归入oinstall和dba组:
groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle注意银河麒麟 V10 和 RHEL 一样,useradd默认不会创建家目录,如果你想用/home/oracle,最好加-m参数:
useradd -m -g oinstall -G dba oracle然后建立标准目录:
mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01 chmod -R 775 /u01Oracle 的ORACLE_HOME默认在 XE 中会被配置为/u01/app/oracle/product/11.2.0/xe,这个路径在 configure 脚本初始化时会自动创建,我们提前把父目录权限放好就行。
2.3 准备离线安装包与依赖清单
离线部署的核心麻烦在于依赖包。你可以在有外网的机器上访问镜像源,把下面这些包下载好,架构均选择x86_64:
- binutils
- compat-libstdc++-33
- compat-libcap1
- gcc
- gcc-c++
- glibc
- glibc-devel
- ksh
- libaio
- libaio-devel
- libgcc
- libstdc++
- libstdc++-devel
- libXext
- libXtst
- libXi
- make
- net-tools
- nfs-utils
- sysstat
- unixODBC
- unixODBC-devel
下载时不要只下最新版本,Oracle 11g R2 对 glibc 版本比较敏感,太新的 glibc 可能不是问题,但缺compat-libstdc++-33一定会报错。如果镜像源里找不到compat-libstdc++-33,可以去 EPEL 6 的存档池里找,或者直接在 RHEL 6 ISO 的Packages目录中提取。
我自己习惯的做法是:在外网机器上下载一个Packages目录的完整快照,用createrepo做成一个本地 repo,然后在内网机器上配置一个指向 U 盘或内网服务器的 yum 源。这样后面使用yum localinstall或者rpm -ivh就会自动解析依赖,省去手动一个一个找包的痛苦。
除此之外,Oracle XE 的安装包本身要提前下载好,文件名是oracle-xe-11.2.0-1.0.x86_64.rpm.zip,大约 290MB。把 zip 包和依赖包统一放在/opt/oracle-iso/下,方便后续操作。
3. 一步一步装上Oracle XE:从RPM到数据库初始化
环境准备好之后,正式安装其实非常机械。我习惯用 root 用户操作,避免权限问题。整个过程我拆成三块:解压与安装 RPM、配置数据库、验证监听,每一步都有一看就会的命令。
3.1 解压RPM包并处理依赖关系
先把安装包解压:
cd /opt/oracle-iso unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip cd Disk1 ls -lh正常会看到oracle-xe-11.2.0-1.0.x86_64.rpm和response/目录。response/里通常有一个xe.rsp文件,但实际配置时我们并不直接使用这个文件,configure 脚本会交互式读取输入。
接下来先安装依赖。如果你已经配好了本地 repo,最简单的做法是:
yum localinstall -y oracle-xe-11.2.0-1.0.x86_64.rpmyum localinstall会自动安装 RPM 依赖,前提是这个 repo 里有全部依赖包。如果没有 repo,就老老实实用rpm -ivh按顺序装依赖:
rpm -ivh binutils-*.rpm compat-libstdc++-33-*.rpm compat-libcap1-*.rpm \ gcc-*.rpm gcc-c++-*.rpm glibc-*.rpm glibc-devel-*.rpm \ ksh-*.rpm libaio-*.rpm libaio-devel-*.rpm libgcc-*.rpm \ libstdc++-*.rpm libstdc++-devel-*.rpm libXext-*.rpm libXtst-*.rpm \ libXi-*.rpm make-*.rpm net-tools-*.rpm nfs-utils-*.rpm \ sysstat-*.rpm unixODBC-*.rpm unixODBC-devel-*.rpm如果依赖之间有顺序问题,比如glibc-devel依赖glibc,你可以在一次命令里把多个包都列上,rpm 会自动处理大多数顺序。但有一点要特别提醒:pdksh和ksh二选一即可,不要同时装。Oracle 官方文档写的是需要pdksh,但在 RHEL 6 里已经用ksh替代了,我们直接装ksh就行。
3.2 运行RPM安装Oracle XE本体
依赖解决后,安装主包:
rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm安装成功的标志是看到提示信息,大意是“Oracle Database 11g Express Edition 安装完成,接下来需要运行 /etc/init.d/oracle-xe configure”。如果这里报错,常见的有两类:一类是“Failed dependencies”,说明某些依赖包缺失或版本不对;另一类是“error: unpacking of archive failed”,通常是磁盘空间不足或 RPM 包损坏。
安装完成后,检查关键文件是否生成:
ls -l /etc/init.d/oracle-xe ls -l /etc/sysconfig/oracle ls -l /etc/oratab/etc/sysconfig/oracle和/etc/oratab是后续配置时必须用到的。如果没有出现,说明 RPM 安装不完整,需要卸载重装:
rpm -e oracle-xe3.3 执行oracle-xe configure完成数据库初始化
这是最关键的一步。用 root 执行:
/etc/init.d/oracle-xe configure脚本会依次交互式询问:
- HTTP 监听端口,默认 8080,如果端口被占用就换一个,比如 8180。
- Oracle 数据库监听端口,默认 1521。
- SYS 和 SYSTEM 账户的密码,一定要记住,必须是至少 8 位且包含数字和字母。
- 是否随系统自动启动,选择
y或n,建议选y。
整个交互过程大概半分钟。执行完成后,脚本会启动实例并创建XE数据库。成功时终端会显示类似Oracle Database 11g Express Edition is configured successfully的信息。注意这一步必须保证服务器内存至少在 1GB 以上,否则脚本可能在创建实例时直接退出,报ORA-00845: MEMORY_TARGET not supported on this system。
这个ORA-00845我见得太多了,本质是/dev/shm比MEMORY_TARGET小。11g XE 默认的MEMORY_TARGET可能在 808MB 到 1GB 之间,如果/dev/shm只有默认的一半,就会触发这个错误。解决办法是加大/dev/shm,我后面会详细说。
3.4 验证监听与数据库实例
配置完成后,先用监听命令确认状态:
/etc/init.d/oracle-xe status lsnrctl statuslsnrctl status的路径需要先加载 Oracle 环境变量。你可以手动设置:
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe export ORACLE_SID=XE export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH然后执行:
sqlplus / as sysdba如果 SQL*Plus 能进入,执行:
select status from v$instance;返回OPEN就说明实例正常。也可以执行select name, open_mode from v$database;。这部分放在第 5 章再细讲。
4. 离线环境真正磨人的地方:依赖缺失与内核参数
很多人以为装完 RPM、跑通 configure 就大功告成,其实真正磨人的是安装过程中遇到的依赖错误,以及装完后数据库起不来的内核参数问题。这一章的内容全是我在离线环境里实测踩过坑后的总结。
4.1 依赖缺失的排查链路
离线环境下,使用rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm时最常见的报错是:
error: Failed dependencies: libaio-devel is needed by oracle-xe-11.2.0-1.0.x86_64 unixODBC-devel is needed by oracle-xe-11.2.0-1.0.x86_64 ksh is needed by oracle-xe-11.2.0-1.0.x86_64看到这种提示后,别急着--nodeps硬装。虽然可以用rpm -ivh --nodeps oracle-xe-...rpm跳过依赖检查,但跳过的依赖若是数据库运行真正需要的,后续初始化必出问题。正确做法是逐个排查。
先检查系统里是否已经安装了名为“类似”的包:
rpm -qa | grep unixODBC rpm -qa | grep libaio rpm -qa | grep ksh rpm -qa | grep compat-libstdc++很多时候,银河麒麟 V10 自带的是unixODBC2.x,而 Oracle 需要的版本也是 2.x,那就可以直接在Packages目录里找到对应 rpm,手动安装后再重新执行。如果缺的是compat-libstdc++-33,这个包在较新的源里已经移除了,可以从 RHEL 6.10 的 DVD 镜像中提取。安装命令:
rpm -ivh compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm如果执意要用--nodeps,我的经验是:只对compat-libstdc++-33这类非核心依赖使用,对glibc、libaio、ksh这些核心依赖绝不能用。因为glibc一旦被覆盖成不兼容的版本,系统都可能崩溃。稳妥安装顺序是:
- 先装所有能正常解析的核心依赖;
- 再装
compat-libstdc++-33等老版本兼容库; - 最后安装 Oracle RPM。
4.2 内核参数、共享内存与监听配置
安装成功后,数据库起不来最常见的原因是共享内存和信号量参数不达标。Oracle 11g R2 要求的最低参数如下:
kernel.semmsl = 250 kernel.semmns = 32000 kernel.semopm = 100 kernel.semmni = 128 kernel.shmall = 1073741824 kernel.shmmax = 17179869184 kernel.shmmni = 4096 fs.file-max = 6815744 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在银河麒麟 V10 上,直接编辑/etc/sysctl.conf,追加上述内容,然后执行sysctl -p生效。我建议生产环境把shmmax设成物理内存的一半左右,shmall设成总页数,这样能减少 11g 自动内存管理(AMM)在启动时的奇怪报错。
接着处理/dev/shm大小。11g XE 的自动内存管理默认使用共享内存文件系统,如果/dev/shm小于MEMORY_TARGET,就会出现ORA-00845。查看当前大小:
df -h /dev/shm如果只有 1GB 或更小,需要重新挂载:
mount -o remount,size=2G /dev/shm为了让重启后也生效,编辑/etc/fstab,找到包含tmpfs的那一行,改成:
tmpfs /dev/shm tmpfs defaults,size=2G 0 0建议size不低于物理内存的 1/3。这个改动是必须的,千万不要跳过。
监听配置也可能坑人。安装好后,有时候lsnrctl status显示TNS-01189: The listener may not exist or could not be reached,原因也大多数是/dev/shm或端口被防火墙拦截。可以在/etc/sysconfig/oracle中检查LISTENER配置,但最简单的是直接重启监听:
lsnrctl stop lsnrctl start如果监听能起来但数据库实例没起来,就执行:
sqlplus / as sysdba startup通常到这里数据库就能正常打开。
5. 验证安装、设置开机自启动与日常运维
数据库能启动只是第一步,接下来要把自启动、环境变量、日常命令这些收尾工作做完,否则下次机器重启,数据库又躺平了。
5.1 验证数据库可用性与版本信息
进入 SQL*Plus 后执行:
select banner from v$version; select name, open_mode from v$database;正常能看到Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production之类的输出,OPEN_MODE为READ WRITE。
还可以验证一下连接是否正常。用system用户通过网络服务名连接:
sqlplus system/密码@//localhost:1521/XE如果报ORA-12154: TNS:could not resolve the connect identifier,说明tnsnames.ora没有配置好,需要检查$ORACLE_HOME/network/admin/tnsnames.ora是否包含XE的条目。默认内容应该类似:
XE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) )5.2 配置开机自启动
银河麒麟 V10 使用 systemd,最简单的自启方式是把oracle-xe这个 init 脚本服务化。编辑/etc/systemd/system/oracle-xe.service:
[Unit] Description=Oracle Database 11g Express Edition After=syslog.target network.target [Service] Type=forking ExecStart=/etc/init.d/oracle-xe start ExecStop=/etc/init.d/oracle-xe stop RemainAfterExit=yes User=root [Install] WantedBy=multi-user.target然后执行:
systemctl daemon-reload systemctl enable oracle-xe systemctl start oracle-xe systemctl status oracle-xe另外,还需要确认/etc/oratab文件里XE的条目末尾是Y,而不是N。oratab是数据库实例启动脚本判断“是否随系统启动”的依据。如果文件中是:
XE:/u01/app/oracle/product/11.2.0/xe:N改成:
XE:/u01/app/oracle/product/11.2.0/xe:Y改完重启后执行/etc/init.d/oracle-xe status,如果显示Oracle Database 11g Express Edition is running,就说明自启动配置成功。
5.3 环境变量、账号安全与日常运维中的几个坑
日常运维最烦的就是每次开终端都要手动export ORACLE_HOME。建议把环境变量写入oracle用户的.bash_profile:
cat >> /home/oracle/.bash_profile << 'EOF' export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe export ORACLE_SID=XE export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH EOF然后切换用户测试:
su - oracle sqlplus / as sysdba这里有几个日常运维中我反复踩的坑:
- 密码过期:XE 默认的
SYS/SYSTEM账号不受密码过期影响,但应用账号可能会。用alter profile default limit password_life_time unlimited;可以解决。 - 会话连接数限制:XE 限制并发会话数和 CPU 使用量,如果应用连接池配置过大,会报
ORA-12518,需要在应用侧调整连接池。 - 磁盘空间:Oracle 的
alert_<sid>.log在/u01/app/oracle/diag/rdbms/xe/XE/trace/下,如果长期不清理会占满磁盘。建议写一个 cron 脚本定期清理三天前的 trace 文件。 - 字符集问题:很多国产业务库默认使用
ZHS16GBK,如果一开始装的时候没注意,后面导入数据容易乱码。创建数据库时 configure 脚本没有提供字符集选项,但安装后可以在初始化参数里设置NLS_LANG=AMERICAN_AMERICA.AL32UTF8或ZHS16GBK配合应用端。
6. 离线部署中我最后悔没早知道的几个细节
这一章算是给后面还要做类似事情的人提个醒,都是我实际操作中吃过亏才总结出来的。
第一,离线环境一定要保留一份日志。我在安装时习惯用script install.log记录整个终端输出,这样一旦后期排查问题,能快速定位是哪一步报错。Oracle 的alert_<sid>.log也要经常看,很多时候数据库起不来的真正原因不在 init 脚本,而在日志末尾的 ORA- 错误。
第二,不要在 configure 过程中随意中断。我当时因为端口被占用,中途 Ctrl+C 了一次,结果导致/etc/sysconfig/oracle内容不完整,再次 configure 时反复报错。解决办法是彻底清理后重装:rpm -e oracle-xe,然后删除/u01/app/oracle目录,再重新rpm -ivh。所以最好提前用ss -lntp检查 8080 和 1521 端口是否被占用。
第三,关于备份恢复:虽然是 XE,但数据一样重要。备份用最简单实用的方式即可,例如使用expdp工具导出核心用户数据到本地目录,再定时同步走。不要尝试用rman做增量备份,XE 在 11.2 里对 RMAN 的支持有限,折腾的时间足够你导出好几遍。
第四,如果条件允许,在做正式部署之前先搭一个一模一样的测试环境。离线的坑往往不在于操作复杂度,而在于你无法随时上网查资料。一台同样安装了银河麒麟 V10 的虚拟机,按本文流程跑一遍,把报错信息记下来,再去生产环境动手,效率会高很多。
最后留一个我个人觉得非常好用的小技巧:在离线环境下把用到的 RPM 包、Oracle 安装包、依赖包、sysctl 配置、systemd 单元文件,全部放在同一个目录里,并写一个README.md记录安装顺序。下次不管换到哪台机器,只要照做就能复现,不用再从头理清依赖关系。这种“离线部署文档标准化”的习惯,能让你在后续运维中省出大量时间。