2009-09-08 12 views
6

Sto utilizzando la funzione di partizionamento intervallo 11g in una delle mie tabelle. L'ho configurato per creare partizioni di 1 giorno su un campo data/ora e ho creato un lavoro per cancellare i dati di 3 mesi. Quando cerco di eliminare la partizione più vecchio ottengo il seguente errore:Impossibile eliminare la partizione di tabella più vecchia

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

avrei pensato che "Ultimo" si riferisce alla nuova partizione e non il più antico. Come dovrei interpretare questo errore? C'è qualcosa di sbagliato nelle mie partizioni o dovrei di fatto tenere la partizione più vecchia lì in ogni momento?

risposta

4

Sì, il messaggio di errore è in qualche modo fuorviante, ma fa riferimento all'ultima partizione STATICAMENTE creata (nella tabella originale DDL prima che Oracle iniziasse a creare automaticamente le partizioni .Penso che l'unico modo per evitare ciò è creare un elemento " MINVAL" partizione che si è sicuri non sarà mai utilizzato e quindi rilasciare le partizioni reali di sopra di questo

[Edit dopo scambio di commenti]

Suppongo che questo banco di prova riproduce il problema:.

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

Quando faccio questo, posso rilasciare le partizioni p0, p1 e p2 ma ottengo il tuo errore quando tento di rilasciare p3 anche se c'è una partizione generata dal sistema oltre questa.

L'unica soluzione che ho trovato è stato quello di ridefinire temporaneamente il partizionamento tabella:

alter table test set interval(); 

e poi cadere p3 partizione. Poi si può ridefinire il partizionamento come da specifica originale da:

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

Dal nome della partizione posso dire che questo è stato creato automaticamente e la cosa più strana è che sono stato in grado di eliminare partizioni create staticamente prima di quella. In ogni caso volevo provare il tuo suggerimento e ho ricevuto questo errore: alter table TABLE1 aggiungi test di partizione VALORI MENO DI ('07 -LUG-09 11.59.00.000000000 PM '); ERRORE alla riga 1: ORA-14760: ADD PARTITION non è consentito su oggetti partizionati a intervalli Qualche idea? Grazie, PJ –

+0

Mi dispiace, ho dimenticato di dire grazie :) –

+0

Hmmm ... Ho incontrato il tuo problema ed è stato il problema di posizionamento STATICO vs. DINAMICO nel mio caso. Quando ho menzionato la partizione MINVAL, stavo pensando di ricreare la tabella con questa singola partizione (e il partizionamento dell'intervallo definito) e quindi reinserire i dati - è possibile nella tua situazione? – dpbradley

2

tutti corretti nella risposta di dpbradley. Ma si potrebbe fare molto più sicuri se si sta cadendo più antica partizione (s):

Infatti è appena sufficiente per azzerare l'intervallo in questo modo:

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

e poi cadere Parete Parete antica.

In caso contrario, c'è un rischio se la partizione di rilascio non riesce, quindi la tabella non avrà intervallo. Quindi è necessario prendere tutte le eccezioni e gestirlo.