4. PDB 概念精讲:PDB 定义、与 CDB 的关系、在微服务架构中的角色

在 Oracle 多租户架构(Multitenant Architecture)中,PDB(Pluggable Database,可插拔数据库)是核心抽象单元。理解 PDB 是进行资源变更后一致性复核的前提——因为服务目录平台中每个微服务实例所连接的“数据库”,本质上就是一个独立的 PDB。

4.1 PDB 定义与核心特征

PDB 是一个逻辑完整的数据库实例,包含用户数据、元数据、系统表空间和应用程序对象。它对外表现为一个独立的数据库,但物理上共享 CDB(Container Database)的后台进程与 UNDO 表空间。

特征 说明
逻辑隔离 每个 PDB 拥有独立的表空间、用户、权限和默认表空间,应用层无法感知其他 PDB 的存在。
物理共享 所有 PDB 共用同一个 CDB 的 SGA、后台进程(PMON、SMON 等)和 REDO 日志。
可插拔性 PDB 可以在不重建数据的情况下,从源 CDB 拔出(Unplug)并插入(Plug)到目标 CDB。
资源可管控 通过 CDB Resource Manager 或 PDB 级别的 I/O 限制,可对单个 PDB 的 CPU、IOPS 进行配额控制。
SRE 视角: 在资源变更场景中,PDB 的“逻辑隔离”特性意味着:即使 CDB 整体资源充足,单个 PDB 也可能因表空间满、临时表空间不足或配额限制而出现连接失败。一致性复核必须逐 PDB 检查,不能仅看 CDB 层面。

4.2 CDB 与 PDB 的关系

CDB(Container Database)是物理容器,PDB 是逻辑容器。一个 CDB 可以包含 0 到 252 个 PDB(含种子 PDB)。关系如下:

  • 1 个 CDB → N 个 PDB:CDB 负责管理所有 PDB 的启动、关闭、备份和恢复。
  • PDB 依赖 CDB:PDB 不能独立于 CDB 运行,CDB 关闭则所有 PDB 不可用。
  • 根容器(CDB$ROOT):存储 CDB 级别的元数据、系统包和所有 PDB 的公共用户。
  • 种子 PDB(PDB$SEED):只读模板,用于快速创建新 PDB。
CDB 与 PDB 关系结构图 CDB(Container Database) 共享 SGA / 后台进程 / REDO 日志 / UNDO 表空间 CDB$ROOT 系统元数据 / 公共用户 PDB$SEED 只读模板 / 快速克隆 PDB-1 微服务 A 数据库 PDB-2 微服务 B 数据库 PDB-3 微服务 C 数据库 PDB-N 微服务 N 数据库
一致性复核要点: 资源变更(如增加 CPU、扩容表空间)通常作用于 CDB 级别,但 PDB 级别的配额(如 MAX_SIZE、CPU_COUNT)可能未同步更新。复核时必须执行 SELECT pdb_name, status, max_size, cpu_count FROM dba_pdbs; 确认每个 PDB 的资源配置与变更工单一致。

4.3 PDB 在微服务架构中的角色

在服务目录平台中,每个微服务实例通常对应一个独立的 PDB。这种设计带来了以下优势:

微服务需求 PDB 提供的支持
数据隔离 每个微服务拥有独立的 PDB,表结构、索引、序列互不干扰,避免跨服务数据耦合。
独立扩缩容 通过 PDB 级别的资源配额,可单独为高负载微服务分配更多 CPU 或 IOPS,而不影响其他服务。
快速克隆与迁移 利用 PDB 的插拔特性,可在秒级完成测试环境克隆、灰度发布或故障恢复。
版本管理 每个 PDB 可独立升级或回滚应用 Schema,支持微服务独立发布。
PDB 在微服务架构中的角色 微服务层(服务目录平台) 服务 A 服务 B 服务 C 服务 N PDB 层(可插拔数据库) PDB-A PDB-B PDB-C PDB-N CDB 层(共享物理资源:CPU / 内存 / 存储)
常见陷阱: 微服务架构中,如果多个服务共享同一个 PDB,则失去了隔离性。资源变更后,一个服务的慢查询可能拖垮整个 PDB,影响所有共享服务。一致性复核应确认:每个微服务是否严格对应一个独立的 PDB,避免“逻辑共享”导致的级联故障。

4.4 关键 SQL 与复核命令

在资源变更后的 PDB 一致性复核中,以下 SQL 是 SRE 的必备工具:

-- 查看当前 CDB 中所有 PDB 的状态与资源配额
SELECT
    p.pdb_name,
    p.status,
    p.max_size / 1024 / 1024 AS max_size_mb,
    r.cpu_count,
    r.cpu_limit,
    r.io_limit
FROM
    dba_pdbs p
    LEFT JOIN v$pdbs v ON p.con_id = v.con_id
    LEFT JOIN dba_rsrc_pdb_plan_directives r ON p.con_id = r.con_id
ORDER BY
    p.pdb_name;

-- 检查特定 PDB 的表空间使用率
ALTER SESSION SET CONTAINER = <pdb_name>;
SELECT
    tablespace_name,
    ROUND(used_space * 8192 / 1024 / 1024, 2) AS used_mb,
    ROUND(tablespace_size * 8192 / 1024 / 1024, 2) AS total_mb,
    ROUND(used_percent, 2) AS used_pct
FROM
    dba_tablespace_usage_metrics
WHERE
    used_percent > 80
ORDER BY
    used_percent DESC;
复核流程建议: 资源变更完成后,按以下步骤执行 PDB 一致性复核:
1. 连接 CDB,执行 SELECT pdb_name, status FROM dba_pdbs; 确认所有 PDB 处于 READY 状态。
2. 逐 PDB 切换容器,检查表空间使用率是否超过阈值(建议 80%)。
3. 对比变更工单中的资源配额(CPU、IOPS、MAX_SIZE)与实际配置是否一致。
4. 记录差异并触发自动修复流程(如扩容表空间、调整资源配额)。