oracle 19c 能靠 /etc/oratab + /etc/rc.d/rc.local 实现基本自启动,但必须满足三个前提:监听器路径正确、dbstart 脚本能识别实例、oracle 用户环境变量在非交互 shell 中可用;否则大概率启动失败。
oracle 19c 能靠 /etc/oratab + /etc/rc.d/rc.local 实现基本自启动,但必须满足三个前提:监听器路径正确、dbstart 脚本能识别实例、oracle 用户环境变量在非交互 shell 中可用;否则大概率启动失败。
修改 /etc/oratab 启用实例自动识别
这一步是 dbstart 脚本读取实例配置的唯一依据。不改这里,后续所有操作都无效。
-
vi /etc/oratab,找到你的实例行(如ORCL:/u01/app/oracle/product/19.3.0/dbhome_1:N),把末尾的N改成Y - 确保路径与实际
$ORACLE_HOME完全一致,包括大小写和结尾斜杠(不能多也不能少) - 改完执行
chmod 644 /etc/oratab(不是 755,避免安全警告) - 注意:该文件只控制“是否让
dbstart尝试启动此实例”,不负责监听器或 PDB
在 /etc/rc.d/rc.local 中调用 lsnrctl start 和 dbstart
这是最轻量的启动触发方式,但容易因 shell 环境缺失而静默失败——rc.local 默认以 root 执行,而 oracle 用户的 ORACLE_HOME、ORACLE_SID 等变量不会自动加载。
- 编辑
/etc/rc.d/rc.local,在exit 0前添加两行: su - oracle -c "/u01/app/oracle/product/19.3.0/dbhome_1/bin/lsnrctl start"su - oracle -c "/u01/app/oracle/product/19.3.0/dbhome_1/bin/dbstart"- 必须用
su - oracle(带短横),否则不会读取~oracle/.bash_profile,导致dbstart报错ORACLE_HOME not set - 务必给
rc.local加执行权限:chmod +x /etc/rc.d/rc.local - CentOS 8+/RHEL 8+ 默认禁用
rc-local服务,需额外运行:systemctl enable rc-local并确认systemctl is-active rc-local返回active
为什么 dbstart 经常只启监听、不启数据库?
常见于 Oracle 19c 单实例 + CDB/PDB 架构,默认 dbstart 不会打开 PDB。这不是脚本问题,而是设计行为。
-
dbstart只启动 CDB,PDB 保持MOUNTED状态 - 若需 PDB 自动 OPEN,得在 CDB 中执行:
ALTER PLUGGABLE DATABASE ALL OPEN;,并保存到 startup trigger 或使用ALTER DATABASE SAVE STATE - 更稳妥的做法是,在
rc.local的dbstart后追加一行 SQL 调用:su - oracle -c "sqlplus / as sysdba @/home/oracle/open_all_pdb.sql"(脚本内容为ALTER PLUGGABLE DATABASE ALL OPEN;) - 另一个典型原因是
$ORACLE_HOME/bin/dbstart内部的ORACLE_HOME_LISTNER变量未设——打开该脚本,确认第 78 行附近是否有ORACLE_HOME_LISTNER=$ORACLE_HOME,没有就手动加上
真正麻烦的从来不是写几行命令,而是验证时发现数据库没起来、查日志又全是“no such file or directory”这种模糊报错——根源几乎都在 su - oracle 没生效,或 ORACLE_HOME 路径抄错了斜杠位置。动手前先切到 oracle 用户,手动跑一遍那两条命令,确保它们本身能通,再塞进 rc.local。











