Oracle 19c Data Guard不支持单PDB独立物理容灾,仅支持CDB级切换;必须确保主备PDB名称、服务名、路径、字符集、Local UNDO及权限配额等完全一致,否则切换后PDB无法OPEN或应用连接失败。

确认PDB是否支持Data Guard容灾
Oracle 19c中,Data Guard 保护的是整个CDB实例,**不支持单独对某个PDB做独立的物理Standby**。所谓“单PDB容灾切换”,本质是将整个CDB切换,但业务只关注其中某一个PDB——这要求该PDB在主备库中名称、服务名、表空间路径、字符集等完全一致,否则ALTER PLUGGABLE DATABASE ... SWITCHOVER TO会失败或导致PDB无法OPEN。
常见错误现象:ORA-65128: cannot switch over a pluggable database when the CDB is in a Data Guard configuration,说明你试图对PDB单独执行switchover(这是非法操作);或者切换后PDB状态为NEW或MOUNTED,无法OPEN READ WRITE。
- 必须确保主备CDB的
DB_NAME和DB_UNIQUE_NAME不同,但所有PDB名称(如HRPDB)必须完全相同 - PDB的
FILE_NAME_CONVERT参数在备库需正确映射数据文件路径,否则RECOVER PLUGGABLE DATABASE报错找不到文件 - 备库CDB启动后,PDB默认处于
MOUNTED状态,需手动ALTER PLUGGABLE DATABASE HRPDB OPEN READ ONLY(仅适用于物理DG)或OPEN READ WRITE(逻辑DG需先ALTER DATABASE START LOGICAL STANDBY APPLY)
配置PDB级服务名与监听器注册一致性
容灾切换后,应用连接必须无缝指向新主库上的同名PDB。这依赖于服务名(SERVICE_NAME)在主备两端监听器中注册一致——但Data Guard不会自动同步service_names参数或监听器配置。
典型问题:切换后lsnrctl status查不到HRPDB服务,应用连ORA-12514。
- 主库CDB$ROOT中执行:
ALTER SYSTEM SET service_names='ORCLCDB,HRPDB' SCOPE=BOTH;,然后ALTER SYSTEM REGISTER; - 备库同样配置
service_names,并在listener.ora中显式添加静态服务(避免依赖动态注册不可靠):
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = HRPDB)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = ORCLCDB)
)
)
tnsping HRPDB通,且SELECT NAME, PDB FROM V$SERVICES WHERE NAME = 'HRPDB';返回一致结果启用Local UNDO并验证PDB事务隔离性
若主库PDB使用共享UNDO(LOCAL_UNDO_ENABLED=FALSE),切换到备库后可能因UNDO段元数据不一致导致PDB无法OPEN或事务报错ORA-01555。19c强烈要求所有参与DG的PDB启用Local UNDO。
检查命令:SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';,返回必须为TRUE。
- 若为
FALSE,必须停库执行:ALTER DATABASE LOCAL UNDO ON;,再重启主备CDB——该操作不可逆,且要求所有PDB已关闭 - 切换后立即验证PDB内事务:在
HRPDB中建测试表、插入+提交、查询,确认无ORA-00600或回滚段错误 - RAC环境下,Local UNDO要求每个实例有独立的UNDO表空间,且
undo_tablespace参数在各节点上不能指向同一表空间名(即使路径不同)
切换后PDB权限与表空间配额校验
容灾切换不是简单复制数据,而是重建运行时上下文。很多权限、配额、临时表空间绑定关系不会自动继承,尤其当主库曾用GRANT UNLIMITED TABLESPACE而未回收时,备库PDB可能因资源策略差异拒绝建表。
最易被忽略的点:切换后首次在PDB中建用户或表,报ORA-01950: no privileges on tablespace 'USERS',尽管DBA_TS_QUOTAS显示有配额。
- 登录新主库的
HRPDB,执行:SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME = 'APP_USER';,确认表空间名存在且在线 - 检查配额:
SELECT TABLESPACE_NAME, BYTES/1024/1024 MB FROM DBA_TS_QUOTAS WHERE USERNAME = 'APP_USER';,若为空,需补ALTER USER APP_USER QUOTA UNLIMITED ON users_tenant_a; - 验证关键系统权限:
SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE = 'APP_USER' AND PRIVILEGE IN ('CREATE SESSION', 'CREATE TABLE');,缺失则补授
真正决定容灾成败的,从来不是切换命令本身,而是PDB在主备两端的“运行态一致性”:服务名注册是否及时、Local UNDO是否启用、表空间路径是否可写、用户配额是否生效——这些细节在日常运维中容易被跳过,却会在切换瞬间集中爆发。


















