Oracle 19c 开机自启失败主因是 /etc/oratab 未正确配置(必须存在且含大写 Y)、systemd 服务未正确调用 dbstart(需 Type=forking、绝对路径、oracle 用户权限及资源限制),以及多租户下 PDB 未执行 ALTER PLUGGABLE DATABASE ALL SAVE STATE 持久化开启状态。

Oracle19c 在 Linux 上无法开机自启,90% 是因为 /etc/oratab 没配对、dbstart 脚本没被 systemd 正确调用,或 PDB 没保存状态 —— 这三处漏掉任意一个,服务都会“启动了但连不上”。
确认 /etc/oratab 已正确启用实例
这个文件是整个自启流程的“总开关”,dbstart 会逐行读它,只处理第三列为 Y 的条目。如果它是空的、不存在,或写成了 N,后续所有操作都白搭。
- 先检查是否存在:
cat /etc/oratab;若报No such file or directory,说明安装时漏执行了$ORACLE_HOME/root.sh,需以 root 身份补运行一次 - 确认你的实例条目格式为:
orclcdb:/opt/oracle/product/19c/dbhome_1:Y(注意:路径必须与实际$ORACLE_HOME完全一致,不能有尾部斜杠,SID 大小写敏感) - 别手抖写成
:y或:yes—— 必须是大写Y - 多个实例?每行一个,不能合并;重复 SID 会导致
dbstart报错退出
用 systemd 管理 dbstart/dbshut,别碰 rc.local
rc.local 在 modern systemd 系统中默认禁用,且缺乏用户环境变量(如 ORACLE_HOME),强行用 su - oracle -c 'dbstart' 容易因环境缺失失败。systemd 是唯一可靠方式。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 确保
$ORACLE_HOME/bin/dbstart和dbshut存在且可执行(权限至少755) - 创建服务文件
/etc/systemd/system/oracle-db.service,关键点:-
Type=forking(不是oneshot)—— 因为dbstart启动监听和实例后会 fork 出后台进程 -
ExecStart和ExecStop必须用绝对路径,显式传入$ORACLE_HOME作为参数(dbstart默认不读环境变量) -
User=oracle+Group=oinstall,不能是 root;否则 Oracle 拒绝启动 - 必须加
LimitMEMLOCK=infinity和LimitNOFILE=65535,否则数据库启动时可能因资源限制卡住
-
- 启用前务必执行:
sudo systemctl daemon-reload,否则修改不生效
让 PDB 随 CDB 自动打开(多租户必做)
CDB 启动后默认所有 PDB 处于 MOUNT 状态,应用连不上 —— 这不是服务没启,而是 PDB 没开。靠触发器或 SAVE STATE 解决,后者更稳。
- 用
sqlplus / as sysdba连 CDB,执行:ALTER PLUGGABLE DATABASE ALL OPEN;先手动打开一次 - 再执行:
ALTER PLUGGABLE DATABASE ALL SAVE STATE;—— 这会把当前 open 状态持久化到控制文件,下次 CDB 启动时自动还原 - 验证是否生效:
SELECT CON_ID, NAME, OPEN_MODE, RESTRICTED FROM V$PDBS;,重启后应仍为READ WRITE - 别用触发器方案(
AFTER STARTUP ON DATABASE):它依赖 CDB 启动顺序,容易因时机问题失败,且 Oracle 官方已明确推荐SAVE STATE
最常被忽略的是 SAVE STATE 这一步 —— 很多人以为 systemd 服务“Active (running)”就万事大吉,结果应用一连就报 ORA-01033: ORACLE initialization or shutdown in progress,其实只是 PDB 还关着。

















