简介:这份资源面向需要在龙蜥Anolis操作系统上部署Oracle 11g数据库的运维与DBA人员,提供了一套可直接落地的安装与恢复方案。Anolis OS作为阿里云维护的企业级Linux发行版,是运行Oracle数据库的稳定基础环境,而该包通过自动化脚本简化了原本繁琐的安装流程,涵盖环境变量配置、依赖处理、RPM包安装、数据库实例创建、监听器配置及用户权限分配等环节,同时支持通过数据泵工具还原dmp备份文件,降低手动操作带来的出错概率。资源包共11个文件,以7个rpm安装包为主,另含sh安装脚本、chkconfig服务配置、conf参数文件及共享内存加载脚本等,压缩包约334.17MB,结构紧凑、用途明确。目前已有3010人学习下载,适合希望快速在国产化系统上完成Oracle 11g部署与数据恢复的读者参考使用。
1. 龙蜥 Anolis 上装 Oracle 11g:为什么这件事比你想的更折腾
在龙蜥 Anolis OS 上部署 Oracle 11g,是很多国产化替代项目里绕不开的一关。Anolis 基于 Linux 内核 5.10+,glibc 版本比 Oracle 11g 发布时(2007 年)的环境新了不止一代,而 Oracle 11g 的官方支持列表里根本没有 Anolis 这个名字。这意味着你拿到的那个linux.x64_11gR2_database_1of2.zip安装包,直接解压跑runInstaller大概率会在依赖检查阶段就翻车。但现实需求摆在那里——大量存量业务系统跑在 Oracle 11g 上,迁移到 Anolis 时数据库层不能随便换。这篇文章要解决的就是:在 Anolis 8.x 上,用静默安装方式把 Oracle 11g R2 跑起来,包括依赖补齐、内核参数调整、建库建表空间、以及那些官方文档不会告诉你的坑。适合正在做国产化迁移的 DBA 和运维工程师,也适合需要在 Anolis 上搭 Oracle 测试环境的后端开发。
2. 装之前先把地基打牢:Anolis 上的依赖与内核参数
2.1 为什么 Anolis 8 装 Oracle 11g 会缺一堆包
Oracle 11g 的runInstaller在预检查阶段会调用rpm -q去查一堆包,比如binutils、compat-libstdc++、gcc、glibc、libaio、libgcc、libstdc++、make、sysstat、unixODBC等。Anolis 8 的默认最小化安装里,这些包要么版本对不上,要么根本没装。更麻烦的是compat-libstdc++-33这个包——它提供的是 libstdc++.so.5,而 Anolis 8 的仓库里默认只有 libstdc++.so.6。Oracle 11g 的某些二进制组件(尤其是oracle可执行文件和sqlplus)链接的是旧版 C++ 库,缺了它连sqlplus都起不来。
常见做法是先从 Anolis 的 AppStream 仓库装基础依赖,再单独补compat-libstdc++-33。如果仓库里找不到,可以从 CentOS 7 的镜像里提取对应的 rpm 手动安装,但要注意架构匹配(x86_64)。我一般会先跑一遍依赖检查脚本,把缺的包列出来再逐个补,而不是一股脑全装——装多了反而可能引入版本冲突。
# 先更新系统并安装基础依赖 dnf update -y dnf install -y binutils gcc gcc-c++ make sysstat libaio libaio-devel \ libstdc++ libstdc++-devel libgcc unixODBC unixODBC-devel \ elfutils-libelf elfutils-libelf-devel # 单独处理 compat-libstdc++-33(Anolis 8 默认没有) # 如果 dnf 找不到,去 CentOS 7 镜像下载 rpm 后本地安装 dnf install -y compat-libstdc++-33 || \ rpm -ivh compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm上面这段命令的逻辑是:先用dnf把 Anolis 仓库里能装的依赖全部装齐,然后用||做兜底——如果compat-libstdc++-33在仓库里不存在,就手动 rpm 安装。参数上注意libaio-devel必须装,Oracle 的异步 I/O 依赖它;unixODBC-devel是给 Oracle 的 ODBC 驱动用的,不装的话预检查会报 warning。装完后用rpm -qa | grep逐个确认,别只看命令返回码。
2.2 内核参数不是抄模板,得按内存算
Oracle 11g 对共享内存、信号量、文件句柄有硬性要求,Anolis 的默认值远远不够。很多人直接抄网上的sysctl.conf模板,结果机器内存不一样,kernel.shmmax设小了导致建库时 ORA-27102,设大了又浪费。正确的做法是按物理内存算:kernel.shmmax至少设为物理内存的一半,kernel.shmall设为shmmax / 4096(页大小),kernel.shmmni设 4096,信号量kernel.sem设250 32000 100 128。
# 查看物理内存(单位 KB) grep MemTotal /proc/meminfo # 假设内存 16GB,则 shmmax = 8589934592(8GB) # 写入 /etc/sysctl.d/99-oracle.conf cat >> /etc/sysctl.d/99-oracle.conf <<'EOF' fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 kernel.shmmax = 8589934592 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 -p /etc/sysctl.d/99-oracle.conf这里kernel.shmmax的值要根据你机器的实际内存改,16GB 内存设 8GB 是安全的。fs.aio-max-nr设 1048576 是为了避免 Oracle 的异步 I/O 报 ORA-27090。net.ipv4.ip_local_port_range从 9000 开始是为了避开 Oracle 监听器可能占用的低端口。改完sysctl -p生效后,用sysctl -a | grep shm确认值已经变了。另外别忘了ulimit——在/etc/security/limits.d/99-oracle.conf里给 oracle 用户设nofile 65536、nproc 16384、stack 10240,否则安装到一半会报“无法分配内存”。
2.3 用户、目录、环境变量:一步错步步错
Oracle 安装对用户和目录的权限极其敏感。必须创建oinstall和dba两个组,oracle 用户的主组是oinstall,附加组是dba。ORACLE_BASE一般设/u01/app/oracle,ORACLE_HOME设/u01/app/oracle/product/11.2.0/db_1。目录权限必须是oinstall:dba且 775,否则runInstaller会报“目录不可写”。
groupadd -g 54321 oinstall groupadd -g 54322 dba useradd -u 54321 -g oinstall -G dba -m oracle passwd oracle mkdir -p /u01/app/oracle/product/11.2.0/db_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01 # 切换到 oracle 用户配置环境变量 su - oracle cat >> ~/.bash_profile <<'EOF' export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_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注意NLS_LANG设成AL32UTF8是为了避免中文乱码,如果业务库是 ZHS16GBK,这里要对应改。ORACLE_SID按项目命名规范来,别用默认的orcl除非你确定不冲突。环境变量配完后用echo $ORACLE_HOME确认,然后cd $ORACLE_HOME能进去才算对。
3. 静默安装 Oracle 11g:从解压到建库的完整命令链
3.1 解压安装包与准备 response 文件
Oracle 11g 的安装包通常是两个 zip:linux.x64_11gR2_database_1of2.zip和2of2.zip。解压后得到database目录,里面runInstaller是图形化入口,但 Anolis 服务器通常没图形界面,所以要用静默模式。静默安装的核心是 response 文件——db_install.rsp负责装软件,dbca.rsp负责建库。这两个文件在database/response/目录下有模板,复制出来改关键参数即可。
# 用 oracle 用户解压 su - oracle cd /tmp unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip # 复制 response 模板 cd /tmp/database/response cp db_install.rsp db_install_custom.rsp cp dbca.rsp dbca_custom.rsp解压时注意磁盘空间——database目录解压后大约 2.5GB,/tmp如果挂载的是小分区会爆。我一般会解压到/u01/soft下。db_install.rsp里必须改的参数有:ORACLE_HOSTNAME(用hostname命令查)、UNIX_GROUP_NAME=oinstall、INVENTORY_LOCATION=/u01/app/oraInventory、ORACLE_HOME、ORACLE_BASE、INSTALL_DB_SWONLY=true(只装软件不建库)、oracle.install.db.InstallEdition=EE(企业版)。SELECTED_LANGUAGES里加上en和zh_CN如果不需要中文可以只留en。
3.2 跑 runInstaller 静默安装与 root 脚本
response 文件改好后,用runInstaller -silent -responseFile启动安装。这个过程会跑 10 到 20 分钟,期间会检查依赖、链接二进制、复制文件。如果预检查报错,日志在/u01/app/oraInventory/logs/下,installActions*.log里能看到具体缺什么。安装到最后会提示用 root 执行两个脚本:orainstRoot.sh和root.sh。
cd /tmp/database ./runInstaller -silent -ignorePrereq -responseFile /tmp/database/response/db_install_custom.rsp # 安装完成后按提示切 root 执行 su - root /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/db_1/root.sh-ignorePrereq是跳过预检查的强制参数,但我不建议一上来就用——先不加它跑一遍,看看到底缺什么,补完了再跑。如果预检查只报compat-libstdc++-33缺失而你已经手动装了,可以用-ignorePrereq跳过。root.sh会配置/etc/oratab和网络配置,执行时如果提示覆盖dbhome文件,选 yes。装完后用$ORACLE_HOME/bin/sqlplus -V验证,能输出版本号说明软件层 OK。
3.3 用 dbca 静默建库与建表空间
软件装完只是空壳,还得建数据库实例。dbca.rsp里关键参数:GDBNAME=orcl、SID=orcl、SYSPASSWORD、SYSTEMPASSWORD、CHARACTERSET=AL32UTF8、TOTALMEMORY(按物理内存 40% 设)、DATAFILEDESTINATION=/u01/app/oracle/oradata、RECOVERYAREADESTINATION=/u01/app/oracle/fast_recovery_area。建库过程会创建数据文件、控制文件、redo log,耗时取决于磁盘性能。
# 静默建库 dbca -silent -createDatabase -responseFile /tmp/database/response/dbca_custom.rsp # 建完后验证监听和实例 lsnrctl start sqlplus / as sysdba SQL> select status from v$instance; SQL> select name from v$datafile;建库完成后,监听器默认可能没起,用lsnrctl start启动。sqlplus / as sysdba能进去说明实例正常。接下来建业务表空间——这是热词里“新安装 oracle11g 如何建立表空间”对应的操作。我一般会建一个USERS之外的自定义表空间,比如APP_DATA,数据文件初始 1GB 自动扩展,每次 100MB,最大 10GB。
CREATE TABLESPACE APP_DATA DATAFILE '/u01/app/oracle/oradata/orcl/app_data01.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; -- 建用户并指定默认表空间 CREATE USER appuser IDENTIFIED BY "App#2024" DEFAULT TABLESPACE APP_DATA TEMPORARY TABLESPACE TEMP QUOTA UNLIMITED ON APP_DATA; GRANT CONNECT, RESOURCE TO appuser;EXTENT MANAGEMENT LOCAL和SEGMENT SPACE MANAGEMENT AUTO是 11g 的推荐配置,能减少碎片。QUOTA UNLIMITED给用户在该表空间的无限制配额,生产环境按需收紧。建完后用select tablespace_name, status from dba_tablespaces;确认状态是 ONLINE。
4. 避坑与排查:Anolis 上装 Oracle 11g 的 5 个血泪教训
4.1 预检查报 “libaio.so.1: cannot open shared object file”
现象:runInstaller跑到预检查阶段直接退出,日志里写libaio.so.1找不到。原因:Anolis 8 默认没装libaio,或者装了但ldconfig缓存没更新。解决:dnf install -y libaio libaio-devel,然后ldconfig,再用ldd $ORACLE_HOME/bin/oracle | grep libaio确认链接正常。如果还不行,检查/etc/ld.so.conf.d/下有没有 oracle 的库路径。
4.2 建库时 ORA-27102: out of memory
现象:dbca建库到 30% 左右报 ORA-27102,实例起不来。原因:kernel.shmmax设得比实际可用共享内存小,或者kernel.shmall不够。解决:ipcs -l看当前共享内存限制,把shmmax调到物理内存的一半,shmall调到shmmax/4096,sysctl -p后重启dbca。注意 Anolis 的shmall默认值可能很小,必须手动改。
4.3 sqlplus 能连但中文显示乱码
现象:sqlplus里查中文数据全是问号或乱码。原因:NLS_LANG没设或设成了WE8ISO8859P1。解决:在 oracle 用户的.bash_profile里设export NLS_LANG=AMERICAN_AMERICA.AL32UTF8,如果数据库字符集是 ZHS16GBK 则改成AMERICAN_AMERICA.ZHS16GBK。改完source一下,重新登录sqlplus。注意客户端和服务端字符集要匹配,否则转换会丢数据。
4.4 root.sh 执行报 “Failed to create /etc/oratab”
现象:root.sh跑到一半报无法创建/etc/oratab。原因:/etc目录权限被改过,或者 SELinux 拦截。解决:先setenforce 0临时关 SELinux,确认/etc是 755 且 root 可写,再重跑root.sh。如果/etc/oratab已存在但内容为空,手动写入orcl:/u01/app/oracle/product/11.2.0/db_1:N也能绕过。
4.5 监听器起不来报 TNS-12541
现象:lsnrctl start后lsnrctl status显示 TNS-12541 no listener。原因:listener.ora里HOST写的是主机名但/etc/hosts没解析,或者端口 1521 被占用。解决:cat /etc/hosts确认主机名对应 127.0.0.1,netstat -tlnp | grep 1521看端口占用。如果listener.ora里HOST是主机名,改成 IP 或确保 hosts 解析正确。改完lsnrctl reload再start。
5. 装完之后:验证、调优与一个省事的习惯
装完 Oracle 11g 只是开始,真正影响稳定性的是后续的验证和参数调优。我一般会跑一套最小验证:sqlplus / as sysdba进去后查v$instance状态、v$datafile路径、dba_tablespaces状态、v$parameter里sga_target和pga_aggregate_target的值。然后建一张测试表插几条数据,用expdp导出一遍再impdp导入,确认数据泵可用。这套跑完,基本能排除 90% 的安装遗留问题。
调优方面,Anolis 上跑 Oracle 11g 最容易忽略的是vm.swappiness。默认值 60 会导致 Oracle 的 SGA 被换出到 swap,性能断崖式下跌。我一般设成 10,在/etc/sysctl.d/99-oracle.conf里加vm.swappiness = 10。另外vm.dirty_ratio和vm.dirty_background_ratio也建议调低到 10 和 5,减少脏页堆积导致的 I/O 抖动。这些参数改完sysctl -p生效,不用重启。
| 验证项 | 命令 | 预期结果 |
|---|---|---|
| 实例状态 | select status from v$instance; | OPEN |
| 数据文件 | select name from v$datafile; | 路径存在且可读 |
| 表空间 | select tablespace_name, status from dba_tablespaces; | ONLINE |
| 监听 | lsnrctl status | READY |
| 数据泵 | expdp system/xxx directory=dpdir dumpfile=test.dmp tables=appuser.test_tab | 成功导出 |
最后说一个我自己的习惯:每次装完 Oracle,我会把db_install.rsp和dbca.rsp里改过的参数单独记一个install-notes.txt,连同sysctl.conf、limits.conf、.bash_profile一起打包存档。下次再装同版本,直接复用这套配置,省掉重新试错的时间。Anolis 的版本迭代比 Oracle 快得多,今天能用的依赖包明天可能就换了名字,留一份可复现的配置比什么都靠谱。希望帮到你。
本文还有配套的精品资源,点击获取