2009-09-08 9 views
6

Ich verwende die 11g Intervallpartitionierungsfunktion in einer meiner Tabellen. Ich habe es eingerichtet, 1-Tage-Partitionen in einem Zeitstempelfeld zu erstellen und einen Job erstellt, um Daten zu löschen, die 3 Monate alt sind. Wenn ich versuche, die älteste Partition ich die folgende Fehlermeldung zu löschen:Die älteste Tabellenpartition konnte nicht gelöscht werden

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

Ich hätte gedacht, dass „Last“ auf die neueste Partition bezieht und nicht die älteste. Wie soll ich diesen Fehler interpretieren? Stimmt etwas mit meinen Partitionen nicht oder sollte ich tatsächlich immer die älteste Partition dort behalten?

Antwort

4

Ja, die Fehlermeldung ist etwas irreführend, aber bezieht sich auf die letzte STATISCH erstellte Partition (in Ihrer ursprünglichen Tabelle DDL, bevor Oracle begann, die Partitionen automatisch zu erstellen. Ich denke, der einzige Weg, dies zu vermeiden ist ein künstliches erstellen " MINVAL“Partition, die Sie sicher sind, wird nie und dann über diese die wirklichen Partitionen fallen verwendet werden

[Bearbeiten nach dem Austausch von Kommentaren]

ich nehme an, das Testfall reproduziert Ihr Problem.

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')); 

Wenn ich dies tue, kann ich die Partitionen p0, p1 und p2 fallen lassen, aber Sie erhalten Ihren Fehler, wenn Sie versuchen, p3 zu löschen, obwohl es darüber hinaus eine vom System generierte Partition gibt.

Die einzige Abhilfe, die ich finden konnte, war vorübergehend die Tabellenpartitionierung Neudefinition von:

alter table test set interval(); 

und dann Partition p3 fallen. Dann können Sie die Partitionierung gemäß der ursprünglichen Spezifikation neu definieren, indem:

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

Mit dem Namen der Partition kann ich sagen, das wurde automatisch erstellt und die seltsamste Sache ist, dass ich statisch erstellte Partitionen vor diesem löschen konnte. Jedenfalls wollte ich Ihren Vorschlag versuchen, und ich habe diesen Fehler: alter table TABLE1 Partitionstest hinzufügen WERTE WENIGER als ('07-Juli-09 11.59.00.000000000 PM '); FEHLER bei Zeile 1: ORA-14760: ADD PARTITION ist nicht erlaubt auf Intervall partitionierte Objekte Irgendwelche Ideen? Danke, PJ –

+0

Sorry, vergessen zu sagen, danke :) –

+0

Hmmm ... Ich lief auf Ihr Problem und es war das STATIC vs. DYNAMIC Positionierungsproblem in meinem Fall. Als ich die MINVAL-Partition erwähnte, dachte ich darüber nach, die Tabelle mit dieser einzelnen Partition (und der definierten Intervallpartitionierung) neu zu erstellen und dann die Daten neu einzufügen - ist das in Ihrer Situation möglich? – dpbradley

2

alle richtig in dpbradley Antwort. Aber es könnte sein sicherer Art und Weise geschehen, wenn Sie älteste Partition fallen (e):

In der Tat ist es genug, nur Intervall zurückgesetzt werden wie folgt aus:

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

Und dann Partition älteste Partition löschen.

Andernfalls besteht ein Risiko, wenn die Partition fehlschlägt und die Tabelle kein Intervall hat. Also müssen alle Ausnahmen abfangen und damit umgehen.

Verwandte Themen