Oracle 19c 不支持自动迁移分区到不同表空间,INTERVAL 分区仅自动创建新分区且默认在原表空间,迁移旧分区需手动执行 MOVE PARTITION 并重建本地索引,真“自动”须结合 DBMS_SCHEDULER 与自定义脚本实现。

Oracle 19c 本身不支持“自动迁移分区到不同表空间”这种后台持续调度行为。所谓“自动”,实际是靠 INTERVAL 分区 + 手动或脚本触发的 ALTER TABLE ... MOVE PARTITION 组合实现的,没有开箱即用的自动搬迁机制。
INTERVAL 分区只管自动建新分区,不管旧分区去哪
很多人误以为开了 INTERVAL 就能自动把老分区挪走。其实它只负责在插入超出最大已有分区范围的数据时,自动创建下一个分区(比如按月新增 P_202610),但该分区默认落在原表所在的表空间里,不会跨表空间。
-
CREATE TABLE t_log (ts DATE, msg VARCHAR2(100)) PARTITION BY RANGE(ts) INTERVAL(NUMTOYMINTERVAL(1,'MONTH')) (PARTITION p_init VALUES LESS THAN (DATE'2026-01-01') TABLESPACE users);—— 后续所有自动创建的分区都默认在USERS表空间 - 想让新分区进
ARCHIVE_TBS?必须显式指定:ALTER TABLE t_log SET STORE IN (ARCHIVE_TBS); - 这个
SET STORE IN只影响后续自动创建的分区,对已存在的分区无效
旧分区迁移必须显式执行 MOVE PARTITION
要将历史分区(如 P_202501)从 USERS 搬到 ARCHIVE_TBS,只能逐个执行 MOVE,且需注意锁和索引失效问题:
- 执行前确认分区可移动:
SELECT partition_name, tablespace_name FROM dba_tab_partitions WHERE table_name = 'T_LOG' AND partition_name = 'P_202501'; - 迁移语句:
ALTER TABLE t_log MOVE PARTITION P_202501 TABLESPACE ARCHIVE_TBS; - MOVE 后本地索引会失效,必须重建:
ALTER INDEX idx_t_log_ts REBUILD PARTITION P_202501 TABLESPACE ARCHIVE_TBS; - 全局索引不受影响,但建议加
UPDATE GLOBAL INDEXES参数避免重建耗时
真要“自动”,得靠外部调度+SQL脚本组合
Oracle 不提供内置定时器来定期迁移旧分区,但你可以用 DBMS_SCHEDULER 配合自定义 PL/SQL 脚本模拟“自动”:
- 写一个过程,查出
high_value超过 12 个月的分区,生成并执行MOVE PARTITION语句 - 示例逻辑片段:
SELECT 'ALTER TABLE t_log MOVE PARTITION ' || partition_name || ' TABLESPACE ARCHIVE_TBS;' FROM dba_tab_partitions WHERE table_name = 'T_LOG' AND high_value - 用
DBMS_SCHEDULER.CREATE_JOB每月 1 日凌晨执行该过程 - 务必在非高峰时段运行,
MOVE PARTITION是 DDL,会阻塞 DML 直到完成
真正容易被忽略的是:MOVE 分区后,如果表上有物化视图日志或正在被 GoldenGate 捕获,可能触发隐式全量同步;另外,MOVE 不保留 HWM 以下的空闲块,若目标表空间本身碎片严重,迁移后空间利用率反而可能下降。


















