惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Stack Overflow Blog
Stack Overflow Blog
S
SegmentFault 最新的问题
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
U
Unit 42
GbyAI
GbyAI
B
Blog RSS Feed
博客园 - Franky
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - dirgo

springboot里的application.yml文件的logging:下的配置 Flutter的SDK国内下载方法及AndroidStudio配置打包方法 minio数据迁移方法 [转]flutter入门 Elasticsearch介绍以及在spring项目里的使用方法 moxa NPort 5100 Linux real tty驱动安装 VirtualBox 的网络模式 Oracle关联表删除数据和更新数据 logback-spring.xml引入了base.xml日志文件默认生成在哪里? application.yml中Logback相关配置 org/springframework/boot/logging/logback/defaults.xml的内容和作用 logback-spring.xml 中<include resource="org/springframework/boot/logging/logback/base.xml"/>作用 Spring Boot 项目 Logback 日志框架配置文件logback-spring.xml详解 Oracle DataBaseLink 提示密码过期 梅特勒托-托利多衡器串口连续输出数据格式的说明 utf-8编码详解 mybaits updateWrapper更新报错:无效的列类型: 1111 @RequestPart和@RequestParam有什么区别 如何避免Mass Assignment漏洞? 关于vxe-table v4 导出大数据量excel浏览器卡死问题的解决 开源的Linux换源和安装docker脚本 wsl常用命令 使用网页静默打印 在Oracle中,授予用户角色和权限 Linux下查看当前哪些端口在监听状态,哪些端口在连接状态 mobaxterm常用配置 Windows下udp工具 Oracle表空间用户授权创建dblink等操作 用nmap扫描找出某个网段下空闲的ip脚本 Oracle 19c 常用运维 SQL
Oracle是 CDB/PDB 环境下,让PDB在数据库启动后自动打开
dirgo · 2026-03-02 · via 博客园 - dirgo

在 Oracle 12c 及以上版本里,让 PDB 在 CDB 启动后自动打开,推荐用“保存状态”(SAVE STATE)特性,从 12.1.0.2 开始支持。如果你是很老的 12.1.0.1,就只能用系统触发器。
下面分两种情况给你一个完整操作步骤。

一、先确认你的版本

以 sysdba 登录 CDB:

SELECT * FROM v$version;

或:

SELECT VERSION FROM PRODUCT_COMPONENT_VERSION WHERE PRODUCT LIKE 'Oracle Database%';
  • 如果是 12.1.0.2 及以上(包括 12.2、18c、19c 等) → 用方案一(SAVE STATE)。
  • 如果是 12.1.0.1 及更早 → 用方案二(触发器)。

方案一:用 SAVE STATE 让 PDB 自动打开(推荐)

1. 基本原理

Oracle 从 12.1.0.2 开始提供了“保存 PDB 打开状态”的功能:
你在 PDB 打开(READ WRITE/READ ONLY)状态下执行:

ALTER PLUGGABLE DATABASE <pdb名> SAVE STATE;

Oracle 会把当前打开状态记录下来,下次 CDB 启动时,自动把该 PDB 恢复成这个状态。
状态保存在视图 DBA_PDB_SAVED_STATES 里。

2. 操作步骤(单 PDB 示例)

假设你的 PDB 叫 PDB1,CDB 叫 CDB$ROOT
1)以 sysdba 登录 CDB 根容器:

sqlplus / as sysdba

2)确认当前 PDB 状态:

SHOW PDBS;

或:

SELECT NAME, OPEN_MODE FROM V$PDBS;

3)打开 PDB:

ALTER PLUGGABLE DATABASE pdb1 OPEN;

4)保存 PDB 状态(让下次 CDB 启动时自动打开):

ALTER PLUGGABLE DATABASE pdb1 SAVE STATE;

5)查看已保存的状态:

COLUMN CON_NAME FORMAT A20
COLUMN INSTANCE_NAME FORMAT A20
SELECT CON_NAME, INSTANCE_NAME, STATE FROM DBA_PDB_SAVED_STATES;

能看到类似:

CON_NAME            INSTANCE_NAME       STATE
-------------------- -------------------- --------------
PDB1                 cdb1                OPEN

表示已保存为 OPEN 状态。
6)重启 CDB 验证:

SHUTDOWN IMMEDIATE;
STARTUP;
-- 等待实例完全启动后
SHOW PDBS;

正常情况下,PDB1 应该已经是 READ WRITE,不再是 MOUNTED。

3. 让所有 PDB 都自动打开

如果你有多个 PDB,想让全部自动打开,可以一次性处理:
1)打开所有 PDB:

ALTER PLUGGABLE DATABASE ALL OPEN;

2)保存所有 PDB 的状态:

ALTER PLUGGABLE DATABASE ALL SAVE STATE;

这样,以后 CDB 重启时,所有 PDB 都会自动打开到之前保存的状态(READ WRITE 或 READ ONLY)。

4. 取消自动打开(清除保存的状态)

如果你不想某个 PDB 再自动打开,可以清除其保存状态:

ALTER PLUGGABLE DATABASE pdb1 DISCARD STATE;

之后重启 CDB,这个 PDB 会回到默认行为:MOUNTED,需要手工打开。

方案二:用系统触发器(适合 12.1.0.1 及更早)

如果你的版本是 12.1.0.1 或更早,不支持 SAVE STATE,可以在 CDB 上创建一个系统触发器,在数据库启动后自动打开 PDB。

1. 创建触发器

以 sysdba 登录 CDB:

CREATE OR REPLACE TRIGGER open_pdbs
AFTER STARTUP ON DATABASE
BEGIN
  EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE ALL OPEN';
END open_pdbs;
/

这个触发器会在每次 CDB STARTUP 后自动执行 ALTER PLUGGABLE DATABASE ALL OPEN,把所有 PDB 打开。

2. 自定义只打开部分 PDB

如果你只想自动打开某几个 PDB,可以在触发器里写具体名字:

CREATE OR REPLACE TRIGGER open_pdbs
AFTER STARTUP ON DATABASE
BEGIN
  EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE pdb1, pdb2 OPEN';
END open_pdbs;
/

小结

  • 版本 ≥ 12.1.0.2
    ALTER PLUGGABLE DATABASE ... SAVE STATE;,这是官方推荐方式,无需触发器。
  • 版本 ≤ 12.1.0.1
    用系统触发器 AFTER STARTUP ON DATABASE,在触发器里 ALTER PLUGGABLE DATABASE ALL OPEN 或指定 PDB 名。