EXPDP/IMPDP是Oracle 11g中迁移非分区大表至分区表最稳妥方案,因其不依赖主键、支持并行与结构转换,仅需分钟级中断;而在线重定义受限于主键和数据类型约束,常因LONG或缺失约束失败。
EXPDP 和 IMPDP 是 Oracle 11g 中最稳妥、可并发、支持表结构变更的迁移路径,尤其适合几十亿行、TB 级的非分区大表转分区表。它不依赖在线重定义的权限和主键约束,也不要求源表停写,但必须接受「逻辑导出 → 物理重建」带来的短时业务中断(通常控制在分钟级)。
为什么选 EXPDP/IMPDP 而不是在线重定义?
对 11g 来说,dbms_redefinition 要求源表有主键或唯一约束,且中间表需完全兼容字段类型、长度、not null 属性;而大表常因历史原因缺失主键、含 long 或嵌套对象,导致 can_redef_table 直接报错 ora-12089。此时 expdp/impdp 反而是更可控的选择——你只需定义好目标分区表结构,数据泵会按需转换、过滤、并行加载。
EXPDP 导出时的关键参数组合
导出阶段不操作源表结构,只提取元数据和数据。重点在于避免全库扫描和冗余对象:
-
CONTENT=DATA_ONLY:跳过 DDL,只导出数据,防止后续IMPDP因表已存在报错 -
PARALLEL=4(根据 CPU 核数设为 2–8):启用并行导出,显著缩短 TB 级表耗时 -
COMPRESSION=ALL:压缩数据块,减少磁盘 IO 和 dump 文件体积(注意:压缩会增加 CPU 消耗) -
EXCLUDE=INDEX,CONSTRAINT,TRIGGER:排除索引/约束/触发器,这些在目标端重建更高效、可控 - 务必指定
DIRECTORIES为数据库内已创建的目录对象(如DATA_PUMP_DIR),不能用本地文件路径
IMPDP 导入到分区表的实操要点
导入是核心环节,成败取决于是否精准映射结构与分区策略:
- 先手动创建目标分区表(含完整分区定义),例如按日期范围分区:
PARTITION BY RANGE(time_fee) INTERVAL(NUMTOYMINTERVAL(1,'MONTH')),首分区必须显式定义 - 使用
REMAP_SCHEMA映射用户,用REMAP_TABLE重命名表(如REMAP_TABLE=SCOTT.EMP:SCOTT.EMP_PART) - 加
TABLE_EXISTS_ACTION=APPEND:跳过建表,直接向已存在的分区表插入数据;若误用REPLACE,会先删表再建,丢失分区结构 - 加
TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y:临时关闭归档日志生成(需LOGGING表空间支持),大幅提速;但必须确保 RMAN 备份可用 - 索引和约束留到导入完成后单独
CREATE INDEX ... LOCAL或ALTER TABLE ... ADD CONSTRAINT,避免阻塞数据写入
容易被忽略的三个硬限制
这三个点不提前检查,IMPDP 很可能中途失败且难以回退:
- 目标表空间剩余空间必须 ≥ 源表大小 × 1.3(考虑排序区、临时段、分区头开销),否则报
ORA-01652且无法动态扩展 - UNDO 表空间必须足够大——
APPEND模式虽不产生大量 UNDO,但约束校验、索引构建阶段仍会消耗 UNDO,建议预留 ≥ 2× 表大小的空间 - 分区列值不能超出所有已定义分区的上限;若用
INTERVAL分区,首次导入的数据必须落在首个显式分区范围内,否则报ORA-14300
LOCAL 并行语句,每条加 NOLOGGING 和 PCTFREE 0,并在业务低峰期分批提交。











