Oracle 19c中PDB默认不随CDB自动OPEN是设计行为,需用ALTER PLUGGABLE DATABASE SAVE STATE持久化保存其OPEN状态,该操作必须在PDB处于READ WRITE时执行,且对每个PDB单独生效。

Oracle 19c 默认不会自动 OPEN PDB,哪怕 CDB 已成功启动 —— 这不是配置遗漏,而是设计如此。必须额外干预,否则应用连不上。
确认当前 CDB/PDB 启动状态
先验证基础是否正常:用 sqlplus / as sysdba 登录后执行:
-
SELECT status FROM v$instance;—— 确认 CDB 是OPEN -
SHOW PDBS;—— 查看各 PDB 的STATUS,常见为MOUNTED而非OPEN -
SELECT con_id, name, open_mode FROM v$pdbs;—— 更明确地看到每个 PDB 是否可读写
如果 PDB 显示 MOUNTED,说明 CDB 启动了,但 PDB 没有自动打开,这就是你要解决的点。
用 ALTER PLUGGABLE DATABASE SAVE STATE 实现状态记忆
这是 Oracle 官方推荐、最轻量且持久的方式(从 12.1.0.2 引入,19c 完全支持)。它让 PDB 记住自己上次关闭前的状态,并在 CDB 启动后自动恢复。
- 前提:PDB 必须先手动
OPEN一次(比如执行ALTER PLUGGABLE DATABASE pdb1 OPEN;) - 然后立即执行:
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE; - 对所有要自启的 PDB 都需单独执行(不支持
ALL通配) - 状态保存在控制文件中,不受重启、补丁、
dbstart脚本影响 - 若之后手动
CLOSE了 PDB,再执行一次SAVE STATE就会记住CLOSED状态 —— 所以务必在业务就绪、PDB 处于READ WRITE时保存
避免误用 AFTER STARTUP 触发器
虽然 CREATE TRIGGER ... AFTER STARTUP ON DATABASE 能强制 ALTER PLUGGABLE DATABASE ALL OPEN,但它有明显缺陷:
- 触发器在 CDB$ROOT 中创建,但
ALTER PLUGGABLE DATABASE ALL OPEN在某些版本或 RAC 场景下可能失败,报错如ORA-65096: invalid common user or role name - 无法区分哪些 PDB 应该 OPEN、哪些应保持 READ ONLY 或 RESTRICTED
- 每次 CDB 启动都无条件执行,缺乏状态感知 —— 即使你刚把某个 PDB 关闭用于维护,它也会被强行拉起
- 运维排查时容易忽略触发器逻辑,导致“为什么 PDB 总是莫名打开”类问题
确保 dbstart 正确启动 CDB
PDB 自启的前提是 CDB 先起来。很多人卡在这一步:
- 检查
/etc/oratab中对应实例行第三字段是否为Y,例如:orclcdb:/u01/app/oracle/product/19c/dbhome_1:Y - 确认
$ORACLE_HOME/bin/dbstart存在且可执行(权限 755),且脚本头部的ORACLE_HOME变量未被硬编码覆盖 - systemd 服务中
ExecStart必须使用绝对路径,不能依赖$ORACLE_HOME环境变量(因为 systemd 启动时 oracle 用户环境未加载) - 首次启用前,建议手动运行一次
su - oracle -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME",确认无报错
SAVE STATE 是核心,但前提是 CDB 能被 dbstart 正常拉起;而 dbstart 能否生效,又取决于 /etc/oratab 和服务定义里路径、用户、权限三者是否全部对齐 —— 少一个环节,PDB 就永远停在 MOUNTED。


















