简介:这份资源面向需要在龙蜥Anolis操作系统上部署Oracle 11g数据库的运维与DBA人员,提供了一套可自动化完成安装与数据恢复的整合包。Anolis OS作为阿里云维护的企业级Linux发行版,是承载Oracle数据库的稳定基础环境,而手动安装Oracle 11g往往涉及依赖处理、环境变量配置、实例创建与监听器设置等繁琐环节,本包通过脚本将这些步骤串联起来,降低部署门槛。压缩包共11个文件,以7个rpm安装包为主体,另含chkconfig服务配置、S01shm_load共享内存加载脚本、install.sh自动化安装脚本及60-oracle.conf系统参数配置文件,整体约334.17MB。借助安装脚本可自动完成环境变量设置、依赖安装、RPM解压安装、数据库实例创建与监听配置,并支持通过数据泵工具还原dmp备份文件,便于数据迁移与恢复。目前已有3017人学习下载,适合希望快速搭建Oracle 11g实验或生产环境、减少手动排错成本的读者参考使用。
1. 龙蜥系统上装 Oracle 11g:一份能直接落地的 RPM 包拆解
在国产化替代的浪潮里,龙蜥(Anolis OS)作为 CentOS 停更后的主流接棒者,被大量部署到内网服务器上。但一个很现实的问题摆在面前:很多存量业务系统仍然绑死在 Oracle 11g 上,而 Oracle 官方从未针对龙蜥发布过认证安装包。于是“龙蜥 + Oracle 11g”这个组合,成了不少运维和 DBA 的噩梦——依赖冲突、库文件缺失、静默安装报错,每一步都可能卡住半天。这份资源就是针对这个场景打包的 Oracle 11g 安装包集合,核心是 oracle11g.rpm 及其配套依赖,目标是让龙蜥系统上跑起 Oracle 11g 这件事从“玄学”变成“可复现”。它适合需要在国产 OS 上部署存量 Oracle 数据库的运维工程师、DBA,以及做信创适配的交付人员。
2. 先搞清楚这套 RPM 包里到底有什么:组件拆解与选型逻辑
拿到一个安装包集合,最忌讳的就是上来直接rpm -ivh *.rpm。龙蜥的底层是 RPM 体系,Oracle 11g 的安装包如果来源不明确,很容易和系统自带的库产生冲突。所以第一步不是装,是拆——搞清楚包里每个文件是干什么的,为什么需要它,以及它在龙蜥上可能遇到什么问题。
2.1 核心 RPM 包与依赖关系梳理
Oracle 11g 在 Linux 上的安装,官方推荐的方式是 runInstaller 图形化或静默安装,但那是基于 OEL(Oracle Enterprise Linux)或 RHEL 的。龙蜥虽然兼容 RHEL 生态,但内核版本和 glibc 版本有差异,直接跑 runInstaller 大概率会在前置检查阶段就挂掉。这套资源把安装过程拆成了 RPM 包的形式,本质上是把 Oracle 的二进制文件、库文件、配置脚本预先打包,绕过官方安装器的部分检查逻辑。
常见的包结构大致是这样的:
| 文件/包名 | 作用 | 龙蜥上的注意事项 |
|---|---|---|
| oracle11g.rpm | 主程序包,含数据库二进制、网络配置工具 | 安装路径默认/u01/app/oracle,需提前建好 |
| oracle11g-deps.rpm | 依赖库集合,含 compat-libstdc++、libaio 等 | 龙蜥最小化安装通常缺这些 |
| oracle11g-preinstall.rpm | 预配置包,创建 oracle 用户、内核参数 | 需检查是否与系统已有配置冲突 |
| 附带的 response 文件 | 静默安装应答文件 | 路径和 SID 需按实际环境改 |
这里要特别说清楚一个选型逻辑:为什么用 RPM 而不是官方 runInstaller?因为龙蜥的orainstRoot.sh和root.sh脚本在执行时会调用一些 RHEL 特有的路径和命令,比如/etc/redhat-release的硬编码检查。RPM 包的方式相当于把这些检查绕过去了,直接落文件、配环境。代价是灵活性降低——你没法在安装过程中自定义组件,但换来的是可批量、可脚本化、可复现。
2.2 龙蜥版本与 Oracle 11g 的兼容性边界
龙蜥目前主流版本是 8.x 系列,对应 RHEL 8 的生态。Oracle 11g 官方支持的最高版本是 RHEL 6/7,到了 RHEL 8 时代,glibc 版本从 2.17 跳到了 2.28,很多 Oracle 11g 依赖的旧符号表已经不存在了。这就是为什么直接装官方包会报libclntsh.so: cannot open shared object file或者GLIBC_2.14 not found这类错误。
这套 RPM 包能用的前提是:龙蜥 8.x 上已经安装了兼容性库,或者包内自带了这些库的静态编译版本。我一般会先确认三件事:
# 查看龙蜥版本和内核 cat /etc/anolis-release uname -r # 检查 glibc 版本 ldd --version | head -1 # 检查关键依赖是否已安装 rpm -qa | grep -E "compat-libstdc|libaio|libnsl|ncurses-compat"如果ldd --version显示的是 2.28 及以上,而包里没有自带兼容库,那安装后大概率会遇到二进制无法启动的问题。这时候需要额外从龙蜥的 compat 仓库拉取compat-libstdc++-33和libnsl2等包。注意,龙蜥 8 的仓库里libnsl已经升级到了 2.x,而 Oracle 11g 需要的是 1.x 的libnsl.so.1,这个坑后面会细说。
2.3 安装前的系统环境准备
在真正执行 RPM 安装之前,系统层面的准备工作决定了后面会不会翻车。我习惯按这个顺序走一遍:
# 1. 关闭 SELinux(Oracle 11g 对 SELinux 策略不友好) setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config # 2. 关闭防火墙或放行 1521 端口 systemctl stop firewalld systemctl disable firewalld # 3. 创建 oracle 用户和组 groupadd -g 54321 oinstall groupadd -g 54322 dba useradd -u 54321 -g oinstall -G dba oracle echo "oracle" | passwd --stdin oracle # 4. 创建安装目录并授权 mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01 # 5. 调整内核参数(写入 /etc/sysctl.conf) cat >> /etc/sysctl.conf <<EOF kernel.shmall = 2097152 kernel.shmmax = 4294967295 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 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 fs.aio-max-nr = 1048576 EOF sysctl -p # 6. 调整用户限制(写入 /etc/security/limits.conf) cat >> /etc/security/limits.conf <<EOF oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 32768 EOF这几步里,内核参数的kernel.shmmax和kernel.shmall是最容易出问题的。龙蜥默认的共享内存段可能不够 Oracle 11g 的 SGA 使用,如果安装后启动实例报ORA-27102: out of memory,八成是这里没配对。fs.aio-max-nr也要注意,Oracle 的异步 I/O 依赖这个值,设小了会在 alert log 里看到ORA-27090警告。
3. 动手安装:从 RPM 部署到实例启动的完整链路
环境准备好之后,就可以进入安装环节了。这一章按实际操作顺序走,每一步都给出命令和验证方法。需要强调的是,RPM 安装和官方 runInstaller 的流程差异很大,不能混着用——比如你没法用dbca建库之后再回头补 RPM 包,顺序反了会出各种权限和路径问题。
3.1 RPM 包的安装顺序与依赖处理
RPM 安装最怕的就是依赖循环。这套包的正确安装顺序是:先装 preinstall 包,再装 deps 包,最后装主包。如果顺序错了,主包安装时会报Failed dependencies,然后你再去补依赖,可能触发已安装包的脚本重新执行,把之前的配置覆盖掉。
# 切换到 root,进入包所在目录 cd /opt/oracle11g_rpm # 第一步:安装预配置包 rpm -ivh oracle11g-preinstall.rpm # 第二步:安装依赖库包(注意 --nodeps 慎用) rpm -ivh oracle11g-deps.rpm # 第三步:安装主程序包 rpm -ivh oracle11g.rpm # 验证安装结果 rpm -qa | grep oracle ls -l /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle这里有个细节:oracle11g-deps.rpm里可能包含compat-libstdc++-33,这个包在龙蜥 8 的默认仓库里已经没有了,必须从第三方或龙蜥的 compat 仓库获取。如果安装 deps 包时报conflicts with file from package,说明系统里已经有同名文件但版本不同,这时候不要直接--force,先用rpm -qf查一下是哪个包提供的,再决定是卸载还是忽略。
安装完成后,检查/u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle这个二进制文件是否存在,以及它的动态链接是否完整:
# 检查 oracle 二进制的库依赖 ldd /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle | grep "not found"如果输出里有not found,说明还有缺失的库。常见的是libnsl.so.1、libcrypt.so.1、libaio.so.1。龙蜥 8 上libnsl.so.1需要单独安装libnsl包,但默认仓库里的版本是 2.x,不提供.so.1符号链接。解决办法是手动创建软链接:
# 查看 libnsl 实际安装路径 rpm -ql libnsl | grep "\.so" # 如果只有 libnsl.so.2,创建兼容链接 ln -s /usr/lib64/libnsl.so.2 /usr/lib64/libnsl.so.1这个软链接的做法在龙蜥上是经过验证的,Oracle 11g 调用libnsl.so.1时实际加载的是 2.x 的库,大部分情况下能正常工作,但涉及 NIS 或旧版网络协议的功能可能会有异常。如果业务不依赖这些,可以忽略。
3.2 静默建库:response 文件的关键参数
RPM 包安装完只是把二进制文件放到了位,数据库实例还没建。Oracle 11g 建库可以用dbca静默模式,也可以用CREATE DATABASE脚本。这套资源里通常附带了一个 response 文件模板,我一般会基于它改几个关键参数。
# 切换到 oracle 用户 su - oracle # 设置环境变量(写入 .bash_profile) cat >> ~/.bash_profile <<EOF 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 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 EOF source ~/.bash_profile # 复制 response 文件并修改 cp /opt/oracle11g_rpm/dbca.rsp ~/dbca_custom.rspresponse 文件里需要重点改的参数:
| 参数 | 默认值 | 建议值 | 说明 |
|---|---|---|---|
GDBNAME | orcl | 按业务命名 | 全局数据库名 |
SID | orcl | 与 GDBNAME 一致 | 实例名 |
SYSPASSWORD | 空 | 强密码 | 必须设置 |
SYSTEMPASSWORD | 空 | 强密码 | 必须设置 |
CHARACTERSET | WE8ISO8859P1 | AL32UTF8 | 中文环境必须改 |
TOTALMEMORY | 自动 | 按物理内存 60% | 避免占满内存 |
DATAFILEDESTINATION | $ORACLE_BASE/oradata | 确认路径存在 | 需提前创建 |
改完 response 文件后,执行静默建库:
# 静默建库 dbca -silent -responseFile /home/oracle/dbca_custom.rsp -createDatabase # 建库完成后验证实例状态 sqlplus / as sysdba <<EOF select instance_name, status from v$instance; select name, open_mode from v$database; EOF如果dbca执行到一半报错退出,先看$ORACLE_BASE/cfgtoollogs/dbca/下的日志,里面会记录具体是哪一步失败。最常见的失败原因是DATAFILEDESTINATION目录不存在或权限不对,以及TOTALMEMORY设得太大导致内存分配失败。
3.3 监听配置与网络连通性验证
实例建好之后,还需要配置监听器,否则外部客户端连不上。Oracle 11g 的监听配置用netca或者直接改listener.ora。在龙蜥上,我倾向于直接写配置文件,因为netca的图形界面在最小化安装的系统上跑不起来。
# 编辑 listener.ora cat > $ORACLE_HOME/network/admin/listener.ora <<EOF LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) ) ) EOF # 编辑 tnsnames.ora cat > $ORACLE_HOME/network/admin/tnsnames.ora <<EOF ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) EOF # 启动监听 lsnrctl start # 查看监听状态 lsnrctl status监听启动后,用tnsping验证服务名解析:
tnsping orcl如果返回TNS-12541: TNS:no listener,说明监听没起来或者端口不对。检查lsnrctl status的输出里有没有Service "orcl" has 1 instance(s)这一行。如果没有,说明实例没有向监听注册,需要手动注册:
sqlplus / as sysdba SQL> alter system register;注册后再lsnrctl status就能看到服务了。这个坑在龙蜥上特别常见,因为系统启动顺序和 Oracle 服务脚本的依赖关系可能没配好,导致实例起来了但监听没注册。
4. 避坑指南:龙蜥上装 Oracle 11g 最容易翻车的五个点
这一章是我在实际交付中踩过的坑,每一个都对应真实报错。如果你正在装或者装完了启动不了,先对照这里排查。
4.1 坑一:libnsl.so.1 缺失导致 sqlplus 无法启动
现象:执行sqlplus / as sysdba时报sqlplus: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory。
原因:龙蜥 8 默认安装的libnsl是 2.x 版本,只提供libnsl.so.2,而 Oracle 11g 的二进制文件硬编码依赖libnsl.so.1。这是 RHEL 8 系发行版的通病,不是龙蜥独有的。
解决:创建软链接ln -s /usr/lib64/libnsl.so.2 /usr/lib64/libnsl.so.1,然后执行ldconfig刷新缓存。如果系统里连libnsl.so.2都没有,先yum install libnsl安装。注意不要从网上随便下libnsl.so.1的二进制文件覆盖,版本不匹配会导致更诡异的段错误。
4.2 坑二:内核参数 shmmax 设置不当导致 ORA-27102
现象:启动实例时报ORA-27102: out of memory,alert log 里显示Linux-x86_64 Error: 28: No space left on device。
原因:Oracle 的 SGA 需要一块连续的共享内存段,如果kernel.shmmax小于 SGA 大小,或者kernel.shmall不够,就会报这个错。龙蜥默认的shmmax可能只有物理内存的一半,而 Oracle 11g 的 SGA 如果设得比较大,就会超限。
解决:先算一下 SGA 需要多少内存。show parameter sga可以看到sga_max_size。然后把kernel.shmmax设成比 SGA 大一些的值,kernel.shmall设成shmmax / 4096。改完sysctl -p生效,重启实例。注意shmmax的单位是字节,别写成 KB 了。
4.3 坑三:/dev/shm 空间不足导致建库失败
现象:dbca建库到 30% 左右报错退出,日志里提示ORA-00845: MEMORY_TARGET not supported on this system。
原因:Oracle 11g 的 AMM(自动内存管理)依赖/dev/shm,如果/dev/shm的大小小于MEMORY_TARGET,就会报这个错。龙蜥默认的/dev/shm是物理内存的一半,但如果系统内存本身就不大,或者MEMORY_TARGET设得太大,就会不够。
解决:要么调大/dev/shm(修改/etc/fstab里的tmpfs大小),要么关掉 AMM 改用 ASMM。我一般倾向于后者,因为改/dev/shm需要重启系统,而 ASMM 只需要改参数:
-- 关闭 AMM,启用 ASMM ALTER SYSTEM SET memory_target=0 SCOPE=SPFILE; ALTER SYSTEM SET sga_target=2G SCOPE=SPFILE; ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=SPFILE; -- 重启实例 SHUTDOWN IMMEDIATE; STARTUP;4.4 坑四:字符集设错导致中文乱码
现象:建库时用了默认的WE8ISO8859P1字符集,后来插入中文数据全是问号,select出来也是乱码。
原因:WE8ISO8859P1是西欧字符集,不支持中文。Oracle 11g 建库时如果 response 文件里没指定CHARACTERSET,默认就是这个。而且字符集在建库后不能直接改,只能通过导出重建的方式。
解决:建库前务必在 response 文件里把CHARACTERSET改成AL32UTF8。如果已经建错了,只能expdp导出数据,删库重建,再impdp导入。这个坑的代价极大,一定要在建库前确认。
4.5 坑五:RPM 安装后 oracle 用户环境变量不生效
现象:su - oracle后执行sqlplus提示command not found,或者echo $ORACLE_HOME是空的。
原因:RPM 包安装时可能没有自动写入.bash_profile,或者写入的路径和实际安装路径不一致。另外,龙蜥的su -和su在加载环境变量时有差异,su -才会读取.bash_profile。
解决:手动检查/home/oracle/.bash_profile,确保ORACLE_HOME、ORACLE_SID、PATH、LD_LIBRARY_PATH都正确设置。改完后source ~/.bash_profile。如果用的是su oracle而不是su - oracle,环境变量不会加载,这是新手最容易忽略的细节。
5. 装完之后怎么验证:几个我必跑的检查项
安装完成不等于能用。我每次交付前都会跑一遍下面这套检查,确认数据库真的处于可用状态,而不是“看起来装好了”。
5.1 实例级健康检查
-- 检查实例状态和启动时间 SELECT instance_name, status, startup_time FROM v$instance; -- 检查数据库打开模式 SELECT name, open_mode, log_mode FROM v$database; -- 检查表空间使用率 SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024, 2) AS total_mb, ROUND(SUM(bytes - NVL(free_bytes,0))/1024/1024, 2) AS used_mb FROM dba_data_files df LEFT JOIN (SELECT tablespace_name, SUM(bytes) free_bytes FROM dba_free_space GROUP BY tablespace_name) fs USING (tablespace_name) GROUP BY tablespace_name; -- 检查无效对象 SELECT owner, object_name, object_type FROM dba_objects WHERE status = 'INVALID';v$instance的status应该是OPEN,v$database的open_mode应该是READ WRITE。如果open_mode是MOUNTED,说明数据库没完全打开,需要ALTER DATABASE OPEN。无效对象如果数量很多,可能是建库时某些脚本没跑完,需要重新执行$ORACLE_HOME/rdbms/admin/catalog.sql和catproc.sql。
5.2 网络与客户端连通性验证
# 从本机测试监听 tnsping orcl # 从远程客户端测试(如果有) sqlplus system/password@//192.168.1.100:1521/orcl # 检查监听日志是否有报错 tail -50 $ORACLE_HOME/network/log/listener.log远程连接如果报ORA-12541,检查防火墙和监听绑定地址。如果报ORA-12514,说明服务名不对,检查tnsnames.ora里的SERVICE_NAME和数据库的service_names参数是否一致。
5.3 开机自启配置
龙蜥上 Oracle 的开机自启需要手动配,RPM 包一般不带 systemd 服务文件。我习惯写一个简单的 systemd unit:
# /etc/systemd/system/oracle.service [Unit] Description=Oracle 11g Database After=network.target [Service] Type=forking User=oracle Group=oinstall Environment="ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1" Environment="ORACLE_SID=orcl" ExecStart=/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart $ORACLE_HOME ExecStop=/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbshut $ORACLE_HOME RemainAfterExit=yes [Install] WantedBy=multi-user.target写完systemctl daemon-reload然后systemctl enable oracle。注意dbstart脚本里有个坑:它会检查/etc/oratab文件里对应实例的启动标志是否为Y,默认可能是N,需要手动改。
# 修改 oratab sed -i 's/orcl:\/u01\/app\/oracle\/product\/11.2.0\/dbhome_1:N/orcl:\/u01\/app\/oracle\/product\/11.2.0\/dbhome_1:Y/' /etc/oratab从那以后我每次装完 Oracle,都会先跑一遍dbstart和dbshut确认脚本能正常控制实例,再配 systemd。这个习惯帮我省了很多“重启后数据库没起来”的麻烦。希望帮到你。
本文还有配套的精品资源,点击获取