4. CDB与PDB的启动与关闭

多租户架构下,启动与关闭不再是“一个实例对应一个库”的简单动作,而是分成两层:CDB 作为容器数据库,负责实例与根容器;PDB 作为可插拔数据库,负责各自的数据与业务。理解本节的关键,是先建立“CDB 先就绪、PDB 再打开”的层次关系,再掌握每个阶段开放了什么、限制了什么。

一、CDB 的启动阶段:NOMOUNT → MOUNT → OPEN

CDB 的启动沿用实例启动的三段式,但每一段在容器语境下都有明确含义。

STARTUP NOMOUNT:只启动实例,读取参数文件、分配 SGA、启动后台进程。此时还没有装载控制文件,因此看不到任何数据文件,也看不到 CDB$ROOT 和 PDB。这个阶段主要用于创建数据库、重建控制文件或修复参数问题。

STARTUP MOUNT:实例读取并装载控制文件,数据库进入 MOUNT 状态。此时 CDB 已经知道有哪些数据文件、有哪些 PDB、以及 PDB 的打开模式记录,但数据文件尚未打开,普通用户无法访问。MOUNT 是执行许多维护操作的必要状态,例如切换归档模式、执行完整恢复、重命名数据文件、以只读方式打开等。

STARTUP OPEN(默认即 OPEN READ WRITE):在 MOUNT 基础上打开联机重做日志与数据文件,CDB$ROOT 与 PDB$SEED 以读写方式打开。需要注意:CDB 进入 OPEN 并不等于所有 PDB 都自动打开。PDB 是否随之打开,取决于它的打开模式记录以及是否配置了 SAVE STATE。

因此,一条完整的启动命令往往写成:

-- 仅启动实例
STARTUP NOMOUNT;

-- 装载控制文件,进入 MOUNT
STARTUP MOUNT;

-- 打开 CDB 根容器
ALTER DATABASE OPEN;

-- 单独打开某个 PDB
ALTER PLUGGABLE DATABASE pdb_sales OPEN READ WRITE;

二、PDB 的打开模式:READ WRITE、READ ONLY、MOUNTED

PDB 有三种常用打开模式,它们决定了业务能做什么、不能做什么。

  • OPEN READ WRITE:正常业务模式,可读写数据、可产生重做日志,是生产 PDB 的常规状态。
  • OPEN READ ONLY:数据文件只读,不允许 DML 写入,但允许查询。适合报表库、数据分发、只读副本,也适合在迁移或校验期间临时冻结数据。
  • OPEN MOUNTED(也称 MOUNT 状态):PDB 的控制信息可见,但数据文件未打开,业务完全不可访问。常用于 PDB 级别的恢复、数据文件重命名、字符集或补丁相关维护。

切换模式的命令非常直接:

-- 以只读方式打开
ALTER PLUGGABLE DATABASE pdb_sales OPEN READ ONLY;

-- 从只读切回读写
ALTER PLUGGABLE DATABASE pdb_sales OPEN READ WRITE;

-- 关闭 PDB 但保留在 MOUNT 状态
ALTER PLUGGABLE DATABASE pdb_sales CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE pdb_sales OPEN MOUNTED;

这里有一个容易踩坑的点:PDB 的 READ ONLY 与 CDB 的 READ ONLY 不是一回事。CDB 级别的只读会影响整个容器,通常用于特殊维护;日常只读需求应优先在 PDB 级别完成,避免影响其他租户。

三、RESTRICTED 模式:限制连接,而不是限制读写

RESTRICTED 模式解决的是“谁能连进来”的问题,而不是“能不能写”的问题。当 PDB 以 RESTRICTED 打开时,只有拥有 RESTRICTED SESSION 权限的用户才能连接,普通业务账号会被拒绝。它常用于:

  • PDB 刚完成迁移或克隆,需要先做数据校验再放业务进来;
  • 执行结构变更、补丁、字符集转换等高风险操作;
  • 排查连接风暴或异常会话,先隔离普通用户。
-- 以受限方式打开
ALTER PLUGGABLE DATABASE pdb_sales OPEN READ WRITE RESTRICTED;

-- 解除受限
ALTER PLUGGABLE DATABASE pdb_sales OPEN READ WRITE;

判断当前是否受限,可以查询 V$PDBS 的 RESTRICTED 列,或使用 V$RESTRICTED_SESSION 观察受限会话。RESTRICTED 与 READ ONLY 可以组合使用,例如先以 RESTRICTED 打开做校验,确认无误后再切换为正常读写。

四、SAVE STATE 与 PDB 自动启动

默认情况下,CDB 重启后 PDB 不会自动打开,需要 DBA 手动执行 OPEN。对于生产环境,这显然不够友好。Oracle 提供了 SAVE STATE 机制:把 PDB 当前的打开模式持久化到 CDB 的元数据中,之后 CDB 启动时按记录自动恢复该 PDB 的状态。

-- 保存当前打开模式,供下次 CDB 启动时自动恢复
ALTER PLUGGABLE DATABASE pdb_sales SAVE STATE;

-- 查看已保存的状态
SELECT con_name, state FROM dba_pdb_saved_states;

-- 取消自动启动
ALTER PLUGGABLE DATABASE pdb_sales DISCARD STATE;

需要特别提醒:SAVE STATE 保存的是“打开模式”,不是“数据”。它记录的是 READ WRITE、READ ONLY 还是 RESTRICTED,并不会保存会话或事务。如果 PDB 在保存状态时是 READ ONLY,那么下次 CDB 启动后它仍会以 READ ONLY 打开。因此,生产 PDB 应在确认处于 READ WRITE 时执行 SAVE STATE。

此外,SAVE STATE 只对“CDB 启动时自动打开 PDB”生效,它不会让 PDB 在 CDB 处于 MOUNT 状态时被打开。也就是说,CDB 必须先 OPEN,PDB 的自动恢复才有意义。

五、关闭顺序与状态对照

关闭时应遵循“先 PDB、后 CDB”的顺序,避免业务连接被强制中断。常用命令如下:

-- 先关闭业务 PDB
ALTER PLUGGABLE DATABASE pdb_sales CLOSE IMMEDIATE;

-- 再关闭 CDB
SHUTDOWN IMMEDIATE;

下面这张图把 CDB 与 PDB 的启动层次、打开模式以及 SAVE STATE 的作用位置放在一起,便于对照记忆。

CDB 与 PDB 启动层次与打开模式 CDB 启动阶段 NOMOUNT 仅实例,无控制文件 MOUNT 装载控制文件,数据未开 OPEN CDB$ROOT 读写打开 CDB 关闭顺序 1. CLOSE PDB 2. SHUTDOWN CDB 先租户,后容器 CDB OPEN 后 PDB 打开模式 OPEN READ WRITE 可读写,业务正常 生产 PDB 常规状态 OPEN READ ONLY 只读查询,禁止 DML 报表 / 校验 / 分发 OPEN MOUNTED 数据文件未打开 PDB 级恢复 / 重命名 RESTRICTED 模式 仅 RESTRICTED SESSION 权限用户可连接 可与 READ ONLY 组合 SAVE STATE 保存打开模式 记录 RW / RO / RESTRICTED 不保存会话与事务 CDB 启动时恢复 按记录自动 OPEN PDB 前提:CDB 已 OPEN DISCARD STATE 取消自动启动 恢复手动 OPEN 查询:DBA_PDB_SAVED_STATES 确认已保存的 PDB 状态

六、实践中的判断与检查

启动完成后,建议按以下顺序确认状态:

  1. 查询 V$INSTANCE 确认实例状态为 OPEN。
  2. 查询 V$PDBS,查看每个 PDB 的 OPEN_MODE 与 RESTRICTED 列,确认是否符合预期。
  3. 查询 DBA_PDB_SAVED_STATES,确认需要自动启动的 PDB 已保存状态。
  4. 用业务账号实际连接一次,验证 READ ONLY 或 RESTRICTED 是否按预期生效。
建议把生产 PDB 的 SAVE STATE 纳入标准交付流程:在 PDB 处于 READ WRITE 且业务验证通过后执行一次 SAVE STATE,并记录到变更单中。这样 CDB 重启后 PDB 能自动恢复,减少人工介入。
不要对处于 READ ONLY 或 RESTRICTED 状态的 PDB 执行 SAVE STATE,否则下次 CDB 启动后该 PDB 会以同样的受限模式打开,业务可能无法写入。若已误保存,可先切换为 READ WRITE,再重新执行 SAVE STATE 覆盖记录。

把 CDB 与 PDB 的启动层次、打开模式和 SAVE STATE 三者串起来看,本节的核心就清晰了:CDB 负责把容器带到 OPEN,PDB 负责把租户带到可用;READ ONLY 与 RESTRICTED 是两种不同维度的限制,前者限制写,后者限制连;SAVE STATE 则把“这次怎么开的”变成“下次自动怎么开”。掌握这三条主线,多租户环境下的启停操作就不会再混淆。