2009-09-08 23 views
6

Estoy usando la característica de partición de intervalo 11g en una de mis tablas. Lo configuré para crear particiones de 1 día en un campo de marca de tiempo y creé un trabajo para eliminar datos de 3 meses. Cuando intento para eliminar la partición más antigua me sale el siguiente error:No se puede eliminar la partición de tabla más antigua

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

yo habría pensado que "Última" se refiere a la nueva partición y no el más antiguo. ¿Cómo debo interpretar este error? ¿Hay algo mal con mis particiones o debería mantener la partición más vieja allí en todo momento?

Respuesta

4

Sí, el mensaje de error es algo engañoso, pero se refiere a la última partición creada ESTÁTICAMENTE (en su tabla original DDL antes de que Oracle comenzara a crear las particiones automáticamente. Creo que la única manera de evitar esto es crear un artifical " MINVAL" partición que estás seguro de que nunca será utilizado y luego soltar las particiones reales por encima de este

[Editar después del intercambio de los comentarios]

asumo este caso de prueba reproduce el 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')); 

Cuando hago esto, puedo soltar las particiones p0, p1 y p2, pero obtengo el error al intentar eliminar p3 aunque haya una partición generada por el sistema más allá de esto.

La única solución que pude encontrar fue redefinir temporalmente la partición de tablas por:

alter table test set interval(); 

y luego dejar caer p3 partición. A continuación, puede volver a definir la partición de acuerdo con la especificación original por:

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

Por el nombre de la partición puedo decir que esta se creó automáticamente y lo más extraño es que pude eliminar las particiones creadas estáticamente antes de esa. De todos modos, quería probar su sugerencia y obtuve este error: alter table TABLE1 add partition test VALUES MENOS DE ('07 -JUL-09 11.59.00.000000000 PM '); ERROR en la línea 1: ORA-14760: ADD PARTITION no está permitido en Intervalo de objetos particionados ¿Alguna idea? Gracias, PJ –

+0

Lo siento, se olvidó de decir gracias :) –

+0

Hmmm ... Me encontré con su problema y fue el problema de posicionamiento ESTÁTICO vs. DINÁMICO en mi caso. Cuando mencioné la partición MINVAL, estaba pensando en volver a crear la tabla con esta única partición (y la partición de intervalo definida) y luego volver a insertar los datos: ¿es posible en su situación? – dpbradley

2

Todo correcto en la respuesta de dpbradley. Pero se podría hacer de manera más segura si usted está cayendo partición más antigua (s):

De hecho, es justo lo suficiente para restablecer el intervalo de la siguiente manera:

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

Y a continuación, colocar la partición partición más antigua.

De lo contrario, existe el riesgo de que si la partición fallida falla, la tabla no tendrá intervalo. Entonces, necesito atrapar todas las excepciones y manejar esto.

Cuestiones relacionadas