Oracle 12c 不支持快照克隆(SNAPSHOT COPY)只克隆部分表空间,它始终复制整个PDB所有数据文件;真正实现按表空间筛选的是普通克隆配合USER_TABLESPACES子句(如USER_TABLESPACES=(ts1)),该特性自12.1.0.2引入,可仅复制指定用户表空间及SYSTEM、SYSAUX、TEMP,但需规避跨表空间依赖并正确配置FILE_NAME_CONVERT。
oracle 12c 的 pdb 快照克隆(snapshot clone)本身不支持“只克隆部分表空间”——它克隆的是整个 pdb 的一致性快照,包括所有用户表空间、system、sysaux、temp 和 undo(共享)等。你真正想用的,是 user_tablespaces 子句的**按表空间克隆(tablespace-level pdb clone)**,这是 12.1.0.2 起引入的独立特性,和快照克隆无关,但常被混淆。
快照克隆(SNAPSHOT COPY)不支持指定表空间
快照克隆依赖文件系统级写时复制(如 ZFS、BCV、ASM ADVM),底层是块级快照,无法过滤表空间。执行 CREATE PLUGGABLE DATABASE ... SNAPSHOT COPY 时,Oracle 会复制整个 PDB 的所有数据文件(含 SYSTEM、SYSAUX、每个用户表空间的数据文件),即使你只打算用其中一张表。
- 现象:执行后发现新 PDB 的
dba_data_files里仍有 ts1、ts2、ts3 全部存在,哪怕源 PDB 中某些表空间为空 - 原因:快照是物理层完整副本,没有逻辑裁剪能力
- 后果:浪费存储、延长克隆时间、增加恢复复杂度
要用 USER_TABLESPACES 子句做逻辑裁剪
真正能按表空间筛选的,是普通克隆(非快照)配合 USER_TABLESPACES 参数。它在创建时跳过未指定的用户表空间,只复制 SYSTEM、SYSAUX、TEMP 和所列的用户表空间。
-
USER_TABLESPACES = (ts1):只复制 ts1 及其关联对象(如该表空间里的用户、表、索引) -
USER_TABLESPACES = ALL EXCEPT ts2, ts3:复制除 ts2、ts3 外的所有用户表空间 -
USER_TABLESPACES = NONE:仅复制 SYSTEM/SYSAUX/TEMP,适合做空壳模板 PDB - 注意:
SYSTEM、SYSAUX、TEMP总是强制包含,无法排除;UNDO不属于 PDB,由 CDB 统一管理,也不参与裁剪
克隆前必须确保目标表空间可访问且无跨表空间依赖
如果 ts1 里的表引用了 ts2 里的函数或物化视图,或者存在跨表空间的外键约束,USER_TABLESPACES = (ts1) 会失败并报错 ORA-65122: Pluggable database cannot be created because of cross-tablespace dependencies。
- 检查依赖:运行
SELECT owner, name, type FROM dba_dependencies WHERE referenced_owner IN (SELECT username FROM dba_users WHERE default_tablespace IN ('TS2','TS3')) AND owner IN (SELECT username FROM dba_users WHERE default_tablespace = 'TS1'); - 临时方案:先禁用外键(
ALTER TABLE ... DISABLE CONSTRAINT),克隆完成后再手动补数据或重建依赖 - 常见坑:LOB 列默认使用所在表的表空间,但如果指定了
STORE AS SECUREFILE且 LOBSEGMENT 显式放在其他表空间,就会触发跨空间依赖
克隆后需手动验证和清理残留元数据
即使只克隆了 ts1,新 PDB 的 dba_tablespaces 里仍会显示 ts2、ts3 的记录(状态为 READ ONLY 或 OFFLINE),因为数据字典中保留了表空间定义痕迹,但对应的数据文件不会被创建或挂载。
- 确认实际数据文件:查
SELECT tablespace_name, file_name FROM dba_data_files—— 只有 ts1、SYSTEM、SYSAUX、TEMP 出现在结果中才算成功 - 清理残留:若看到 ts2/ts3 在
dba_tablespaces中状态为INVALID,可用DROP TABLESPACE ts2 INCLUDING CONTENTS AND DATAFILES安全删除(前提是确认无对象残留) - 关键细节:
USER_TABLESPACES不影响 CDB 级对象(如公共同义词、CDB 视图),这些仍全局可见;PDB 内部的DBA_*视图会自动过滤掉未克隆表空间的对象
最易被忽略的一点:克隆命令中 FILE_NAME_CONVERT 的路径映射必须覆盖所有将被复制的表空间数据文件路径,哪怕你只选了一个表空间,也要确保 ts1 的源路径和目标路径都出现在该参数里,否则会报 ORA-65154: unable to find datafile。











