Oracle是 CDB/PDB 环境下,让PDB在数据库启动后自动打开

在 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 名。
posted @ 2026-03-02 08:31  dirgo  阅读(2)  评论(0)    收藏  举报