2009-09-08 10 views
6

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

ORA-14758: Last partition in the range section cannot be dropped

私は「最終」は、最新のパーティションではなく、最も古いを指していると考えているだろう。このエラーをどのように解釈すればよいですか?私のパーティションに何か問題がありますか?あるいは、私は実際にいつも最も古いパーティションをそこに残すべきですか?

答えて

4

はい、エラーメッセージはやや誤解を招くことがありますが、Oracleがパーティションを自動的に作成する前に元のテーブルDDL内に最後にSTATICALLYで作成されたパーティションを参照しています。これを回避する唯一の方法は、あなたが使用していないし、この上の本当のパーティションをドロップするん確認している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')); 
+0

私はこれが自動的に作成されたと言うことができるパーティションの名前で、奇妙なことは、その前に静的に作成されたパーティションを削除できたということです。とにかく私はあなたの提案を試してみたかったと私はこのエラーが出てくる: テーブルを変更するTABLE1パーティションを追加するより小さい値('07 -JUL-09 11.59.00.000000000 PM '); エラー1行目: ORA-14760:パーティション分割されたオブジェクトにADD PARTITIONは許可されていません アイデアはありますか? ありがとう、 PJ –

+0

申し訳ありませんが、おかげで感謝します:) –

+0

うーん...私はあなたの問題に遭遇し、私の場合は、静的対動的位置付けの問題でした。私がMINVALパーティションについて言及したとき、私はこの単一のパーティション(およびパーティション分割が定義されている)を使用してテーブルを再作成し、データを再挿入することを考えていました。 – dpbradley

2

dpbradleyの答えはすべて正しいです。しかし、あなたが最も古いパーティションを落としている場合、それは、より安全な方法を行うことができます。

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

そしてパーティション最も古いパーティションを削除:

実際にはそれだけで、このような間隔をリセットするために十分です。

それ以外の場合は、ドロップパーティションが失敗してもテーブルに間隔がないと危険性があります。だからすべての例外をキャッチし、これを処理する必要があります。

関連する問題