Oracle 19c不支持按业务时间自动删除旧分区,仅INTERVAL分区可自动创建新分区;删除旧分区须手动或通过DBMS_SCHEDULER调用存储过程实现TRUNCATE PARTITION(推荐)或DROP PARTITION,并需校验索引状态、物化视图依赖及表空间空间。
Oracle 19c没有自动清理分区的内置机制
别被“自动”二字误导——oracle 19c **不提供按业务时间字段自动识别、触发并删除旧分区的功能**。所谓“自动”,仅指 interval 分区能自动创建新分区,但删除旧分区必须由你显式驱动。任何声称“开个开关就自动删”的方案,要么是误读文档,要么依赖外部调度器(如 dbms_scheduler)+ 自定义逻辑组合实现。
TRUNCATE PARTITION 比 DROP PARTITION 更适合日常清理
两者都删数据,但行为差异直接影响索引可用性、Redo 量和 ADG 同步稳定性:
-
TRUNCATE PARTITION:保留分区定义和本地索引结构,全局索引保持VALID(但会生成ORPHANED_ENTRIES),Redo 更少,备库压力小;适合高频清理场景 -
DROP PARTITION:物理移除分区段和定义,全局索引立即变为UNUSABLE,除非加UPDATE GLOBAL INDEXES(该操作耗时长、Redo 多);仅在确认不再需要该分区结构时选用 - INTERVAL 分区表若用
DROP PARTITION删除最老分区,后续自动分区可能失败(因高水位线逻辑依赖连续分区定义)
用 DBMS_SCHEDULER + 存储过程实现定时清理
这是生产环境最可控的方式,比 DBMS_JOB 更可靠(支持日志、状态跟踪、依赖管理):
- 先写存储过程,按
HIGH_VALUE精确识别需清理的分区(不能只靠CREATED时间,它反映的是分区对象创建时间,不是数据时间) - 示例核心逻辑:
SELECT partition_name, high_value FROM dba_tab_partitions WHERE table_name = 'YOUR_TABLE' AND table_owner = 'YOUR_SCHEMA' AND TO_DATE(SUBSTR(high_value, INSTR(high_value, '''') + 1, 10), 'YYYY-MM-DD')
- 调用
EXECUTE IMMEDIATE 'ALTER TABLE ... TRUNCATE PARTITION ' || v_part_name;,注意加异常捕获和日志记录 - 创建调度任务:
DBMS_SCHEDULER.CREATE_JOB,start_date设为每天凌晨低峰期,repeat_interval用FREQ=DAILY; BYHOUR=2 - 务必提前验证:该分区是否被物化视图日志、CDC 或正在运行的查询引用(查
dba_mview_logs、v$session)
容易忽略的关键检查点
跳过这些,半夜可能收到索引失效或查询报错 ORA-01502 的告警:
- 执行前确认
GLOBAL INDEXES状态:SELECT index_name, status FROM dba_indexes WHERE table_name = 'YOUR_TABLE' AND owner = 'YOUR_SCHEMA';—— 若为UNUSABLE,先重建再清理 - 清理后手动触发索引清理(尤其 TRUNCATE 后):
DBMS_PART.CLEANUP_GIDX('SCHEMA','TABLE_NAME');,避免 PMO_DEFERRED_GIDX_MAINT_JOB 在高峰期集中刷 Redo - 检查表空间剩余空间:TRUNCATE 不释放空间给 OS,只重置 HWM;若空间持续紧张,需配合
ALTER TABLESPACE ... COALESCE或收缩数据文件 - INTERVAL 分区的
HIGH_VALUE是字符串表达式,解析时注意日期格式是否含时分秒、是否为 TIMESTAMP 类型——错误解析会导致漏删或多删











