pdb表空间不能复用cdb的system/sysaux,因其是全局元数据容器,违背租户逻辑隔离原则;必须为每个pdb独立创建system、sysaux、undo、temp及业务表空间,并通过file_name_convert重定向路径,禁用跨pdb共享临时与回滚段。

为什么PDB表空间不能直接复用CDB的SYSTEM或SYSAUX
因为PDB必须逻辑隔离,而SYSTEM和SYSAUX在CDB中是全局共享的元数据容器。每个PDB需要自己独立的SYSTEM、SYSAUX、UNDO和TEMP表空间实例——这些表空间物理上虽可共存于同一磁盘路径,但逻辑上完全归属该PDB,由其私有控制文件和数据字典管理。强行复用会破坏容器边界,导致ORA-65040错误(不允许在非CDB或非当前容器上下文中操作)。
如何为新PDB指定专属表空间路径
创建PDB时,CREATE PLUGGABLE DATABASE语句默认继承CDB的数据文件位置,但可通过FILE_NAME_CONVERT显式重定向:
CREATE PLUGGABLE DATABASE pdb_sales
ADMIN USER pdbadmin IDENTIFIED BY pwd123
FILE_NAME_CONVERT = ('/u02/app/oracle/oradata/cdb1/pdbseed/',
'/u02/app/oracle/oradata/cdb1/pdb_sales/');
注意:FILE_NAME_CONVERT不是路径映射,而是字符串替换规则;若漏掉末尾斜杠或大小写不一致,会导致数据文件仍生成在PDB$SEED目录下,后续ALTER PLUGGABLE DATABASE OPEN会失败并报ORA-01119。
PDB内创建用户表空间时要注意哪些权限限制
在PDB中执行CREATE TABLESPACE,必须满足两个前提:
- 当前会话已通过
ALTER SESSION SET CONTAINER = pdb_sales切换到目标PDB - 执行用户拥有
CREATE TABLESPACE权限——该权限只能由PDB本地管理员(如PDB_ADMIN)或具备SET CONTAINER能力的公共用户授予,不能从CDB$ROOT直接继承
常见误操作:用C##dba用户连入CDB$ROOT后直接运行建表空间语句,结果提示ORA-65048(错误源于PDB),实际是因为没切容器。
为什么PDB的临时表空间和undo表空间不能跨PDB共享
临时段(TEMP)和回滚段(UNDO)都依赖会话级内存结构与事务链表,而PDB间事务ID空间、SCN推进机制相互独立。即使物理文件路径相同,Oracle也会为每个PDB分配独立的undo tablespace和temp tablespace实例。试图在PDB中指定CDB级的UNDOTBS1作为undo表空间,会触发ORA-65117(无效的表空间类型)。
真正灵活的地方在于:你可以为每个PDB单独设置DEFAULT TABLESPACE、启用LOCAL UNIFORM SIZE、甚至使用ENCRYPTION选项——这些策略互不影响,也不受CDB根容器约束。但这也意味着,监控和备份必须按PDB粒度展开,而不是笼统地扫整个ORADATA目录。











