ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

龙蜥Anolis上RPM安装Oracle 11g实战指南

龙蜥Anolis上RPM安装Oracle 11g实战指南

简介:这份资源面向需要在龙蜥Anolis操作系统上部署Oracle 11g数据库的运维与DBA人员,提供了一套可自动化完成安装与数据恢复的整合包。Anolis OS作为阿里云维护的企业级Linux发行版,是运行Oracle数据库的稳定基础环境,而Oracle 11g的常规安装涉及依赖处理、环境变量配置、实例创建与监听器设置等繁琐环节,本包通过脚本将这些步骤串联起来,降低手动操作复杂度。压缩包共11个文件,以7个rpm安装包为主,另含chkconfig、S01shm_load、install.sh及conf配置文件,整体约334.17MB,覆盖安装介质、系统参数调优与自动化执行脚本。已有3017人学习下载。读者可借助install.sh完成环境变量设置、依赖安装、RPM部署与数据库实例初始化,并利用包内工具还原DMP备份文件,适合希望快速搭建测试环境或迁移恢复数据的数据库从业者参考。

1. 龙蜥 Anolis 上装 Oracle 11g:为什么我坚持用 rpm 包而不是 runInstaller

第一次在龙蜥 Anolis OS 上装 Oracle 11g 的人,十有八九会卡在同一个地方:图形化 runInstaller 跑不起来,或者跑起来了在链接阶段报一堆.so找不到。我见过太多人在这上面耗掉一整个下午,最后放弃转去装 MySQL。其实在 Anolis 8 这类 RHEL8 系发行版上,最稳的路子反而是用 oracle11g.rpm 这套预编译包——它把依赖、内核参数、用户组、systemd 服务全打包好了,装完直接systemctl start oracle就能连。

这套方案适合两类人:一是要在国产化环境里跑老业务系统、必须上 Oracle 11g 的运维;二是做数据库实验、不想折腾图形界面的开发者。前提是你的机器是 x86_64 架构、内存不低于 2GB、磁盘留够 15GB。装不好会怎样?轻则监听起不来,重则把系统自带的 glibc 搞乱,连 yum 都用不了。所以下面每一步我都按「先看环境、再动手、最后验证」的顺序写,你照着走就行。

2. 装之前先把环境对齐:Anolis 版本、内核参数和依赖清单

2.1 确认 Anolis 版本和系统架构

Oracle 11g 的 rpm 包对系统版本很挑。Anolis 8.x 对应的是 RHEL8 内核 4.18,而 Oracle 11g 官方只认证到 RHEL7。所以第一步不是急着下载,而是先看清楚自己站在哪块地上。

# 查看发行版和内核 cat /etc/anolis-release uname -r # 查看架构,必须是 x86_64 arch

输出里如果anolis-release显示 8.x,内核是 4.18 或 5.10,那就可以继续。如果是 Anolis 7.x,内核 3.10,那更省事,兼容性更好。架构必须是x86_64,aarch64 的机器别往下走,Oracle 11g 没有对应的 rpm 包。

我一般还会顺手看一眼 glibc 版本:

ldd --version | head -1

Anolis 8 自带 glibc 2.28,Oracle 11g 的二进制是在 2.17 上编的,所以后面要装兼容包。这一步先记下版本号,等会儿选 compat 包要用。

2.2 内核参数和资源限制怎么调

Oracle 对共享内存和信号量的要求是硬性的,不调的话实例根本起不来。Anolis 8 默认的kernel.shmmax往往偏小,需要手动改。

# 编辑 sysctl 配置 cat >> /etc/sysctl.d/99-oracle.conf <<'EOF' # Oracle 11g 共享内存段最大值,按物理内存一半给 kernel.shmmax = 2147483648 # 共享内存页数 kernel.shmall = 524288 # 信号量:250 个数组,每个 32000 个信号 kernel.sem = 250 32000 100 128 # 文件句柄 fs.file-max = 6815744 # 异步 IO fs.aio-max-nr = 1048576 # 本地端口范围 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 -p /etc/sysctl.d/99-oracle.conf

kernel.shmmax这个值我一般设成物理内存的一半,2GB 内存就写 1073741824,4GB 写 2147483648。设太大浪费,设太小 Oracle 会报ORA-27102: out of memory。kernel.sem四个数字分别是:信号量数组最大数、每个数组的信号量数、单次 semop 调用最大操作数、系统级信号量最大数。Oracle 官方推荐值就是250 32000 100 128,照抄即可。

资源限制改/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

这里oracle是后面要建的用户名。如果你打算用别的名字,这里同步改。nofile给到 65536 是为了避免监听器在高并发下报TNS-12500。

2.3 依赖包和兼容库一次装齐

Anolis 8 的仓库里没有 Oracle 需要的全部老库,尤其是libaio和compat-libstdc++。我习惯先把能装的都装上,缺的再单独找。

# 基础依赖 dnf install -y binutils compat-libcap1 compat-libstdc++-33 \ gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc++ libstdc++-devel make sysstat unixODBC \ unixODBC-devel readline readline-devel libXext libXtst \ libX11 libXau libXi

如果compat-libstdc++-33提示找不到,说明 Anolis 8 的源里已经移除了这个包。常见做法是从 Anolis 7 的源里单独下 rpm 手动装,或者用libstdc++的兼容软链接顶一下。我一般会先试:

# 检查是否已有兼容库 ls /usr/lib64/libstdc++.so.6 # 如果版本够高,做个软链 ln -s /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.5

但软链不是长久之计,最好还是找到compat-libstdc++-33的 rpm 装上。装完用rpm -qa | grep compat确认一下。

提示:依赖装完后先别急着装 Oracle,跑一遍ldd检查关键二进制缺不缺库,比装完再回头补要省事得多。

3. 下载和安装 oracle11g.rpm:用户、目录、包顺序一个都不能乱

3.1 建 oracle 用户和目录结构

Oracle 不允许用 root 跑实例,必须单独建用户。这一步看着简单,但目录权限写错的话,后面 sqlplus 连不上会查半天。

# 建用户组和用户 groupadd -g 54321 oinstall groupadd -g 54322 dba useradd -u 54321 -g oinstall -G dba -m -s /bin/bash oracle # 设密码 passwd oracle # 建目录 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 chmod -R 775 /u01

oinstall是 Oracle 清单组,dba是数据库管理员组。用户 ID 和组 ID 用 54321/54322 是 Oracle 的惯例,不是必须,但保持一致以后迁移省心。目录结构里dbhome_1是 Oracle 主目录,oraInventory是安装清单,oradata放数据文件。这三个目录分开建,以后备份和扩容都清楚。

3.2 rpm 包的安装顺序和参数

oracle11g.rpm 通常不是一个包,而是一组:oracle11g-database.rpm、oracle11g-client.rpm、oracle11g-preinstall.rpm。安装顺序有讲究,先装 preinstall 再装 database。

# 先装预配置包,它会自动建用户和调参数 rpm -ivh oracle11g-preinstall-11.2.0-1.el8.x86_64.rpm # 再装数据库主包 rpm -ivh oracle11g-database-11.2.0-1.el8.x86_64.rpm # 最后装客户端工具 rpm -ivh oracle11g-client-11.2.0-1.el8.x86_64.rpm

如果 preinstall 包已经帮你建好了 oracle 用户,那 3.1 里的建用户步骤可以跳过,但目录还是要手动建,因为 rpm 不会自动创建/u01下的数据目录。装的时候如果报依赖冲突,用--nodeps强行装不是好习惯,先看看缺什么:

# 查看 rpm 依赖 rpm -qpR oracle11g-database-11.2.0-1.el8.x86_64.rpm

把缺的包装上再重试。--force和--nodeps只在确认不影响系统库的时候用,否则容易把 glibc 搞坏。

3.3 环境变量配置和生效

装完 rpm 后,Oracle 的二进制在/usr/lib/oracle/11.2/client64/bin或者/u01/app/oracle/product/11.2.0/dbhome_1/bin,取决于包怎么打的。我一般统一在 oracle 用户的.bash_profile里配:

# 切到 oracle 用户 su - oracle # 编辑环境变量 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:/usr/lib64 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 EOF # 生效 source ~/.bash_profile

ORACLE_SID是实例名,我习惯用orcl,你可以在建库时改成别的。NLS_LANG设成AL32UTF8是为了避免中文乱码,如果业务库是 ZHS16GBK,这里要对应改。LD_LIBRARY_PATH里加上/usr/lib64是为了让 Oracle 能找到系统的兼容库。

注意:环境变量一定要在 oracle 用户下配,root 下配了没用,因为实例是以 oracle 身份跑的。

4. 建库和监听配置:dbca 静默模式与 netca 的取舍

4.1 用 dbca 静默建库

rpm 包装完后,数据库软件有了,但实例还没建。图形化 dbca 在 Anolis 上经常因为缺 X11 转发而失败,所以直接用静默模式。

# 以 oracle 用户执行 dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -responseFile NO_VALUE \ -characterSet AL32UTF8 \ -memoryPercentage 40 \ -emConfiguration NONE \ -datafileDestination /u01/app/oracle/oradata \ -redoLogFileSize 100 \ -sampleSchema false

-gdbName和-sid一般保持一致,都写orcl。-memoryPercentage 40表示用物理内存的 40% 给 SGA 和 PGA,2GB 内存的机器就是 800MB 左右,够用。-emConfiguration NONE是关掉 Enterprise Manager,那东西在 Anolis 8 上基本跑不起来,关了省心。-sampleSchema false不建示例用户,避免多余的表空间占用。

建库过程大概 3 到 5 分钟,看到Database creation complete就算成功。如果中途报ORA-00845: MEMORY_TARGET not supported,说明/dev/shm太小,改一下:

# 查看 /dev/shm 大小 df -h /dev/shm # 临时扩大 mount -o remount,size=2G /dev/shm # 永久生效写 fstab echo "tmpfs /dev/shm tmpfs defaults,size=2G 0 0" >> /etc/fstab

4.2 配置监听器

监听器是客户端连进来的入口,不配的话本地 sqlplus 能连,远程连不上。

# 以 oracle 用户执行 netca -silent -responseFile /u01/app/oracle/product/11.2.0/dbhome_1/assistants/netca/netca.rsp

如果 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

HOST写0.0.0.0表示监听所有网卡,写localhost就只能本机连。生产环境建议写具体 IP,避免暴露太多。然后启动监听:

lsnrctl start lsnrctl status

status里看到Instance "orcl", status READY就对了。如果显示BLOCKED,多半是local_listener参数没设,进 sqlplus 执行:

ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))'; ALTER SYSTEM REGISTER;

4.3 建表空间和用户

实例起来后,别急着用 sys 干活,先建业务表空间和用户。

-- 以 sysdba 登录 sqlplus / as sysdba -- 建表空间 CREATE TABLESPACE app_data DATAFILE '/u01/app/oracle/oradata/orcl/app_data01.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 10G; -- 建用户 CREATE USER appuser IDENTIFIED BY "App@2024" DEFAULT TABLESPACE app_data TEMPORARY TABLESPACE temp; -- 授权 GRANT CONNECT, RESOURCE TO appuser; GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE TO appuser; -- 退出 EXIT;

表空间AUTOEXTEND ON一定要开,不然数据写满 500M 就报ORA-01653。用户密码用双引号包起来,因为里面有特殊字符@。授权按最小权限给,别直接GRANT DBA,生产环境这是大忌。

5. 避坑排查:装 Oracle 11g 在 Anolis 上最容易翻车的五件事

5.1 现象:sqlplus 报error while loading shared libraries: libclntsh.so.11.1

原因:LD_LIBRARY_PATH没包含$ORACLE_HOME/lib,或者环境变量在 root 下配了但用 oracle 用户跑。

解决:确认当前用户是 oracle,然后echo $LD_LIBRARY_PATH看有没有$ORACLE_HOME/lib。没有就重新source ~/.bash_profile。如果还不行,检查$ORACLE_HOME/lib下有没有libclntsh.so.11.1这个文件,rpm 装的时候可能漏了。

5.2 现象:dbca 建库到 45% 卡住,日志报ORA-27102: out of memory

原因:kernel.shmmax设得比物理内存还大,或者/dev/shm太小。

解决:sysctl kernel.shmmax看当前值,改成物理内存的一半。df -h /dev/shm看大小,小于 1G 就按 4.1 里的方法扩。改完重启一下sysctl -p再重新建库。

5.3 现象:监听器启动报TNS-12547: TNS:lost contact

原因:listener.ora里HOST写了一个本机没有的 IP,或者 1521 端口被占用。

解决:netstat -tlnp | grep 1521看谁占了端口。如果是别的服务,改监听端口或者停掉那个服务。HOST改成0.0.0.0或127.0.0.1再试。

5.4 现象:rpm 安装时提示file /usr/lib64/libstdc++.so.6 from install conflicts

原因:系统自带的 libstdc++ 和 rpm 包里带的版本冲突。

解决:不要用--force覆盖,先rpm -qa | grep libstdc++看已装版本。如果系统版本更高,用rpm -ivh --replacefiles让 rpm 包里的文件覆盖,但覆盖前备份/usr/lib64/libstdc++.so.6。更稳的做法是只装 client 包,不装 database 包里的兼容库。

5.5 现象:sqlplus 连上后执行查询报ORA-12705: Cannot access NLS data files

原因:NLS_LANG设成了系统不支持的字符集,或者$ORACLE_HOME/nls/data目录权限不对。

解决:echo $NLS_LANG确认是AMERICAN_AMERICA.AL32UTF8。然后ls -l $ORACLE_HOME/nls/data看权限,必须是 oracle 用户可读。权限不对就chown -R oracle:oinstall $ORACLE_HOME/nls。

提示:这五条里前三条我几乎每次装都会碰到至少一条,建议装之前先把 5.1 和 5.2 的检查命令跑一遍,能省不少回头路。

6. 装完怎么验证:三条命令确认实例真的能跑

装完不验证,等于没装。我一般按「监听通不通、实例活没活、数据写不写得进去」三步走。

第一步,用lsnrctl status看监听器状态。输出里要有Instance "orcl", status READY,并且下面列出至少一个Handler。如果只有status BLOCKED,说明实例没注册到监听,回 4.2 检查local_listener。

第二步,用 sqlplus 以 sysdba 登录,查实例状态:

sqlplus / as sysdba SELECT instance_name, status, database_status FROM v$instance;

期望输出:

INSTANCE_NAMESTATUSDATABASE_STATUS
orclOPENACTIVE

如果STATUS是MOUNTED,说明数据库没打开,执行ALTER DATABASE OPEN;。如果是STARTED,那实例还没挂载,检查控制文件路径。

第三步,用业务用户连一次,建表插数据再删掉,确认读写都正常:

-- 用 appuser 登录 sqlplus appuser/"App@2024"@localhost:1521/orcl -- 建测试表 CREATE TABLE t_test (id NUMBER, name VARCHAR2(50)); -- 插数据 INSERT INTO t_test VALUES (1, 'anolis'); -- 查数据 SELECT * FROM t_test; -- 删表 DROP TABLE t_test; -- 退出 EXIT;

这三步都过了,才算真正装完。我见过有人lsnrctl status看到 READY 就以为完事了,结果业务连上来一写就报ORA-01653,回头查表空间发现没开自动扩展。所以第三步的建表插数据不能省,它同时验证了表空间、权限和字符集。

从那以后我每次装完 Oracle,不管多急,都强制走一遍这三条命令,尤其是第三步的建表插数据——它花不了两分钟,但能挡住后面几小时的排查。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进