重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 176|回复: 0
打印 上一主题 下一主题

[Oracle] 让 PDB 随 CDB 启动自动 OPEN 的两种方式

[复制链接]
跳转到指定楼层
楼主
发表于 2026-2-8 19:56:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 Oracle 19c 多租户(CDB / PDB)架构中,一个经常被忽略但极易踩坑的问题是:
CDB 重启后,PDB 并不会自动处于 OPEN 状态
尤其是在做升级、补丁、系统重启或例行维护后,如果没有额外处理,业务 PDB 很可能停留在 MOUNTED,直接导致应用无法连接。

本文基于 Oracle Database 19c,结合实际运维场景,系统性总结 PDB 开机自启动的两种常见实现方式,并给出使用建议。

一、背景现象:为什么 PDB 不会自动 OPEN?
默认情况下,Oracle 的行为是:
• CDB 启动后,仅保证 CDB 本身 OPEN
• PDB 不会自动 OPEN
• PDB$SEED 始终为 READ ONLY
• 业务 PDB 状态取决于是否“保存过启动状态”

先来看一个典型现象。

SQL> show pdbs

CON_ID  CON_NAME   OPEN MODE   RESTRICTED
------  ---------  ----------  ----------
2       PDB$SEED   READ ONLY   NO
3       PDB1       READ WRITE  NO
4       PDB2       MOUNTED
5       PDB3       MOUNTED
即便你曾经手工打开过 PDB:

ALTER PLUGGABLE DATABASE ALL OPEN;
只要 CDB 重启,PDB 依然会回到 MOUNTED。

二、关键视图:DBA_PDB_SAVED_STATES
Oracle 为 PDB 的自动启动提供了原生机制,核心视图是:

DBA_PDB_SAVED_STATES
该视图记录的是:

某个 PDB 在某个实例上,被“保存”的启动状态

常用字段说明:

字段        含义
CON_ID        PDB ID
CON_NAME        PDB 名称
INSTANCE_NAME        保存的状态(OPEN / MOUNTED)
RESTRICTED        是否受限模式
默认情况下,该视图是空的。

SQL> select * from dba_pdb_saved_states;

no rows selected
三、方法一(推荐):SAVE STATE(官方标准方式)
1、手工打开目标 PDB
ALTER PLUGGABLE DATABASE pdb3 OPEN;
确认状态:

SQL> show pdbs;

CON_ID  CON_NAME  OPEN MODE   RESTRICTED
------  --------  ----------  ----------
5       PDB3      READ WRITE  NO
2、保存 PDB 启动状态
ALTER PLUGGABLE DATABASE pdb3 SAVE STATE;
此时查看保存结果:

SELECT con_name, state
FROM dba_pdb_saved_states;

CON_NAME  STATE
--------  -----
PDB3      OPEN
3、重启 CDB 验证
SHUTDOWN IMMEDIATE;
STARTUP;
再次查看:

SQL> show pdbs;

CON_ID  CON_NAME  OPEN MODE
------  --------  ----------
5       PDB3      READ WRITE
PDB 已随 CDB 启动自动 OPEN

方法一特点总结

优点:
• Oracle 官方推荐
• 配置简单、可控
• 不依赖触发器
• 支持 RAC(每实例保存)

注意事项:
• SAVE STATE 是 按实例保存
• RAC 环境需在对应实例执行
• 删除 PDB 或 UNPLUG 后记录失效

生产环境首选方案

四、方法二:AFTER STARTUP 触发器(兜底方案)
在部分老系统或特殊管控场景中,也会使用 数据库启动触发器。

1 创建触发器

CREATE OR REPLACE TRIGGER open_pdbs
AFTER STARTUP ON DATABASE
BEGIN
  EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
END;
/
也可以精确控制某个 PDB:

EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE pdb2 OPEN';
2 重启 CDB 验证

SHUTDOWN IMMEDIATE;
STARTUP;

SQL> show pdbs;

CON_ID  CON_NAME  OPEN MODE
------  --------  ----------
3       PDB1      READ WRITE
4       PDB2      READ WRITE
5       PDB3      READ WRITE
方法二风险提示

不推荐作为长期方案,原因包括:
• 触发器依赖数据库启动流程
• 启动阶段异常可能导致实例卡顿
• 所有 PDB 强制 OPEN,不够精细
• 排障复杂(启动即执行)

仅作为临时方案或历史系统兼容手段

五、实践建议(运维经验)
结合实际项目经验,建议:
• 生产环境
• 使用 ALTER PLUGGABLE DATABASE SAVE STATE
• 升级 / 临时应急
• 可短期使用触发器
• RAC 场景
• 明确 PDB 在每个实例的启动策略
• 交付文档
• 必须明确:哪些 PDB 需要自启动,哪些不需要

六、结语
PDB 自动 OPEN 看似是个“小配置”,但在:
• 数据库升级
• 系统重启
• 高可用切换
• 运维交接

这些场景下,往往决定了业务是否能第一时间恢复。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 18:28 , Processed in 0.215234 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表