如何导出CDB中ORACLE_MAINTAINED=Y的Oracle Schema?
问题场景
在CDB根容器中执行alter session set "_oracle_script"=TRUE;创建了ORACLE_MAINTAINED=Y的Schema,该Schema下有100多张带数据的表,但使用expdp MySchema/pwd@instance DUMPFILE=MySchema.dmp导出时仅生成308KB的小型dump文件,添加CONTENT=ALL、INCLUDE=TABLE:"IN ('TABLE_LIST')"等参数也无效。导出日志显示任务成功完成,但未导出有效数据。
解决方案
1. 明确限制原因
Oracle将ORACLE_MAINTAINED=Y的Schema标记为系统维护对象,Data Pump默认会跳过这类对象的导出——哪怕你显式指定INCLUDE参数,也会被内部规则覆盖,这是Oracle的原生保护机制,防止误导出系统维护类对象。
2. 针对性导出命令
要绕过这个限制,需要在导出命令中明确指定过滤ORACLE_MAINTAINED='Y'的对象,同时添加METRICS=Y参数查看导出详情:
# 导出整个Schema expdp MySchema/pwd@instance DUMPFILE=MySchema.dmp INCLUDE=SCHEMA:"WHERE ORACLE_MAINTAINED='Y'" CONTENT=ALL METRICS=Y # 仅导出指定Schema下的表 expdp MySchema/pwd@instance DUMPFILE=MySchema.dmp INCLUDE=TABLE:"WHERE OWNER='MYSCHEMA' AND ORACLE_MAINTAINED='Y'" CONTENT=ALL METRICS=Y
3. 验证导出结果
执行上述命令后,查看导出日志中的METRICS板块,会显示实际导出的表行数、对象数量等信息,可以直接确认数据是否被正确导出。
4. 后续建议
- 不要在CDB根容器中创建
ORACLE_MAINTAINED=Y的自定义Schema,这违反Oracle最佳实践,自定义Schema应创建在PDB中。 - 导出
ORACLE_MAINTAINED=Y的Schema可能导致后续导入时出现兼容性问题,这类对象通常由Oracle自身维护,手动导出导入存在风险。
用户提供的导出日志(中文翻译)
导出: Release 19.0.0.0.0 - 生产环境 于 2024年11月29日 星期五 11:46:41
版本 19.3.0.0.0版权所有 (c) 1982, 2019, Oracle 和/或其附属公司。保留所有权利。
已连接到: Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - 生产环境
警告: 连接到容器数据库的根容器或种子容器时,通常不需要使用Oracle Data Pump操作。
启动 "MYSCHEMA"."SYS_EXPORT_SCHEMA_01": MYSCHEMA/********@instance
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA
处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
处理对象类型 SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE
处理对象类型 SCHEMA_EXPORT/TABLESPACE_QUOTA
处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE
处理对象类型 SCHEMA_EXPORT/TABLE/COMMENT
处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/INDEX
主表 "MYSCHEMA"."SYS_EXPORT_SCHEMA_01" 已成功加载/卸载MYSCHEMA.SYS_EXPORT_SCHEMA_01 的转储文件集为:
C:\PATH\DPDUMP\EXPDAT.DMP
作业 "MYSCHEMA"."SYS_EXPORT_SCHEMA_01" 于 2024年11月29日 星期五 04:47:50 成功完成,耗时 0 00:00:37
内容的提问来源于stack exchange,提问作者Vy8

