Oracle 12c/19c dbstart自启失败主因是/etc/oratab配置错误或未被读取:仅识别标记Y且ORACLE_HOME路径严格匹配(大小写、末尾斜杠均敏感)、真实存在、权限644;systemd下需wrapper脚本加载环境变量,禁用rc.local;监听启动失败常因listener.ora中HOST不可解析或端口冲突;启用Oracle Restart后严禁使用dbstart,应改用srvctl管理。
Oracle 12c/19c 用 dbstart 自启失败的典型表现
服务没起来、监听起来了但实例没挂载、dbstart 返回 0 却查不到 ps -ef | grep pmon —— 这八成是 /etc/oratab 配置不对,或者 dbstart 根本没读到你的实例。
根本原因就两个:dbstart 只认 /etc/oratab 里标记为 Y 且 ORACLE_HOME 路径有效的行;它不解析环境变量,也不自动补全路径。你写 ORCL:/u01/app/oracle/product/19c/dbhome_1:Y,但实际 $ORACLE_HOME 是 /u01/app/oracle/product/19c/dbhome_1,这没问题;可如果路径末尾多了个斜杠、或大小写不一致(比如 DBHOME_1 写成 dbhome_1),dbstart 就跳过这一行。
-
/etc/oratab必须存在且权限为644,属主是root - 每一行格式严格为:
数据库名:ORACLE_HOME路径:Y/N,中间用冒号分隔,不能有空格 - 数据库名必须和
SELECT name FROM v$database;输出一致(区分大小写) -
ORACLE_HOME路径必须真实存在、可读、且包含bin/dbstart
让 dbstart 在 systemd 下真正跑起来的关键步骤
直接把 dbstart 塞进 /etc/rc.local 已经不靠谱了——systemd 默认忽略它。得写一个合规的 service unit,并确保 Oracle 用户环境就绪。
重点不是“怎么写 service”,而是“怎么避免环境变量失效”。dbstart 启动时需要 ORACLE_HOME、ORACLE_SID、PATH,但 systemd service 默认没有这些。硬编码在 service 文件里容易出错,更稳的做法是:让 service 调用一个 wrapper 脚本,在脚本里 su - oracle -c 或显式 source 环境配置。
- 创建
/etc/init.d/dbora或更推荐/opt/oracle/scripts/start_db.sh,开头加#!/bin/bash,然后export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1、export ORACLE_SID=ORCL、export PATH=$ORACLE_HOME/bin:$PATH - service 文件中
ExecStart指向该脚本,不要直接调dbstart -
Type=forking不可靠;改用Type=oneshot+RemainAfterExit=yes,否则 systemd 认为服务“启动即退出” - 加上
WantedBy=multi-user.target,别用graphical.target
dbstart 找不到监听器或报 ORA-12547 的常见原因
实例起来了,但 lsnrctl status 显示无监听,或连上去报 ORA-12547: TNS:lost contact —— 很可能是因为监听器启动顺序错了,或者监听配置依赖了未就绪的网络资源。
dbstart 默认会先启监听(如果 $ORACLE_HOME/network/admin/listener.ora 存在),再启实例。但它不会等监听完全 ready 就去启库。如果监听器卡在绑定端口(比如 port 1521 被占)、或 listener.ora 里写了主机名但 /etc/hosts 没配,监听就会静默失败,而 dbstart 仍继续启库,导致后续连接失败。
- 检查
$ORACLE_HOME/network/admin/listener.ora中的HOST值是否指向本地可解析地址(建议用localhost或具体 IP,别用主机名) - 运行一次
su - oracle -c "$ORACLE_HOME/bin/lsnrctl start"手动验证监听能否正常启动 - 在 wrapper 脚本里加简单等待逻辑:启动监听后
sleep 3,再执行$ORACLE_HOME/bin/dbstart - 确认
/etc/hosts里有127.0.0.1 localhost,且没有重复或冲突条目
Oracle Restart(GI)环境下千万别碰 dbstart
如果你装了 Grid Infrastructure(哪怕只是单机部署的 Oracle Restart),dbstart 就不该再用。它和 crsctl 冲突,强行启用会导致资源状态混乱、实例反复重启、甚至 OCR 损坏。
Restart 管理所有组件:监听、数据库、ASM。自启逻辑由 crsctl enable crs 控制,实例注册靠 srvctl add database。此时 /etc/oratab 里的 Y 标记会被忽略,dbstart 脚本压根不会被调用。
- 运行
crsctl check crs,如果返回 “CRS-4638: Oracle High Availability Services is online”,说明已启用 Restart - 查实例是否由 CRS 管理:
srvctl config database - 要设开机自启,只需
srvctl enable database -d ORCL,别动dbstart和/etc/oratab - 误删或修改
/etc/oratab可能导致srvctl命令报错,因为某些内部操作仍会读它
复杂点在于:Restart 和非-Restart 混搭的判断不容易一眼看出来,尤其升级后残留配置还在。最稳妥的方式是查 ps -ef | grep ohasd —— 有这个进程,就别碰 dbstart。










