无法删除最旧的表分区

时间:2009-09-08 17:57:08

标签: oracle11g partitioning

我正在其中一个表中使用11g间隔分区功能。我将其设置为在时间戳字段上创建1天分区,并创建一个作业以删除3个月前的数据。当我尝试删除最旧的分区时,出现以下错误:

  

ORA-14758:无法删除范围部分中的最后一个分区

我原以为“最后”是指最新的分区而不是最旧的分区。我该如何解释这个错误?我的分区有问题,或者我是否应该始终保留最旧的分区?

2 个答案:

答案 0 :(得分:4)

是的,错误消息有点误导,但它指的是最后一个STATICALLY创建的分区(在Oracle开始自动创建分区之前的原始表DDL中。我认为避免这种情况的唯一方法是创建一个人工的“MINVAL” “您确定永远不会使用的分区,然后将真正的分区放在此之上。

[交换意见后编辑]

我认为这个测试用例可以重现你的问题:

CREATE TABLE test 
    ( t_time        DATE
    )
  PARTITION BY RANGE (t_time)
  INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
    ( PARTITION p0 VALUES LESS THAN (TO_DATE('09-1-2009', 'MM-DD-YYYY')),
      PARTITION p1 VALUES LESS THAN (TO_DATE('09-2-2009', 'MM-DD-YYYY')),
      PARTITION p2 VALUES LESS THAN (TO_DATE('09-3-2009', 'MM-DD-YYYY')),
      PARTITION p3 VALUES LESS THAN (TO_DATE('09-4-2009', 'MM-DD-YYYY')) 
);
insert into test values(TO_DATE('08-29-2009', 'MM-DD-YYYY'));
insert into test values(TO_DATE('09-1-2009', 'MM-DD-YYYY'));
insert into test values(TO_DATE('09-3-2009', 'MM-DD-YYYY'));
insert into test values(TO_DATE('09-10-2009', 'MM-DD-YYYY'));

当我这样做时,我可以删除分区p0,p1和p2,但在尝试删除p3时会出现错误,即使系统生成的分区超出此范围。

我能找到的唯一解决方法是暂时重新定义表分区:

alter table test set interval ();

然后删除分区p3。然后,您可以按照原始规范重新定义分区:

alter table test set INTERVAL(NUMTODSINTERVAL(1, 'DAY'));

答案 1 :(得分:2)

dpbradley的答案都正确无误。但如果您删除最旧的分区,可以采用更安全的方式:

事实上,仅仅重置间隔就足够了:

alter table test set interval ();
alter table test set INTERVAL(NUMTODSINTERVAL(1, 'DAY'));

然后删除分区最旧的分区。

否则如果drop partition失败则存在风险,那么table将没有间隔。所以需要捕获所有异常并处理它。

相关问题