PDB 级 Data Guard 切换,CDB 字典那层窗户纸终于被捅破了

以前做 Data Guard,最小粒度是整个 CDB。客户有个需求:CDB 里跑了 5 个 PDB,只想给其中 2 个做灾备,另外 3 个是开发测试库,不需要同步。26ai 的 PDB-Level Data Guard 就是冲着这个场景来的。

5.1 Redo 路由怎么做到单 PDB 隔离

PDB 级 DG 的核心改动在 redo 格式里加了 PDB GUID 标记。主库的 LGWR 写 redo 时,每个 change vector 都带上 pdb_id;备库的 Recovery 进程读到 redo 后,根据 pdb_id 决定把 change 应用到哪个 PDB 的数据文件。这意味着 CDB 的 SYSTEM、SYSAUX 表空间是全局同步的,但 PDB 的应用数据可以 selective sync。

但这里有个大坑:PDB 切换(switchover)时,CDB 的 root 容器必须保持 OPEN,因为 PDB 的元数据(比如用户、角色、表空间映射)存在 CDB$ROOT 的数据字典里。如果 CDB 的 root 挂了,即使 PDB 的数据文件完好,你也连不进去。所以 PDB 级 DG 并没有降低 CDB 的高可用要求,它只是节省了备库的存储和许可证成本。

5.2 实验:3 PDB 环境下的单 PDB 切换

-- 主库:确认 PDB 级 DG 配置
SELECT pdb_name, protection_mode, open_mode
FROM V$PDBS p, V$DATAGUARD_CONFIG c
WHERE p.con_id = c.con_id;

-- 对单个 PDB 做 switchover
ALTER SESSION SET CONTAINER = pdb_sales;
ALTER PLUGGABLE DATABASE pdb_sales SWITCHOVER;

-- 验证:其余 PDB 不受影响
SELECT name, open_mode FROM V$PDBS;
-- CDB$ROOT: READ WRITE
-- PDB_HR: READ WRITE  (未切换)
-- PDB_SALES: READ WRITE (已切换到原备库)
-- PDB_DEV: MOUNTED     (未配置 DG)

切换过程花了 8 秒,其中 6 秒花在 CDB 字典的同步校验上,真正数据文件切换不到 2 秒。但注意,切换期间所有 PDB 的会话都被冻结了,因为 CDB 控制文件需要全局更新。所以别指望"零感知切换",业务还是要设计重试机制的。

另外,PDB 级 DG 目前不支持 PDB 的 Hot Clone 和 Refreshable Clone 同时开,这两个特性在元数据层有冲突。我们当时想同时用,结果报 ORA-16491,查 MOS 才知道是限制。


请使用浏览器的分享功能分享到微信等