简介:面向龙蜥Anolis系统的Oracle 11g部署安装包,专门解决该操作系统下数据库安装依赖繁琐、配置步骤多的问题,适合DBA、运维人员及需要在Anolis上使用Oracle的开发者。压缩包内含11个文件,以rpm依赖包为主(7个),另配有自动化安装脚本、Oracle配置文件、chkconfig服务项及S01shm_load内存挂载辅助文件,整体约334MB。已有3006人学习下载。安装脚本可自动完成环境变量设置、依赖库安装、RPM包解压注册、数据库实例创建、监听器配置等关键步骤,减少手工操作带来的不确定因素;同时覆盖dmp备份文件还原场景,便于数据迁移和故障恢复,是一套较完整且可直接落地的Oracle 11g部署方案。
1. 龙蜥系统装 Oracle 11g:比想象中多踩三个坑
在龙蜥(Anolis OS)上装 Oracle 11g,最麻烦的往往不是数据库本身,而是第一步就卡住的依赖问题。网上能找到的 oracle11g 安装教程大多基于 CentOS 7,直接照搬到龙蜥上,./runInstaller 大概率起不来,日志里不是缺 libaio 就是缺 libnsl,gcc 和 glibc 的版本也对不上。这套安装包把依赖 rpm、Oracle 11g 主包和静默响应文件打在一起,解压后按顺序执行就能装出可用的单实例库,核心是 oracle11g.rpm 这个包。适合 CentOS 平滑迁移龙蜥的老项目,也适合还在跑 11g 的老应用要落到龙蜥系统上的场景。
2. 环境预处理:龙蜥与 CentOS 的兼容边界和依赖补齐
2.1 为什么是龙蜥 7:Oracle 11g 官方支持的最后一站
先得说清楚版本边界。Oracle 11gR2 的最后一个补丁集是 11.2.0.4,Oracle 官方对这个版本的操作系统认证只到 RHEL 7 / CentOS 7,再往上的 RHEL 8、9 就没有 11g 的官方支持了。龙蜥系统分 7.x、8.x 和 23 等大版本,其中 7.x 的定位就是与 CentOS 7 保持二进制兼容,glibc、gcc、libaio 这些底层库的版本接近,所以 11g 的二进制在龙蜥 7 上能跑得起来。这也是为什么这套安装包明确基于龙蜥 7 而不是 8:龙蜥 8 的 glibc 已经是 2.28 往上,11g 安装时编译 agent 的环节很容易报 Error in invoking target,属于典型的玄学问题,官方也不支持。
选 7.x 还有一层现实原因:很多从 CentOS 7 迁过来的数据库服务器,硬件驱动、内核参数、安全加固都按 7 的系统调过,直接换到龙蜥 7 改动面最小。装完系统先确认一下版本,别装完才发现底层不对,后面全白做:
cat /etc/os-release输出里 VERSION_ID 应该指向 7.9,内核版本落在 3.10.x 范围,就和 CentOS 7 的基本环境一致。如果版本是 8 或者 23,建议直接回到安装阶段重选系统,不要在错误的底子上硬装 Oracle 11g。
2.2 依赖包检查与补齐:libaio、compat 和 32 位库
Oracle 11g 的预检脚本对依赖包的检查是出了名的苛刻,少一个就报一个。安装包里的 deps 目录已经把这些 rpm 打包好了,但在执行之前,我习惯先在目标机器上核对一遍当前状态,避免重复安装或版本冲突。
# 检查关键依赖是否已存在 rpm -qa --qf '%{NAME}-%{VERSION}.%{ARCH}\n' | grep -E 'libaio|libnsl|compat-libstdc|gcc|glibc-devel'这条命令把系统里已有的相关包列出来,重点看 libaio 和 libaio-devel 是否都已经装上。实际踩过的坑是:有些精简版系统镜像连 unixODBC 都没有,Oracle 安装程序不报缺它,但在配置 listener 的时候会异常退出,所以依赖补齐一步都不能省。deps 里我特意加了 libnsl 和 libaio-devel,是因为有些精简镜像连这两个最基础的东西都没装。libnsl 在 11g 连接阶段会被动态加载,缺失时症状非常误导人:sqlplus 起得来,但远端连接全部超时。
# 进入安装包 deps 目录,按顺序安装全部依赖 cd /root/oracle11g-anolis/deps yum localinstall -y *.rpm用 yum localinstall 装上目录里所有 rpm,它会自动解析 rpm 之间的依赖关系。这里不建议用 rpm -Uvh 一把梭,因为遇到依赖循环时 yum 能把顺序理顺,而 rpm 是直接栽进去。装完之后再看一眼 gcc 和 gcc-c++ 的版本,11g 的 relink 环节对 gcc 版本有要求,龙蜥 7 自带的 gcc 4.8.5 是兼容的,不需要动。
提示:如果你的机器上已经装了高版本 gcc(比如从 EPEL 源升过级),安装时遇到 nmhs 报错,优先把 gcc 退回到 4.8.5,而不是去改 Oracle 的 makefile,后者越改越乱。
2.3 内核参数与用户边界:sysctl、limits 和 /u01 目录
Oracle 11g 对内核参数的要求在官方文档里写得很散,这套安装包的 scripts 目录里带了一份 sysctl 配置片段,按下面的方式写入即可。这里我用的是安装包里推荐的值,和官方预检脚本的阈值对比过,对于 8G 内存以下的机器留了余量。
cat >> /etc/sysctl.conf <<'EOF' fs.aio-max-nr = 1048576 fs.file-max = 6815744 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 net.ipv4.ip_local_port_range = 9000 65500 vm.swappiness = 10 EOF sysctl -p每个参数对应一个已知的坑:kernel.shmmax 和 shmall 决定共享内存段的上下限,11g 的 SGA 在启动时要申请一个和 SGA 大小匹配的段,设小了直接报 ORA-27102;file-max 影响数据库能打开的文件句柄总数,并发大的库上默认值不够;ip_local_port_range 放宽到 9000-65500 是为了让客户端连接时端口不容易耗尽,这在从应用服务器连过来的场景尤其明显;vm.swappiness 调到 10 是为了减少 swap 抖动,避免数据库进程被换页拖慢。sysctl -p 让参数立即生效,不需要重启。
接着处理 oracle 用户的边界限制。安装包里的 install.sh 会检查 oracle 用户是否存在,但我更建议在跑安装脚本之前手动建好,因为后面建实例、配监听都要用这个身份。Oracle 11g 明确禁止用 root 跑 runInstaller 的配置阶段,提前建用户是必须的。
groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01/app cat >> /home/oracle/.bash_profile <<'EOF' export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=/u01/app/oracle/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 EOF这一步至少有两个常见失误。第一,/u01 目录权限没交给 oracle 用户,安装程序在写 inventory 时会因为权限不足退出,而且报错信息藏在日志末尾,很难一眼看出;第二,LD_LIBRARY_PATH 顺序写反,会导致 sqlplus 找到系统里旧版本的 libclntsh.so,连本地实例都报错。按上面这段设置,oracle 用户的 PATH 和库路径就固定了,后面所有操作都有稳定环境。
3. 安装包落地:rpm 包、响应文件与静默安装的参数拆解
3.1 解包后先看目录结构:rpm、响应文件和 install.sh 三件套
安装包解压后会看到几个固定目录,先别急着执行,花两分钟对照下面这份清单确认文件齐全,能省掉后面很多排查时间。
| 路径 | 作用 |
|---|---|
| oracle11g.rpm | Oracle Database 11.2.0.4 二进制的主 rpm 包,装到 /u01/app/oracle/product/11.2.0/dbhome_1 |
| deps/*.rpm | libaio、unixODBC、compat-libstdc++ 等全部依赖包 |
| scripts/db_install.rsp | runInstaller 静默安装应答文件 |
| scripts/netca.rsp | netca 建监听应答文件 |
| scripts/dbca.sh | dbca 静默建库脚本,内含建表空间 SQL |
| scripts/install.sh | 一键安装入口,按顺序调用上述内容 |
把 Oracle 数据库打包成 rpm 是这个资源最核心的做法。官方提供的安装方式是解压两个 zip 然后跑 runInstaller,过程冗长且容易漏依赖;rpm 封装之后,Oracle 的二进制、ORA Inventory 注册信息、响应文件全部由 rpm 数据库管理,装和卸都走标准通道。卸载时 rpm -e oracle11g 能把写入 /etc/oratab、/etc/oraInst.loc 的痕迹一并清掉,不用再手工翻安装目录。
3.2 安装依赖与主包:rpm -ivh 的执行顺序和输出检查
依赖装好之后,直接进入安装包根目录执行 rpm 安装。这里的关键是顺序:先依赖后主包,主包安装过程中会调用 Oracle 自带的 relink 脚本,如果依赖没到位,relink 会失败,但 rpm 命令本身可能不报错,只把错误写到安装日志里,属于最容易漏掉的一种哑失败。
cd /root/oracle11g-anolis # 先装全部依赖,再装主包;主包安装会触发 relink rpm -ivh deps/*.rpm rpm -ivh oracle11g.rpm # 返回 0 表示上一条命令成功 echo $?echo $? 输出 0 才代表 rpm 安装阶段成功。rpm -ivh 和 rpm -Uvh 的区别在于 -i 只装不升级,避免把系统里已有的同名包顶掉;-v 和 -h 是显示进度,方便观察有没有卡在某个文件上。装完之后检查一下 ORACLE_HOME 目录是否完整,最典型的特征是 bin/oracle 可执行文件存在,且有 s-bit 权限。
ls -l /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle正常情况下输出里能看到 -rwsr-s--x,也就是设置了 setuid 位。这个权限位很容易被忽略,如果之后以 oracle 用户连本地库时报 “Oracle Not Available”,先回来看这一位的权限是不是丢了。
主包装完,还需要以 root 身份跑两个配置脚本。rpm 包已经把这些脚本注册到了安装日志里,执行路径如下:
# 写 inventory 到系统目录 /u01/app/oraInventory/orainstRoot.sh # 建立 /usr/local/bin 下的软链并配置权限 /u01/app/oracle/product/11.2.0/dbhome_1/root.sh这两个脚本一个都不能跳。orainstRoot.sh 负责把 inventory 目录的属主改成 oinstall 组,root.sh 会往 /etc/oratab 写入配置项,并把 dbhome 下的可执行文件软链到 /usr/local/bin。跳过 root.sh 的后果是 dbstart、lsnrctl 这些命令在 root 会话里找不到,且系统重启后没有可用的 oratab 记录。
无论 rpm 还是 runInstaller 的报错,第一现场都在日志里。rpm 阶段看 /var/log/oracle11g-install.log,runInstaller 阶段看 /u01/app/oraInventory/logs/installActions*.log,按时间排序找最后面带 Error 的行。不要在终端里反复重跑命令,先把日志里第一个 Error 前后的 20 行读明白,再决定是补依赖还是清目录重来。
3.3 响应文件拆解:runInstaller -silent 的关键参数
rpm 装完后 ORACLE_HOME 里的 runInstaller 可以反复使用。这时用静默模式执行安装,把响应文件里已经填好的参数过一遍,是最稳的方式。
su - oracle cd $ORACLE_HOME ./runInstaller -silent \ -responseFile /root/oracle11g-anolis/scripts/db_install.rsp \ -ignorePrereq-silent 表示不弹出图形界面;-responseFile 指向应答文件;-ignorePrereq 在龙蜥上建议保留,因为 11g 的预检脚本不认识龙蜥这个发行版的名字,会误判内核版本不满足要求而中止,加上这个参数跳过预检,但前提是你已经按第 2 章把依赖和内核参数都处理好了。不推荐在依赖没做的情况下用 -ignorePrereq 硬闯。如果系统提示 PRVF-0002 之类的错误,先不要急着加参数绕开,优先检查 /etc/hosts 有没有配主机名,这是最容易误报的原因之一。
应答文件里真正需要改的参数不多,默认值按安装包写好的就能用,但至少要知道每个参数的含义,否则出了问题不知道去哪改。
| 参数 | 值示例 | 说明 |
|---|---|---|
| oracle.install.option | INSTALL_DB_SWONLY | 只装软件不建库,建库单独用 dbca |
| UNIX_GROUP_NAME | oinstall | 主组名,必须与用户组一致 |
| INVENTORY_LOCATION | /u01/app/oraInventory | Inventory 路径,建议放在 /u01 下 |
| ORACLE_HOME | /u01/app/oracle/product/11.2.0/dbhome_1 | 主目录,rpm 安装已固定 |
| ORACLE_BASE | /u01/app/oracle | 基础目录 |
| oracle.install.db.InstallEdition | EE | 企业版,标准版改 SE |
| oracle.install.db.DBA_GROUP | dba | DBA 组 |
| oracle.install.db.OPER_GROUP | oinstall | 操作员组,一般和主组一致 |
这里有个容易理解错的地方:rpm 包已经装了二进制,为什么还要再跑一次 runInstaller?因为 rpm 负责把文件放到磁盘,而 runInstaller 阶段才真正执行配置脚本、生成 makefile 产物并写入 inventory 的完整记录。两步分别对应“解压文件”和“完成安装”两个语义,缺的都是不完整的安装。执行完看安装日志的结尾是否有 “Successfully completed” 字样,整个安装流程才算过去。
4. 监听与建库:netca、dbca 的静默参数和内存模型
4.1 netca 静默建监听:LISTENER 与端口 1521
软件装配完成后,接下来是监听和实例。监听这一层用 netca 的静默模式处理,应答文件在 scripts/netca.rsp,命令如下:
su - oracle cd $ORACLE_HOME/bin # 用应答文件建监听,默认名 LISTENER、端口 1521 ./netca -silent -responsefile /root/oracle11g-anolis/scripts/netca.rspnetca 默认会创建一个名为 LISTENER 的监听,端口 1521,监听协议 TCP。执行完检查监听是否起来,用 lsnrctl status 看状态,输出里应该有 “The command completed successfully” 和端口监听行。如果端口被占用,netca 会报地址绑定失败,此时需要先确认 1521 没有被其他进程占用,而不是急着改 listener.ora。
监听器配置写入 $ORACLE_HOME/network/admin/listener.ora,默认长这样:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) )HOST 默认写 localhost 是安装包里的配置,生产环境建议改成机器的实际主机名或内网 IP。这里涉及一个很隐蔽的坑:如果 HOST 写的是 localhost,监听只会在回环地址上接收连接,应用服务器用内网 IP 连的时候会报 “TNS-12541: TNS:no listener”。改 listener.ora 后要重启监听才生效。
建好监听后,用 tnsping 做一次连通性验证,这一条命令能同时验证监听进程、hosts 解析和端口可用性:
tnsping orcl输出末尾的 OK(xx msec)表示网络层链路通。如果这里通了但应用还连不上,问题大概率在应用侧连接串或防火墙,而不是监听配置。
4.2 dbca 静默建库:SID、字符集与内存参数
实例通过 dbca 创建,安装包里带了 dbca.sh 脚本,核心命令是这条:
# 生产环境请替换默认口令;内存按物理内存 40% 分配 dbca -silent \ -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -systemPassword Oracle11g#Pwd \ -sysPassword Oracle11g#Pwd \ -characterSet ZHS16GBK \ -memoryPercents 40 \ -emConfiguration NONE-templateName General_Purpose.dbc 用的是通用模板,适合绝大多数 OLTP 业务;-gdbName 是全局数据库名,-sid 是实例名,生产环境建议用有业务含义的短名字,不要超过 8 个字符;-characterSet 指定字符集,这里重点展开一下:国内存量业务多数是从老库迁过来的,老库用的多是 ZHS16GBK,新建库保持 ZHS16GBK 可以避免中文乱码和排序问题。如果是全新项目且有国际化需求,建议改成 AL32UTF8,一旦建完再改字符集,需要跑 CSScan 和 CSALT 工具,新建库环境下几乎没有后悔药可吃。
-memoryPercents 40 表示把物理内存的 40% 分配给数据库。我这里在 4C16G 的测试机上验证过,SGA 约 6G,PGA 约 1G,跑常规业务足够。如果你的机器内存小于 8G,把这个值降到 30;如果大于 32G,也建议手动设置 SGA_TARGET 和 PGA_AGGREGATE_TARGET,而不是继续用百分比,因为自动内存管理在 11g 上偶尔会做出不合理的分配,导致其他应用被挤占。
建库过程持续十五到二十分钟,日志在 $ORACLE_BASE/cfgtoollogs/dbca/orcl/ 目录下,看到 “Database creation complete” 就表示成功。期间不要强制中断进程,否则残留的半成品数据文件会让第二次建库失败。
建库完成后有几个默认值建议顺手确认。db_recovery_file_dest_size 默认只有 2G,归档开着的库几天就能写满,满了会报 ORA-19809,闪回区变成只读。undo 表空间在通用模板下也只给几百兆,跑大事务前建议先扩到 2G,避免 ORA-01555。这两处是我在培训环境里看人翻车翻得最多的地方。
4.3 建库后初始化:用安装包自带的 init.sql 建表空间和账号
dbca 建库完成后,实例是空的,只有 system、sysaux、users 这些默认表空间。安装包里带了一个 init.sql,负责做最基础的初始化:业务表空间、业务账号、默认临时表空间。这段 SQL 我一般会在交付前跑一遍,把开发环境的基线打出来。
-- 业务数据表空间 CREATE TABLESPACE app_data DATAFILE '/u01/app/oracle/oradata/orcl/app_data01.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 32G; -- 业务临时表空间 CREATE TEMPORARY TABLESPACE app_temp TEMPFILE '/u01/app/oracle/oradata/orcl/app_temp01.dbf' SIZE 1G AUTOEXTEND ON NEXT 256M MAXSIZE 16G; -- 业务账号并授予最小权限 CREATE USER app_user IDENTIFIED BY "AppUser#2024" DEFAULT TABLESPACE app_data TEMPORARY TABLESPACE app_temp; GRANT CONNECT, RESOURCE TO app_user; ALTER USER app_user QUOTA UNLIMITED ON app_data;表空间数据文件和临时文件都放在 oradata/orcl 下,路径要跟 dbca 建库时一致;AUTOEXTEND 配合 MAXSIZE 能避免数据文件写满导致 SQL 失败,同时限制单文件无限增长;临时表空间单独建是因为 11g 建库默认的 TEMP 表空间只有几十兆,跑一个大的排序操作就会报 ORA-01652。密码里的特殊字符建议用双引号括起来,否则 sqlplus 解析会把 # 和 ! 当特殊符号处理。
建完表空间后,可以顺手确认一次字符集,防止建库时选错没有后悔药:
SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';如果输出不是 ZHS16GBK 或 AL32UTF8,就要在导入数据前处理,而不是导入后。
5. 避坑排查手册:安装日志里最常见的五个失败点
5.1 ORA-00845:/dev/shm 太小导致实例起不来
现象:startup 时报 ORA-00845: MEMORY_TARGET not supported on this system,实例起不来,数据库状态永远停留在 mounted 之前。原因:11g 的自动内存管理依赖 /dev/shm 作为内存文件系统,默认只有物理内存的一半。在内存 16G 的机器上,/dev/shm 通常只有 7.8G,比 MEMORY_TARGET 配置的 8G 小,启动时就拒绝创建实例。
解决:要么把 /dev/shm 调大,要么关闭自动内存管理。我最常用的是后者,在 pfile 里固定 SGA 和 PGA 值,顺便避开自动内存管理的性能玄学:
sqlplus / as sysdba alter system set memory_target=0 scope=spfile; alter system set sga_target=6G scope=spfile; alter system set pga_aggregate_target=1G scope=spfile; shutdown immediate; startup;如果坚持用自动内存管理,就 remount /dev/shm:在 /etc/fstab 里给 tmpfs 的 size 写死,比如 size=16G,重启后生效。
5.2 Error in invoking target 'agent nmhs':编译器与 glibc 不匹配
现象:安装阶段报 “Error in invoking target 'agent nmhs' at makefile”,安装进程中止,日志里还能看到 gcc 相关的编译错误。原因:11g 的安装程序在生成 agent 可执行文件时会调用系统的 gcc,龙蜥 7 自带的 gcc 4.8.5 没问题,但如果你从 EPEL 或者 devtoolset 源装过高版本 gcc(比如 7.x、8.x),旧版本的 Oracle makefile 和编译器版本不兼容,就会在 nmhs 这一步翻车。
解决:检查 gcc --version,如果是高版本,卸载或降级回 4.8.5,然后清理之前安装失败的目录,重新执行 rpm -ivh oracle11g.rpm。不要试图去改 $ORACLE_HOME/rdbms/lib/ins_rdbms.mk 里的 gcc 变量,改完大概率过不了下一道关卡。
5.3 sqlplus 报 libclntsh.so 找不到:环境变量没有对每个会话生效
现象:以 oracle 用户执行 sqlplus / as sysdba,报 error while loading shared libraries: libclntsh.so: cannot open shared object file。原因:LD_LIBRARY_PATH 没有包含 $ORACLE_HOME/lib,或者用户是通过 su 切换过来的,.bash_profile 没有随 shell 加载。
解决:确认 /home/oracle/.bash_profile 里有 LD_LIBRARY_PATH 的导出语句,然后重新登录 oracle 用户,不要 su - oracle 之后不退出直接敲 sqlplus。更稳妥的方式是在 $ORACLE_HOME/network/admin/sqlnet.ora 里不依赖这个变量,但 11g 的 sqlplus 还是认 LD_LIBRARY_PATH,所以补环境变量是最直接的。
5.4 ORA-12514:监听起来了但服务注册不上
现象:lsnrctl status 能看到监听在跑,但 sqlplus 远程连接报 ORA-12514: TNS:listener does not currently know of service requested。原因:多半是 /etc/hosts 里没有本机主机名映射,或者 local_listener 参数没配对。11g 的实例启动后会把服务名动态注册到监听器,注册依赖主机名解析,主机名解析不通时监听器里永远看不到 orcl 这个服务。
解决:检查 /etc/hosts 里有没有 “内网IP 主机名” 这一行,没有就加上;再用 sqlplus 查 local_listener 参数,确认指向的地址和 listener.ora 里的监听端口一致。改完重启监听和实例,注册一般就正常了。
5.5 rpm -e 卸载不干净:残留文件导致第二次安装失败
现象:第一次安装失败后卸载,再次 rpm -ivh 时报文件冲突,或者安装完启动实例时提示目录里已有旧数据文件。原因:rpm 卸载只清 rpm 数据库登记的文件,Oracle 在运行时生成的数据文件、监听日志、告警日志不会被清理,/etc/oratab 和 /etc/oraInst.loc 也可能残留旧配置。
解决:卸载要分三步走。先 rpm -e oracle11g,再手工删除 $ORACLE_BASE 下的数据文件目录和 $ORACLE_HOME 残留,最后清理 /etc/oratab、/etc/oraInst.loc 里对应行。这样下次安装才是干净的初始状态。
6. 验证与开机自启:三连验证和 systemd 托管
6.1 三连验证:lsnrctl、sqlplus 与 alert 日志
整套安装完成后,我习惯做一次三连验证,分别覆盖监听、实例、后台日志三个层面,缺一个都不算交付。
# 第一连:监听状态 lsnrctl status # 第二连:本地登录并查实例状态 sqlplus / as sysdba SELECT status FROM v$instance; SELECT name, db_unique_name FROM v$database; # 第三连:看告警日志最近 20 行有没有 ORA- 错误 tail -20 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.loglsnrctl status 的输出里要能看到监听端口处于 listening 状态,并且 Services 列表里有 orcl 的条目。sqlplus 的查询结果 status 应该是 OPEN。告警日志是数据库的黑匣子,启动报错、ORA-600、表空间满都会写在这里,交付前扫一眼能提前发现潜在问题。
6.2 用 systemd 接管 dbstart 和 dbshut:服务器重启不再手拉
最后把数据库和监听做成 systemd 服务,省去每次重启服务器后手动 sqlplus startup 的麻烦。龙蜥 7 的 systemd 已经成熟,比往 /etc/rc.local 里塞命令更可靠,编排依赖关系也更清楚。
# 将以下内容写入 /etc/systemd/system/oracle-11g.service cat > /etc/systemd/system/oracle-11g.service <<'EOF' [Unit] Description=Oracle Database 11g Instance and Listener After=network.target [Service] Type=oneshot User=oracle Group=oinstall Environment=ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 Environment=ORACLE_BASE=/u01/app/oracle 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 EOF systemctl daemon-reload systemctl enable oracle-11g systemctl start oracle-11gAfter=network.target 保证网络起来后再启动数据库,避免监听绑定失败。Type=oneshot 配合 RemainAfterExit=yes 适合 dbstart 这种一次性命令;ExecStop 指定 dbshut,这样 systemctl stop 也能优雅关库。systemd 里不能用 shell 的 export,必须用 Environment= 定义变量,这也是和手写启动脚本最大的区别。启用前先确认 ORACLE_HOME 对 oracle 用户可读,并保证 /etc/oratab 里 orcl 那行的最后一个字段是 Y,否则 dbstart 会跳过这个实例,这是 11g 时代最容易踩的坑。
从那以后我每次装完都强制走一遍“重启服务器 → lsnrctl status → sqlplus 验证”的流程,缺一遍心里都不踏实,因为自启这种东西平时看不出问题,真到断电恢复的时候才发现没配上,代价就大了。这套安装包我整理时已经把上面的坑都验证过,按正文顺序跑一遍基本能一次通过,希望帮到你。
本文还有配套的精品资源,点击获取