7

テーブルの 1 つで 11g のインターバル パーティション分割機能を使用しています。タイムスタンプ フィールドに 1 日のパーティションを作成するように設定し、3 か月前のデータを削除するジョブを作成しました。最も古いパーティションを削除しようとすると、次のエラーが発生します。

ORA-14758: 範囲セクションの最後のパーティションは削除できません

「最後」は、最も古いパーティションではなく、最新のパーティションを指すと思っていたでしょう。このエラーをどのように解釈すればよいですか? 私のパーティションに何か問題がありますか、それとも実際には常に最も古いパーティションを保持する必要がありますか?

4

2 に答える 2

5

はい、エラーメッセージはやや誤解を招きますが、最後に静的に作成されたパーティションを参照しています(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'));
于 2009-09-08T19:21:37.040 に答える