☰
龙蜥Anolis OS上Oracle 11g安装包部署:依赖兼容与静默安装
2026/9/25 12:28:29 网站建设 项目流程

简介:面向龙蜥Anolis操作系统部署Oracle 11g数据库的完整安装包,主要解决企业级环境下数据库安装步骤繁琐、依赖配置复杂以及数据恢复耗时等问题,适合需要快速搭建Oracle环境的运维人员与DBA参考使用。压缩包共11个文件,包含7个RPM包、chkconfig服务配置、S01shm_load共享内存加载脚本、install.sh安装脚本及conf配置文件,整体体积334.17MB,可直接用于自动化安装与系统环境调整。安装脚本覆盖环境变量设置、依赖处理、RPM包解压安装、数据库实例创建、监听器配置等环节,大幅降低手动操作出错率;同时支持通过IMPDP等方式还原dmp备份文件,便于完成数据库迁移或恢复。已有3006人学习下载,适合希望借助脚本化方式在龙蜥平台上标准化部署Oracle 11g并处理常见故障的技术人员。

1. 龙蜥anolis系统oracle11g安装包:为什么官方安装包在龙蜥上总要先“改造”才能跑

接手过CentOS停服后迁移到龙蜥(Anolis OS)的朋友,多半会撞上同一个尴尬:系统换新了,业务还想继续用Oracle 11g,结果把从原环境备份下来的oracle11g安装包解压到龙蜥上,runInstaller一启动就报缺库,或者干脆闪退。这不是你下载的安装包损坏,而是Oracle 11g从诞生到官方认证支持的Linux发行版范围,都停留在十年前的RedHat 5/6/7那一代;龙蜥8/9使用的内核与glibc版本比老库新太多,安装包里的OUI(Oracle Universal Installer)和后续的数据库link脚本并没有跟着新系统更新。但这不意味着没救,恰恰相反,只要把安装包选对、依赖补齐、安装方式从图形界面换成静默,龙蜥上跑通11g是完全可以做到的。这篇文章要解决的就是四件事:什么样的安装包能用在龙蜥上、系统环境需要预装什么、怎么让runInstaller顺利装完、装完以后哪些坑必须绕开。

2. 先分清手上是哪种oracle11g安装包:数据库、客户端还是补丁包

2.1 安装包的类型与命名规律

Oracle 11g R2(11.2.0.x)的Linux x86-64安装包,常见的有三大类,别混用。第一类是数据库服务器安装包,文件名通常含有“database”字样,下载下来是两个zip压缩包:linux.x64_11gR2_database_1of2.zip和linux.x64_11gR2_database_2of2.zip。这两个包必须都解压到同一个目录再安装,第一包内含runInstaller可执行文件、OUI组件和response模板,第二包内含大量预编译的库和数据库模板。第二类是客户端安装包,文件名带“client”,用于给应用服务器提供sqlplus、exp/imp等工具,它不需要起实例,体积也小得多。第三类是补丁包,通常以p+数字命名,例如某个PSU补丁,用于在数据库安装完成后修复Bug。如果你在龙蜥上只是想让应用能连上远程的Oracle数据库,装客户端包就够了;如果需要自己在龙蜥上建库,那么“database”两个zip必须齐整。

有一个容易被忽略的判断:安装包的平台标识。Oracle 11g的Linux包分32位和64位,龙蜥目前服务器环境几乎全是x86_64,所以应当选择“linux x64”而不是“linux x86”的版本。一旦拿错,runInstaller会在检查阶段直接拒装,那个报错看起来像权限问题,实际是架构不匹配。

2.2 下载安装包时值得先做的两件事

从Oracle官方渠道获取安装包,一般是登录Oracle Software Delivery Cloud(edelivery)搜索“Oracle Database 11g Release 2”,选择Linux x86-64后下载;也可以去Oracle技术网的Archive页面找历史版本。这两个渠道都需要Oracle账号,没有就注册一个,属于正规流程。真正要注意的是下载后的完整性校验。大zip文件在传输过程中经常损坏,而OUI对解压后文件的完整性很敏感,缺一个字节都可能在安装到中途时报错。

# 对两个zip做SHA1校验,和Oracle官网给出的哈希值对比 sha1sum linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip # 如果网站给的是SHA256,改用 sha256sum linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip

这段命令的逻辑是先计算本机文件的指纹,再和官网页面显示的指纹比对。如果一致,说明zip没坏;如果不一致,重新下载。之前遇到过一次奇怪问题:两个zip都显示校验通过,解压后runInstaller却启动不了,最后排查发现是zip文件权限被改成了非root可读,解压时某些文件带了错误权限位。所以我一般在解压后还会做一次find检查:

unzip linux.x64_11gR2_database_1of2.zip -d /data/install unzip linux.x64_11gR2_database_2of2.zip -d /data/install find /data/install -name "*.sh" -o -name "runInstaller" | xargs ls -l

参数说明:-d指定解压目录,两个包解到同一个目录后OUI会自动合并文件树。find只筛出可执行脚本,看它们是否带x权限位。如果runInstaller没有执行权限,直接chmod +x补上,不要用root跑整个安装流程。

2.3 安装包和龙蜥版本的兼容基线

龙蜥Anolis OS有7、8、9几个大版本。Oracle 11g官方认证的Linux是RedHat 5/6/7,但实际从业人员普遍在RHEL 8兼容层上跑11g,Anolis 8与RHEL 8保持用户态兼容,所以我们的经验在龙蜥8上同样适用。Anolis 7因为glibc是2.17,和RHEL 7一致,安装过程中的坑少一些;Anolis 8的glibc版本是2.28,需要手工补两个兼容库;Anolis 9的glibc更接近2.34,补起来更费劲,不推荐在生产环境直接硬上,除非你有足够时间打补丁。

安装前先确认版本,这是决定后面所有步骤的基础:

cat /etc/os-release uname -r ldd --version | head -n 1
# 输出示例(不同机器有差异) NAME="Anolis OS" VERSION="8.8" kernel: 5.10.134-16.1.an8.x86_64 ldd (GNU libc) 2.28

说明:/etc/os-release决定你是哪个大版本;uname -r看内核,龙蜥8的内核虽然带“an8”标识,但通常不会成为安装Oracle的门槛;ldd版本直接决定你缺哪些老符号。判断逻辑很简单:glibc版本越新,Oracle 11g安装包里自带的库就越容易冲突,因为你用的系统库版本和Oracle预编译时的库版本对不上。

2.4 安装包里的几个关键文件

解压后的database目录结构值得先看清楚再动手。database/runInstaller是安装入口;database/stage/fixup目录存放OUI的修复脚本;database/response目录里放着db_install.rsp、dbca.rsp等应答文件,这些是静默安装的核心;database/install目录则是OUI自己的运行环境。很多人一上来就双击runInstaller,忽略了response目录,结果图形界面卡死以后完全没退路。正确做法是先cd到database目录下,执行./runInstaller -help,确认当前安装包支持哪些参数,再决定是图形装还是静默装。

这里额外提醒一点:安装包解压路径不要有空格和中文,OUI的老脚本对特殊字符的容错极差,放到/root或/home目录下都可能因为父目录权限问题中断。我习惯建立独立的目录/data/install,并保证oracle用户有读权限。

3. 龙蜥系统预改造:让oracle11g安装包的依赖库、用户权限和内核参数全部对齐

3.1 把OUI要用的共享库一次性装齐

Oracle 11g安装包在link阶段会调用大量的系统共享库,龙蜥8默认安装并不包含这些。最常见的缺失库有libaio、libnsl、libncurses、libXtst、libXp等。这里用dnf直接装:

dnf install -y libaio libaio-devel libnsl2 libnsl2-devel \ libncurses5 libncurses5-devel libXtst libXp libXrender \ compat-libcap1 compat-libstdc++-33 elfutils-libelf-devel \ gcc gcc-c++ make binutils unzip

命令逻辑说明:libaio是Oracle数据库的异步IO基础,不装会直接导致数据库无法启动;libnsl2是龙蜥8提供的兼容库,它同时包含libnsl.so.2,而Oracle 11g要的是libnsl.so.1,所以装完还要做符号链接;libncurses5提供老版curses接口,OUI和sqlplus的界面都依赖它;compat-libcap1和compat-libstdc++-33是为了让老版本Oracle编译的二进制能找到旧运行库;gcc/glibc-devel在安装包link阶段必须存在,即使你不编译任何代码。

“libncurses5”这个包在龙蜥8的AppStream里不一定有,如果dnf报错找不到包,可以装ncurses-compat-libs:

dnf install -y ncurses-compat-libs ls -l /usr/lib64/libtinfo.so* /usr/lib64/libncurses.so*

这条命令的逻辑是先装compat包,再检查是否生成了老版本符号链接。Oracle 11g的sqlplus和OUI会请求libncurses.so.5,而ncurses-compat-libs恰好提供这个名称。装完以后,再检查libnsl的链接情况:

# 如果libnsl.so.1不存在,手动建立软链接 ln -s /usr/lib64/libnsl.so.2 /usr/lib64/libnsl.so.1

注意,这个软链接操作适用于glibc 2.28的龙蜥8;在Anolis 8的更新版本里,libnsl2包安装后可能已经把libnsl.so.1放在/usr/lib64/libnsl.so.1,那就跳过软链。判断方式很简单:先ls,存在就不用ln。

3.2 用ldd验证安装包里的二进制是否缺符号

装完依赖库后,不要急着跑OUI,先拿安装包里的oracle二进制做一次ldd检查。安装包虽然还没正式安装,但database/stage/ext/bin目录下的部分二进制可以用。或者更直接的办法:在装完数据库后立即对$ORACLE_HOME/bin/oracle执行ldd,但那种检查只能事后发现。我一般会在解压目录里找类似elf文件先做一个快速检查:

find /data/install/database -name "oracle" -type f -exec ldd {} \; 2>/dev/null | grep "not found"

输出如果为空,说明依赖库基本齐了;如果有“not found”行,按缺失的库名回到dnf搜索安装即可。注意这个find命令可能搜不到oracle二进制,因为安装包里的主程序要等link阶段才生成。更实用的验证方式是在正式安装前跑OUI的prereq检查:

cd /data/install/database ./runInstaller -prereqchecker -silent -responseFile /data/install/database/response/db_install.rsp

这个命令会走一遍安装前的环境检查,把缺的包、内核参数、用户组权限一次性列出来。虽然龙蜥不在官方支持列表里,prereqchecker会报“操作系统版本不满足”,但你可以从输出里区分哪些是致命错误、哪些只是警告。致命错误一般是缺包或权限问题,警告可以忽略。

3.3 创建oracle用户和目录结构

Oracle安装不允许用root直接跑,必须建立专用账户。以下是我在龙蜥8上常用的创建步骤:

groupadd oinstall groupadd dba useradd -g oinstall -G dba -s /bin/bash oracle mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app

这段命令的逻辑是先把oinstall作为软件安装主组,dba作为管理组,oracle用户同时属于两个组。目录规划上,/u01/app是Oracle Base的上级,后续ORACLE_BASE指向/u01/app/oracle,ORACLE_HOME则指向其下的product/11.2.0/dbhome_1。目录权限必须oracle可写,否则OUI在安装中途会报“Permission denied”并回滚,那种回滚非常费时。

3.4 内核参数:共享内存、信号量和文件句柄

Oracle 11g对SysV共享内存有硬性要求,龙蜥8默认配置通常达不到数据库安装的最低标准。编辑/etc/sysctl.conf,追加以下内容:

fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmni = 4096 kernel.shmall = 1073741824 kernel.shmmax = 4398046511104 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

然后执行sysctl -p使其生效。参数含义:kernel.shmmax控制单个共享内存段的最大字节数,4TB是对64位系统的常见保守设置;kernel.shmall控制在不上调swap的情况下系统可用的共享页总数;kernel.sem四个值分别表示信号量集合最大数、系统最大信号量数、每个集合的唤醒数、信号量集合最大数量。如果设置过低,dbca建库时大概率报ORA-27102“out of memory”。

再改资源限制,编辑/etc/security/limits.conf:

oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 10240

这些限制让oracle用户能打开足够多的文件句柄并拥有足够的线程数。不使用ulimit也可以,但Oracle的sqlplus和监听进程在并发高时会突然报“Can't connect to server”一类问题,事后排查容易绕弯,不如一开始就设好。

3.5 关闭SELinux与防火墙(实验环境建议)

生产环境如果安全策略强制开启SELinux,Oracle 11g的很多文件操作会被拦截,最常见的现象是oracle用户明明有权限,数据库实例却起不来,检查/var/log/audit/audit.log會看到一堆avc denied。实验环境我建议直接关闭:

setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config systemctl stop firewalld systemctl disable firewalld

这里setenforce 0只临时生效,重启后回到配置状态,所以要用sed把/etc/selinux/config改成permissive或disabled。注意如果生产环境只能permissive,那也可以跑,但要把和Oracle相关的路径加入白名单,工作量不小。开放给应用访问时还需要放行1521端口,既然防火墙已经关了,本机测试阶段就不用单独处理,真正上线时再按网络策略配置。

3.6 给oracle用户配置环境变量

用oracle用户登录后,编辑.bash_profile写死一套环境变量,避免每次都要手输。这是安装成功与否的关键一环,因为很多安装中断其实是HOME路径不对导致的:

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.ZHS16GBK

说明:ORACLE_SID建库时会用到,先写成计划中的实例名;LD_LIBRARY_PATH填补Oracle链接时找不到老库的坑;NLS_LANG控制字符集显示,如果应用端是GBK,这里别设UTF8,否则查出来乱码。

4. 动手安装:用response文件和runInstaller把oracle11g安装包装进龙蜥

4.1 为什么我不用OUI图形界面

龙蜥8服务器普遍没有桌面环境,即使装了X Window,通过SSH转发DISPLAY也容易因为延迟或字体缺失导致乱码界面,按钮点不动,安装到一半卡死。Oracle 11g的OUI从设计之初就没有把中文字体考虑进去,龙蜥上最有名的一个坑是OUI弹出“正在检查操作系统版本”对话框后直接消失,日志里只有一行“libXext.so.6 not found”。这些都指向一个问题:图形安装太脆弱。静默安装虽然看起来不直观,但只要你把response文件写对,它至少能稳定跑完,错误也会明确写到日志里。对需要批量部署的工程师来说,静默安装也是唯一能复用的方案。

response文件是Oracle安装包的官方接口,安装包里已经提供了模板。database/response/db_install.rsp就是给数据库服务器安装用的,复制一份再改参数,比从零创建要可靠得多:

cp /data/install/database/response/db_install.rsp /tmp/db_install_orcl.rsp chown oracle:oinstall /tmp/db_install_orcl.rsp

编辑/tmp/db_install_orcl.rsp,重点改这些字段(以下是核心片段,省略掉不需要动的注释内容):

oracle.install.option=INSTALL_DB_SWONLY UNIX_GROUP_NAME=oinstall INVENTORY_LOCATION=/u01/app/oraInventory SELECTED_LANGUAGES=en 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=dba DECLINE_SECURITY_UPDATES=true

参数说明:INSTALL_DB_SWONLY表示只安装数据库软件,不建库,建库留给dbca;INVENTORY_LOCATION是OUI记录安装清单的目录,未来卸载工具deinstall要读它;SELECTED_LANGUAGES至少保留en,再需要中文就加zh_CN,但语言列表越短,OUI越不容易在字体上出问题;InstallEdition=EE是企业版,如果你只有标准版许可就写SE;DECLINE_SECURITY_UPDATES必须为true,否则OUI会在默认没有配置Oracle账号的情况下要求联网收更新,导致安装卡在最后一步。

4.2 用runInstaller执行静默安装

接下来进入安装阶段。用oracle用户执行,不要切root。命令如下:

su - oracle cd /data/install/database ./runInstaller -silent -ignorePrereq -force \ -responseFile /tmp/db_install_orcl.rsp

安装过程会在终端滚动大量日志,最终停在一个提示上,告诉你需要另开一个root终端执行两个脚本:/u01/app/oraInventory/orainstRoot.sh和/u01/app/oracle/product/11.2.0/dbhome_1/root.sh。注意这时候安装进程其实还没结束,必须先执行两个root脚本,再回到当前终端按回车确认,安装才会收尾。

这条命令里-ignorePrereq的含义是跳过操作系统版本检查,因为龙蜥不在Oracle官方认证的发行版列表里,不加这个参数就会在检查阶段直接退出;-force则是让OUI忽略一些非致命警告,比如包版本不匹配。这两个参数就是龙蜥安装能不能继续的关键,但也要明白它们是双刃剑:如果真缺了核心依赖,跳过检查后会在link阶段爆出来,所以之前3.1节里dnf装包那一顿不能省。

两个root脚本执行逻辑:

sudo /u01/app/oraInventory/orainstRoot.sh sudo /u01/app/oracle/product/11.2.0/dbhome_1/root.sh

orainstRoot.sh改动oraInventory目录的属主和权限,root.sh则会更新/etc/oratab并设置本地bin链接。root.sh执行过程中会问你是否把oracle目录加入本地bin,默认“n”跳过就行,不会影响数据库运行。

4.3 配置监听:netca静默创建listener

数据库软件装完后,下一步是监听。用netca的静默模式,一条命令建出默认监听器:

$ORACLE_HOME/bin/netca -silent \ -responseFile $ORACLE_HOME/network/response/netca.rsp

这条命令会读取自带的netca响应模板,在$ORACLE_HOME/network/admin下生成listener.ora和sqlnet.ora。默认监听端口是1521,协议TCP,主机名取机器自己的hostname。这里有个坑:龙茜安装的主机名如果带横线或点,listener.ora里的主机名解析可能失败,表现为lsnrctl start成功,但远程连接时用主机名连不上。遇到这种情况,直接改listener.ora里的HOST为127.0.0.1或者服务器静态IP,再重启监听即可。

监听启动验证:

lsnrctl start lsnrctl status

status输出中看到“Service registered”代表监听已接管实例服务。如果还没有建库,status只显示监听器自身状态,不显示Service,这没问题。

4.4 建库:dbca静默建出第一个实例

监听就绪后,用dbca建库。dbca的静默参数比netca多,但核心就是以下一段:

$ORACLE_HOME/bin/dbca -silent \ -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl \ -sid orcl \ -sysPassword Oracle123 \ -systemPassword Oracle123 \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/flash_recovery_area \ -characterset ZHS16GBK \ -nationalCharacterSet AL16UTF16 \ -memoryPercentage 40 \ -emConfiguration NONE \ -redoLogFileSize 100

参数说明:模板General_Purpose.dbc是通用业务库模板;sysPassword和systemPassword必须满足Oracle密码复杂度(至少8位含数字字母),否则dbca会拒绝;characterset选ZHS16GBK对应绝大多数中文业务;emConfiguration NONE关闭Enterprise Manager,龙蜥上跑EM会额外占资源还容易报错;memoryPercentage给数据库分配物理内存的40%,具体比例按你的内存大小调整,内存只有8G的机器可以降到30。

dbca执行时间通常在10到20分钟,期间日志写在$ORACLE_BASE/cfgtoollogs/dbca/orcl。看到“Database creation complete”表示成功。此时马上做一个最小验证:

sqlplus / as sysdba SQL> select name, open_mode from v$database;

能查出一行记录,说明实例已经open。再试监听:

lsnrctl services

如果看到“orcl”服务,说明监听已经自动注册了实例,整个安装链路宣告打通。

4.5 安装完成后立刻要做的收尾检查

第一件事,检查oracle用户的环境变量是否和生产需求一致,尤其是ORACLE_HOME路径。第二件事,把数据库设置为开机自启。Oracle 11g自带的dbstart依赖/etc/oratab文件,root.sh执行时会在该文件写入一行“orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N”。把最后的N改成Y,然后编辑/etc/rc.d/rc.local加入启动命令。这是老派的启动方式,如果你的环境有systemd,更推荐后文第6章的service文件方式。第三件事,查看$ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log,确认没有“ORA-”开头的异常记录。

5. 龙蜥上oracle11g安装包最容易翻车的6个现场:现象、原因、处理

5.1 runInstaller启动即退,报“libnsl.so.1: cannot open shared object file”

现象:在龙茜8上执行./runInstaller,终端没有任何输出就回到提示符,检查安装日志(/tmp/oraInstall*.log)发现OUI启动阶段加载libnsl失败。

原因:龙茜8的glibc默认提供libnsl.so.2,没有.so.1版本的符号;Oracle 11g的OUI是多年前编译的,动态链接写死在libnsl.so.1上。

解决:执行第3章的软链命令,先确认libnsl2已安装,然后ln -s生成libnsl.so.1。这步做完再跑runInstaller,OUI就能正常起来。需要注意软链对libncurses同样适用,如果报的是libncurses.so.5,先把ncurses-compat-libs装好再做软链。

5.2 静默安装进度到80%时,报“Error in invoking target 'libclntsh.so' of makefile”

现象:runInstaller的静默日志里出现“ins_rdbms.mk”相关错误,提示无法链接libclntsh.so,安装过程中止。

原因:常见两种情况。一是ORACLE_HOME路径没有写权限,oracle用户实际无法在该目录下创建临时文件;二是缺了gcc或libaio-devel,导致make过程中依赖的头文件找不到。

解决:先检查目录属主,ls -ld $ORACLE_HOME确认是oracle:oinstall;再执行dnf install -y gcc gcc-c++ libaio-devel,之后不要直接重跑runInstaller,先清理重新安装:要么删除整个ORACLE_HOME目录后再次执行runInstaller,要么使用OUI的“重跑修复”选项。最保险的做法是把相关makefile里的报错行去搜索引擎搜一下,确认具体缺的符号,再针对性补包,不要盲目重来。

5.3 建库阶段dbca报ORA-12547: TNS lost contact

现象:dbca执行到“Creating and starting Oracle instance”时,日志里写ORA-12547,实例进程启动后立刻断联。

原因:一半是缺了libaio,一半是oracle二进制权限不对。Oracle的oracle进程在启动时会进行异步IO初始化,如果libaio没装或者版本过老,进程直接abort。另外,bin/oracle文件的权限必须是6751,即“-rwsr-s--x”,否则sqlplus连上来也会触发同样的错。

解决:保持libaio和libaio-devel已安装,然后执行chmod 6751 $ORACLE_HOME/bin/oracle。如果之前是从旧系统直接拷贝安装包而不是解压安装,权限位极容易丢失,这条命令对拷贝安装特别重要。改完权限再重启数据库:srvctl stop database -d orcl(如果你配了集群)或直接用sqlplus执行shutdown immediate再startup。

5.4 远程连接正常,但本地sqlplus慢且卡死在“SQL*Plus: Release”

现象:sqlplus登录后要等10秒以上才出现SQL提示符,监听日志里全是“WARNING: inbound connection timed out”这类字样。

原因:通常和DNS反解析有关。Oracle在取得客户端连接后会做一次主机名解析回调,龙茜8如果配了残废的/etc/hosts内容,解析会超时。

解决:把/etc/hosts的hostname行补全,格式要包含本机IP和完整主机名。例如“192.168.1.10 db-server db-server.localdomain”。另外在$ORACLE_HOME/network/admin/sqlnet.ora里加上一句:

SQLNET.INBOUND_CONNECT_TIMEOUT=10

这会让监听在10秒内放弃无效连接,避免被恶意或错误的客户端拖死。

5.5 OUI图形界面中文乱码,字体全是方块

现象:用X11转发跑runInstaller,界面能打开但文字全乱码,点按钮时还容易错位。

原因:龙茜8的默认字体库里没有Oracle OUI需要的中文字体,而且OUI用的AWT组件对字体名匹配严格要求。

解决:一套有效的做法是给系统装中文字体和字体配置文件:

dnf install -y fontconfig dejavu-sans-fonts wqy-zenhei-fonts fc-cache -fv

如果你不追求中文界面,更省事的方案是在执行runInstaller前把LANG设为英文:

export LANG=en_US.UTF-8

这样绕开字体问题,OUI的英文界面在龙茜下呈现没有问题。这个选英文界面的操作对静默安装其实也一样重要——response文件里的语言列表只写en,能避免OUI在后续link阶段执着于加载中文语言包。

5.6 数据库启动时告警日志疯狂刷“ORA-27102: out of memory”

现象:执行startup后,实例无法open,alert日志里ORA-27102后面跟着“Linux-x86_64 Error: 12: Cannot allocate memory”。

原因:和内核参数有关。Oracle在启动时按SGA目标申请共享内存,如果kernel.shmall设置不对,即使物理内存充足,系统也会拒绝分配这么大的共享段。

解决:看第3.4节里的kernel.shmall,按1073741824设置,它代表共享内存页最大数,乘以默认页大小4KB是4TB。改成这个值后执行sysctl -p,再重启数据库。这个坑在低版本内核上一踩一个准,龙茜内核通常没这个问题,但你如果把旧环境的内核参数直接带过来,数值小了就会中招。

6. 把一次成功的安装包部署变成可复用的“后悔药”

装完一个实例只是开始,生产环境还会面临扩容、补丁、卸载重装。要做到这一步,我建议在第一次安装成功后,马上做三件事。

第一件,把这次所有操作固化成一个脚本,至少包含三部分:dnf依赖安装列表、sysctl/limits配置、自定义的response文件。这样下一次在同版本龙茜上装Oracle时,不用再对着日志猜缺什么。第二件,使用Oracle自带的deinstall工具验证卸载流程。在ORACLE_HOME目录下执行:

$ORACLE_HOME/bin/deinstall -silent \ -checkonly \ -configFile /u01/app/oraInventory/oraInst.loc

如果checkonly能顺利列出所有配置信息,说明安装结构完整可运维;如果它都找不全文件,那说明你之前手动改坏了目录结构。第三件,为数据库实例写一个systemd service,替代老旧的rc.local自启。在/etc/systemd/system/oracle-orcl.service里写:

[Unit] Description=Oracle 11g instance for orcl After=network.target [Service] User=oracle Group=oinstall Type=forking ExecStart=/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart /u01/app/oracle/product/11.2.0/dbhome_1 ExecStop=/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbshut /u01/app/oracle/product/11.2.0/dbhome_1 RemainAfterExit=yes [Install] WantedBy=multi-user.target

配置说明:dbstart/dbshut都是Oracle自带脚本,但前提是/etc/oratab里那行“orcl:...:Y”最后的Y已经改好,否则dbstart不会启动该实例。启用服务用systemctl enable --now oracle-orcl。这里要提醒,dbstart会按oratab里的base和home路径启动所有标记Y的实例,如果你一台机器上有多个实例,要小心它一起带起来。

说到验证,我一直认为“重启一遍后还能连上”才是真装好了。切到重启后的龙茜系统,先观察监听,再sqlplus登录跑一个简单查询,确认数据库没有依赖你手动启动的进程。常备一台同样版本龙茜的测试机做对照,因为Oracle 11g在龙茜上的行为往往会受防火墙、SELinux和内核参数细微差异的影响,出现“这台能跑那台不能跑”的情况别急着怀疑安装包,先比对系统和依赖版本。

写完这些后,我每次在新环境重新部署时还是会重新检查一遍ldd的输出和oratab的权限位,踩过的坑再多不如保留一份自己的检查清单。这个方案最大的价值不是让你一次跑通,而是让你在遇到翻车时能快速定位问题到底出在安装包、系统库还是配置脚本上。希望这份流程对你的龙茜迁移项目有帮助,也希望你能早点把这条路的坑都摸清,后续的维护工作自然就顺了。

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

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

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

立即咨询