简介:面向需要在龙蜥Anolis系统上部署Oracle 11g的数据库管理员、运维人员及数据库课程学习者,这份安装包提供了一套可用于实验环境搭建与迁移验证的部署素材,重点解决系统适配、依赖处理、实例初始化及数据还原等问题。包内共11个文件,以7个rpm安装包为主,辅以sh自动化安装脚本、conf配置文件、chkconfig服务管理脚本和共享内存相关配置,压缩包约334.17MB,基本覆盖数据库软件安装与运行环境准备所需组件。配套脚本把环境变量设置、依赖检查、RPM安装、实例创建和监听器配置等环节串联起来,并保留DMP文件导入能力,便于在数据迁移或恢复场景中减少手工重复操作。已有3020人学习,适合希望对照脚本理解Oracle 11g在Anolis上部署要点、排查依赖与权限问题的中级读者参考,也可作为测试环境快速复现的素材。
1. 龙蜥上装 Oracle 11g:先把「rpm 包」这件事说透
机房交付一台龙蜥(Anolis)系统,业务侧要求跑一套老库,手里只有 oracle11g 数据库安装包,具体文件是 oracle11g.rpm,外网不通,依赖也不能临时拉。这种场景下,最危险的动作就是上来rpm -ivh。Oracle 11g 在 Linux 上的传统安装介质是runInstaller那一套,rpm 封装通常只解决离线分发、依赖声明、目录预置或预编译二进制中的一部分,不是“装完就能连”。先判断它属于“安装器薄封装”还是“ORACLE_HOME 厚封装”,后面走静默安装还是只做配置建库,路径完全不同。适合内网离线部署、老系统迁移、测试环境快速复现的人;不适合不做兼容性验证就直接压生产的人。
2. 拆包看结构:oracle11g.rpm 里到底装了什么
拿到包先别装,先看文件清单和安装脚本。rpm 的元数据能告诉你它依赖什么、安装前后会执行什么,文件清单能告诉你它是“带安装器的壳”还是“已经把 ORACLE_HOME 铺好了”。这一步花十分钟,后面能少熬一晚上。
2.1 用 rpm -qpl 和 cpio 看文件清单
先看元数据和文件列表,重点找runInstaller、response、root.sh、orainstRoot.sh、bin/sqlplus、inventory这些标志物。
# 查看 rpm 元数据:版本、架构、依赖、安装脚本 rpm -qpi oracle11g.rpm rpm -qp --requires oracle11g.rpm rpm -qp --scripts oracle11g.rpm # 列出包内文件,先看有没有 runInstaller、response、root.sh rpm -qpl oracle11g.rpm | sort | head -n 80 # 不安装,解包到临时目录做静态检查 mkdir -p /tmp/oracle11g_rpm_view cd /tmp/oracle11g_rpm_view rpm2cpio /path/to/oracle11g.rpm | cpio -idmv find . -maxdepth 4 -type f | sort | head -n 120rpm -qpi看包摘要,--requires看依赖,--scripts看%pre、%post这些安装脚本。rpm -qpl只列文件,不落盘。rpm2cpio把 rpm 转成 cpio 流,cpio -idmv里-i是提取,-d自动建目录,-m保留时间戳,-v显示过程。head只是防止刷屏,真要看全量就去掉。没有rpm2cpio命令时,先从系统镜像或内部源补rpm2cpio包,别用rpm2cpio.pl之类的野脚本替代。
如果文件清单里只有response、db_install.rsp、orainstRoot.sh、root.sh,没有bin/sqlplus,大概率是薄封装:rpm 只负责铺响应文件和目录,真正的软件安装还要runInstaller从同目录的官方介质装。反过来,如果能看到product/11.2.0/dbhome_1/bin/sqlplus、lib/libclntsh.so.11.1、rdbms目录,说明是厚封装,装完包之后重点变成目录权限、动态库、建库和监听。
这里有个血泪经验:解包目录只用来“看”,不要在里面执行root.sh。rpm 包里的脚本可能写死了路径和用户,解包目录执行会把权限和清单写乱。
2.2 安装包与 runInstaller 介质的关系
薄封装和厚封装的区别不在文件名,而在“软件根目录是否已经在包里”。用一条 grep 能快速判断:
rpm -qpl oracle11g.rpm | grep -E 'runInstaller|response|root.sh|orainstRoot.sh|bin/sqlplus|inventory'grep -E支持多模式匹配。命中runInstaller但没有bin/sqlplus,说明安装器在包里、软件还没装;命中bin/sqlplus且有lib/libclntsh.so.11.1,说明文件已经铺好。这里要注意,rpm 包内路径不一定以/开头,rpm -qpl输出的是相对根路径,看到u01/app/oracle/...是正常的。
薄封装的落地流程通常是:补依赖 → 建用户和目录 → 解压官方介质 → 改响应文件 →runInstaller -silent→ 跑root.sh→netca→dbca。厚封装的流程短一些:装 rpm → 检查oracle用户和oraInst.loc→ 跑root.sh→ 配环境变量 →netca→dbca。但厚封装不等于“零依赖”,它仍然依赖libaio、libstdc++、ksh这些运行库,也仍然要做内核参数和资源限制。
判断薄厚之后,再决定要不要准备官方 zip。薄封装如果只带响应文件,你手上又没有官方介质,这个 rpm 是装不完整的;这种情况不要硬装,先把介质补齐。厚封装如果包内文件时间戳很老,先确认它是不是针对某个固定小版本做的预编译,别把补丁状态当成最新。
2.3 选型:rpm 封装安装 vs 官方 runInstaller 的边界
| 维度 | rpm 封装安装 | 官方 runInstaller |
|---|---|---|
| 部署速度 | 快,目录和文件一次铺好 | 慢,要过先决条件检查和编译 |
| 离线依赖 | 依赖声明清楚,但兼容库仍要自备 | 依赖要手工补,检查更细 |
| 可追溯性 | 取决于包内脚本和日志 | 安装日志、清单、补丁链完整 |
| 补丁与升级 | 要看封装方式,厚封装可能不便打补丁 | 按官方补丁流程走,边界清楚 |
| 排错入口 | rpm -qp --scripts、包内日志、root.sh输出 | oraInventory/logs、make.log、CVU 报告 |
| 适用场景 | 内网测试、快速复现、固定版本交付 | 生产、需要审计和补丁管理的场景 |
选型上,我一般把 rpm 封装当成“交付加速器”,不当成“兼容性证明”。测试环境用厚封装能省掉 42% 卡住的编译问题;生产环境如果要求补丁可追溯,还是走官方runInstaller,rpm 只用来分发响应文件和依赖。rpm -ivh --test oracle11g.rpm可以做安装前冲突测试,只检查不落盘,适合先看文件冲突。--nodeps不要随手加,--noscripts更要谨慎,它会跳过用户创建、目录权限和清单写入,后面会以“找不到 oracle 用户”“没有 oraInst.loc”的形式翻车。
3. 龙蜥底座准备:依赖、内核参数与资源限制
Oracle 11g 对底座的要求比较“老派”:共享内存、信号量、文件句柄、异步 IO、兼容库,一个都不能少。龙蜥 8 系这类企业级 Linux 兼容底座,包管理器和内核都比 11g 当年新,直接装容易在依赖和编译环节卡住。先把底座调平,再谈安装器。
3.1 依赖包与兼容库:别让 libaio 卡住第一步
# 先确认系统版本和仓库可用 cat /etc/os-release dnf repolist # 基础编译与运行依赖,按实际仓库包名微调 dnf install -y libaio libaio-devel libstdc++ libstdc++-devel gcc gcc-c++ make binutils \ elfutils-libelf elfutils-libelf-devel glibc glibc-devel ksh unzip \ libX11 libXext libXtst libXrender libXi # 11g 常见的 32 位兼容库,64 位系统上要确认仓库是否有 dnf install -y compat-libstdc++-33 || echo "兼容库需从内部兼容源补齐" # 检查关键 so 是否可解析 ldconfig -p | grep -E 'libaio|libstdc\+\+|libclntsh'dnf install -y自动确认,libaio是异步 IO 依赖,Oracle 数据文件读写会用到;compat-libstdc++-33提供老 C++ ABI,11g 的部分二进制和安装器会找libstdc++.so.5;ksh是安装脚本常用 shell;libX11系列是图形安装器和部分工具依赖。|| echo在缺包时给提示,不中断整条命令,但看到提示就要去补,不要当没看见。ldconfig -p查动态库缓存,grep -E里libstdc\+\+需要转义加号。
| 依赖包 | 作用 | 缺失时的典型现象 |
|---|---|---|
| libaio / libaio-devel | 异步 IO | 建库或启动时报 IO 相关错误 |
| compat-libstdc++-33 | 老 C++ ABI | 安装器报libstdc++.so.5找不到 |
| ksh | 安装脚本 | 脚本报ksh: not found |
| gcc / gcc-c++ / make | 安装时编译 | 42% 左右 makefile 报错 |
| libX11 / libXext | 图形安装器 | runInstaller图形界面起不来 |
| elfutils-libelf | 二进制分析 | 先决条件检查缺项 |
这里有个坑:Anolis 8 的默认仓库不一定有compat-libstdc++-33,从旧介质里抽包混装要确认架构和符号版本,不要直接把 32 位包丢进 64 位环境就完事。rpm -q libaio compat-libstdc++-33 ksh可以快速核对已装包。
3.2 内核参数:共享内存、信号量、网络端口
# 备份原配置 cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%F) cat >> /etc/sysctl.conf <<'EOF' fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 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 EOF sysctl -pkernel.shmmax是单个共享内存段最大字节数,kernel.shmall是共享内存总页数,kernel.shmmni是段数上限。上面给的是大内存机器的常见模板,小内存机器要按物理内存降,不要照抄 4TB 的shmmax。shmall按shmmax / PAGE_SIZE估算,getconf PAGE_SIZE通常是 4096。kernel.sem四个值依次是信号量集合数、每集合信号量数、每次操作数、系统级信号量数,250 32000 100 128是 Oracle 安装检查常见组合。fs.aio-max-nr控制异步 IO 请求上限,fs.file-max是系统级文件句柄上限。ip_local_port_range避开监听和客户端连接常用端口。sysctl -p加载配置,报错就看键名是否被内核弃用。
| 参数 | 常用值 | 说明 |
|---|---|---|
| kernel.shmmax | 物理内存一半或更大 | 单段共享内存上限 |
| kernel.shmall | shmmax / PAGE_SIZE | 共享内存总页数 |
| kernel.shmmni | 4096 | 共享内存段数 |
| kernel.sem | 250 32000 100 128 | 信号量四元组 |
| fs.file-max | 6815744 | 系统文件句柄上限 |
| fs.aio-max-nr | 1048576 | 异步 IO 上限 |
| net.ipv4.ip_local_port_range | 9000 65500 | 本地端口范围 |
3.3 用户、组、目录与 ulimit
# 创建 Oracle 所需的组和用户,uid/gid 按企业规范固定 groupadd -g 54321 oinstall groupadd -g 54322 dba groupadd -g 54323 oper useradd -u 54321 -g oinstall -G dba,oper -m -s /bin/bash oracle passwd oracle # 目录规划:ORACLE_BASE、ORACLE_HOME、oraInventory、数据文件目录 mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1 mkdir -p /u01/app/oraInventory mkdir -p /u01/app/oracle/oradata chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app # 资源限制 cat >> /etc/security/limits.conf <<'EOF' oracle soft nproc 16384 oracle hard nproc 16384 oracle soft nofile 65536 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 10240 oracle soft memlock unlimited oracle hard memlock unlimited EOF # 让 limits 在登录时生效 grep -q 'pam_limits.so' /etc/pam.d/login || echo 'session required pam_limits.so' >> /etc/pam.d/logingroupadd -g固定 gid,useradd -u固定 uid,-g是主组,-G是附加组,-m建家目录,-s指定 shell。目录权限给 775,让oinstall组可写。limits.conf里soft是默认限制,hard是上限,memlock unlimited让 Oracle 能锁内存。pam_limits.so确保登录会话加载限制,grep -q避免重复追加。
验证用su - oracle -c 'ulimit -a',看open files、max user processes、stack size是否生效。如果系统用 systemd 服务启动数据库,limits.conf不一定对服务生效,还要在 unit 里配LimitNOFILE。这一步不做,后面可能遇到ORA-27123之类的连接问题。
4. 静默安装与建库:把响应文件写成可复现的模板
静默安装的价值是可重复:响应文件进版本库,日志进交付记录,换一台机器改几个路径就能再跑一遍。Oracle 11g 的响应文件参数多,但关键的就那么几个,先把ORACLE_HOME、SID、字符集、组名对齐,再谈高级参数。
4.1 响应文件的关键参数:ORACLE_HOME、SID、字符集
# /tmp/db_install.rsp 的关键片段,按实际介质路径调整 oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en,zh_CN ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_BASE=/u01/app/oracle oracle.install.db.InstallEdition=EE oracle.install.db.DBA_GROUP=dba oracle.install.db.OPER_GROUP=oper oracle.install.db.BACKUPDBA_GROUP=dba oracle.install.db.DGDBA_GROUP=dba oracle.install.db.KMDBA_GROUP=dba SECURITY_UPDATES_VIA_MYORACLESUPPORT=false DECLINE_SECURITY_UPDATES=true oracle.installer.autoupdates.option=SKIP_UPDATESINSTALL_DB_SWONLY表示只装软件不建库,建库交给dbca,这样安装失败和建库失败能分开排查。UNIX_GROUP_NAME是oinstall,INVENTORY_LOCATION是中央清单目录,要和目录准备一致。SELECTED_LANGUAGES控制安装语言,ORACLE_HOME和ORACLE_BASE不要写错层级。InstallEdition=EE是企业版,如果资源是标准版要改。DBA_GROUP、OPER_GROUP对应前面创建的组,BACKUPDBA_GROUP、DGDBA_GROUP、KMDBA_GROUP在 11g 里通常也指向dba。SECURITY_UPDATES...=false和DECLINE_SECURITY_UPDATES=true是离线环境常见组合,autoupdates=SKIP_UPDATES跳过自动更新检查。
响应文件里不要放明文密码,安装阶段一般不需要,建库阶段需要密码时用临时文件并chmod 600,跑完就删。路径不要带空格,不要用软链接指向ORACLE_HOME,否则root.sh和清单容易写错。
4.2 执行安装与监听配置
# 以 oracle 用户执行,日志落到可追溯目录 su - oracle 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:$LD_LIBRARY_PATH export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 cd /tmp/oracle_install ./runInstaller -silent -responseFile /tmp/db_install.rsp \ -ignorePrereq -waitforcompletion \ -J-Doracle.install.mgdb.computeMarkup=false # 安装器提示后,用 root 执行两个脚本 su - root /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.shsu - oracle切换用户并加载环境,ORACLE_BASE、ORACLE_HOME、ORACLE_SID、PATH、LD_LIBRARY_PATH、NLS_LANG是基础变量。runInstaller -silent静默安装,-responseFile指定响应文件,-ignorePrereq跳过先决条件检查,-waitforcompletion等安装完成,-J-D...关闭某些标记计算,减少卡顿。-ignorePrereq不是后悔药,跳过检查后编译错误还是会来,日志里要能看到具体缺项。
orainstRoot.sh建清单和权限,root.sh建/etc/oraInst.loc和初始化脚本。root.sh的输出要逐行看,不要一路回车。监听配置可以用netca静默:
# 静默配置监听,端口默认 1521 netca -silent -responseFile /tmp/netca.rsp lsnrctl status lsnrctl startnetca.rsp里至少确认LISTENER_NUMBER、LISTENER_NAMES、LISTENER_PROTOCOLS、LISTENER_START。如果 rpm 包已经带了监听配置,可以先lsnrctl status看,有监听就跳过。端口冲突用ss -lntp | grep 1521查,别等建库时才发现 1521 被别的进程占了。
4.3 建库与验证:sqlplus 连上去之后看什么
# 静默建库,密码用环境变量传入,避免留在 history export ORACLE_SID=ORCL dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname ORCL \ -sid ORCL \ -sysPassword "$DB_SYS_PASS" \ -systemPassword "$DB_SYS_PASS" \ -characterSet AL32UTF8 \ -nationalCharacterSet AL16UTF16 \ -memoryPercentage 40 \ -emConfiguration NONE \ -datafileDestination /u01/app/oracle/oradata \ -redoLogFileSize 200 \ -initParams db_block_size=8192 # 验证实例和数据库状态 sqlplus -s / as sysdba <<'SQL' set pagesize 200 select instance_status from v$instance; select name, open_mode, log_mode from v$database; select tablespace_name, status from dba_tablespaces; SQL # 验证监听和本地连接 lsnrctl status tnsping ORCLdbca -silent -createDatabase静默建库,-templateName用通用模板,-gdbname全局库名,-sid实例名,-sysPassword和-systemPassword密码,-characterSet字符集,-nationalCharacterSet国家字符集,-memoryPercentage内存占比,-emConfiguration NONE不配 EM,-datafileDestination数据文件目录,-redoLogFileSize重做日志大小,-initParams初始化参数。sqlplus -s静默模式,heredoc 里set pagesize控制输出。验证要看实例状态、打开模式、归档模式、表空间。
密码复杂度要提前确认,11g 默认密码策略可能要求大小写、数字、特殊字符,密码太简单会在建库阶段报错。tnsping只验证 TNS 解析和监听可达,不验证认证,别把它当成连接成功的证据。建库后看告警日志:$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace/alert_$ORACLE_SID.log,里面如果有ORA-开头的错误,先处理再交付。
5. 避坑与排查:龙蜥上最容易翻车的五件事
5.1 现象:安装到 42% 报 makefile 错误
现象是runInstaller走到 42% 左右,日志里ins_ctx.mk、ins_emagent.mk报gcc: error或ld: cannot find -l...。原因通常是 11g 的 makefile 面向老编译器,龙蜥 8 系的 gcc、glibc、ld 都比当年新,链接参数不兼容;也可能缺compat-libstdc++-33,或者ld找不到 32 位库。解决思路是先看日志定位缺什么,不要只加-ignorePrereq就以为过了:
grep -n -E 'Error|error:|cannot find|undefined reference' \ $ORACLE_BASE/oraInventory/logs/installActions*.log | tail -n 50grep -n显示行号,-E多模式,tail -n 50看最近 50 行。日志路径因版本不同可能略有差异,找不到就find $ORACLE_BASE -name 'installActions*.log'。缺兼容库就补,缺 32 位库就确认仓库,已知 makefile 问题可以按补丁方式改,但改之前备份。厚封装 rpm 如果已经绕过编译,仍然要在目标机器上验证sqlplus和建库,不要把“包安装成功”当成“软件可用”。
5.2 现象:sqlplus 启动报 libclntsh.so 找不到
现象是sqlplus: error while loading shared libraries: libclntsh.so.11.1: cannot open shared object file。原因一般是ORACLE_HOME/lib不在动态库缓存,oracle用户环境变量没加载,或者 rpm 安装后没有执行ldconfig。先查:
echo "$ORACLE_HOME/lib" > /etc/ld.so.conf.d/or <p> <a href="https://download.csdn.net/download/weixin_43968335/85060551" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>