必须配合exchange partition才能实现零锁表、秒级归档、可回退,因该操作是毫秒级元数据交换,避免全分区扫描与itl锁;直接expdp分区会引发长事务和业务阻塞。
分区表归档不能只靠 expdp 导出再删数据,必须配合 exchange partition 才能真正实现“零锁表、秒级归档、可回退”。单纯用数据泵导出历史分区再 delete 或 truncate,会引发长事务、高 undo 消耗和业务阻塞。
为什么必须先做 EXCHANGE PARTITION 而不是直接 expdp?
直接对在线分区执行 expdp ... partitions=(p_2024) 会触发全分区扫描 + 服务端并行读,期间该分区仍被业务 DML 持有 ITL 锁,且无法避免读一致性开销。而 EXCHANGE PARTITION 是元数据级操作(毫秒级),把目标分区快速“换出”到一个空表中,之后再对该空表导出,完全脱离原表生命周期。
-
EXCHANGE要求交换表与原分区结构严格一致(列名、类型、NOT NULL、约束),但可以没有索引或统计信息 - 交换后,原分区数据物理上已不在主表中,业务查询自动跳过该分区,无感知
- 交换表可立即用
expdp tables=archive_table导出,不加parallel也极快,因无并发冲突
EXCHANGE 后用 expdp 导出的实操要点
交换出来的归档表本质是普通堆表,导出时别用分区相关参数,否则报错 ORA-39160: Cannot specify partition or subpartition for table mode。
- 导出命令写成:
expdp arch_user/arch_pwd directory=arch_dir dumpfile=arch_p2024.dmp tables=archive_p2024 logfile=arch_p2024.log - 加
compression=all能显著减小归档体积,尤其对历史冷数据效果明显 - 不要加
query参数——交换表已是纯净归档数据,再过滤纯属冗余 - 若需保留统计信息用于后续分析,导出时显式加上
include=statistics
归档完成后如何安全清理交换表?
导出成功 ≠ 归档完成。交换表仍是有效对象,占空间、影响备份窗口,必须明确处置。
- 确认
impdp验证或异地恢复测试通过后,再执行DROP TABLE archive_p2024 - 禁用
RECYCLEBIN(设ALTER SESSION SET RECYCLEBIN=OFF),防止误删后闪回占用空间 - 如果归档表要长期保留作只读查询,改用
READ ONLY表空间存放,并关闭其监控:ALTER TABLE archive_p2024 MONITORING OFF - 切勿在交换表上建索引或触发器——它只是归档容器,加任何额外对象都会拖慢后续导出/导入
最易被忽略的一点:EXCHANGE PARTITION 不会自动转移分区索引。若原表有本地索引,交换后需手动重建交换表上的对应索引,否则 expdp 导出时可能因索引缺失导致统计信息不准或导出失败。











