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 的作用位置放在一起,便于对照记忆。
六、实践中的判断与检查
启动完成后,建议按以下顺序确认状态:
- 查询
V$INSTANCE确认实例状态为 OPEN。 - 查询
V$PDBS,查看每个 PDB 的OPEN_MODE与RESTRICTED列,确认是否符合预期。 - 查询
DBA_PDB_SAVED_STATES,确认需要自动启动的 PDB 已保存状态。 - 用业务账号实际连接一次,验证 READ ONLY 或 RESTRICTED 是否按预期生效。
把 CDB 与 PDB 的启动层次、打开模式和 SAVE STATE 三者串起来看,本节的核心就清晰了:CDB 负责把容器带到 OPEN,PDB 负责把租户带到可用;READ ONLY 与 RESTRICTED 是两种不同维度的限制,前者限制写,后者限制连;SAVE STATE 则把“这次怎么开的”变成“下次自动怎么开”。掌握这三条主线,多租户环境下的启停操作就不会再混淆。