Oracle 19c中无法直接克隆远程表空间,仅支持两种可行路径:一是通过远程PDB克隆间接获取(需源端启用LOCAL_UNDO_ENABLED和归档模式,使用CREATE PLUGGABLE DATABASE...FROM...@dblink);二是采用可传输表空间(TTS),要求表空间只读、平台字节序一致、字符集兼容,并执行导出元数据、复制数据文件、导入三步操作。
oracle 19c 中没有“克隆远程表空间”这个独立操作 —— 表空间本身不能跨数据库直接克隆,必须依附于 pdb(可插拔数据库)或通过可传输表空间(tts)机制迁移。真正可行的路径只有两条:用远程 pdb 克隆间接获得目标表空间,或用 tts 手动导出/导入指定表空间。选哪条取决于你是否需要连同元数据、用户、权限、对象依赖一起搬,还是只搬数据文件。
远程 PDB 克隆:最快但粒度是整个 PDB
如果你的目标表空间属于某个现成 PDB(比如 hrpdb),且你接受把整个 PDB(含所有表空间、用户、角色、配置)一并复制过去,这是最省事的方式。它底层自动处理数据文件拷贝、重做应用和事务一致性,无需手动干预表空间路径。
关键前提是源端满足热克隆条件:
-
LOCAL_UNDO_ENABLED = TRUE(查database_properties) - 源 CDB 处于
ARCHIVELOG模式(archive log list) - 源 PDB 可以保持
READ WRITE状态(不需停业务)
执行时用 CREATE PLUGGABLE DATABASE ... FROM ...@dblink,例如:
CREATE PLUGGABLE DATABASE hrpdb_clone
FROM hrpdb@remote_link
FILE_NAME_CONVERT = ('/oradata/hrpdb/', '/oradata/hrpdb_clone/');
注意:FILE_NAME_CONVERT 必须覆盖源 PDB 所有数据文件路径(包括 SYSTEM、SYSAUX、用户表空间等),漏掉一个就会报 ORA-65128 或挂起在 CREATING 状态。
可传输表空间(TTS):精确控制表空间,但步骤多、限制严
如果你只要某几个表空间(比如 USERS 和 HR_DATA),且源库是 19c、目标库也是 19c,可用 TTS。但它不是“克隆”,而是“移动+导入”,且要求:
- 源和目标平台字节序一致(
V$TRANSPORTABLE_PLATFORM查) - 字符集兼容(
NLS_CHARACTERSET最好完全相同) - 表空间必须为
READ ONLY才能被导出(意味着你要短暂停写) - 不能含全局临时表、物化视图日志、外部表等不支持对象
典型流程:
① 在源库将表空间设为只读:ALTER TABLESPACE hr_data READ ONLY;
② 用 DBMS_TTS.TRANSPORT_SET_CHECK 验证自包含性:BEGIN DBMS_TTS.TRANSPORT_SET_CHECK('HR_DATA,USERS', TRUE); END;
然后查 TRANSPORT_SET_VIOLATIONS,有记录就说明存在跨表空间依赖,不能单独搬。
③ 用 expdp 导出元数据(不导数据):expdp system/password transport_tablespaces=HR_DATA,USERS directory=dp_dir dumpfile=tts_hr.dmp
④ 复制数据文件到目标服务器(路径需与 CREATE TABLESPACE 语句匹配)
⑤ 在目标库导入:impdp system/password dumpfile=tts_hr.dmp directory=dp_dir transport_datafiles='/u01/oradata/hr_data01.dbf','/u01/oradata/users01.dbf'
注意:如果目标库已有同名表空间,impdp 默认会跳过创建,但不会自动 rename;若要避免冲突,提前用 RENAME 子句或改 CREATE TABLESPACE 脚本。
为什么不能直接 “克隆远程表空间”?
因为 Oracle 的表空间是逻辑容器,物理上由数据文件支撑,而数据文件绑定在具体实例的存储路径和 ASM diskgroup 上。没有 PDB 容器层封装,就没有跨实例的“表空间身份”——USERS 在源库是 file#12,在目标库可能是 file#47,且 redo、undo、SCN 都不连续。强行拷文件 + 修改 controlfile 会触发 ORA-01122/ORA-01207 等校验失败,风险极高。
真正被忽略的复杂点是:PDB 克隆看似简单,但 FILE_NAME_CONVERT 的路径替换必须严格匹配源 PDB v$datafile 输出的全路径(尤其 RAC 环境下带 ASM alias 或 +DATA/xxx/xxx.dbf 格式),少一个斜杠或大小写不一致,克隆就会卡在 PLUGGING 状态,且日志里只报模糊的 ORA-65139。











