2009-09-08 17 views
6

Używam funkcji podziału przedziału 11g w jednej z moich tabel. Ustawiłem go tak, aby utworzyć partycje 1-dniowe na polu znacznika czasu i utworzył zadanie usunięcia danych w wieku 3 miesięcy. Gdy próbuję usunąć najstarszy partycji pojawia się następujący błąd:Nie można usunąć najstarszej partycji tabeli.

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

myślałem, że „Ostatni” odnosi się do najnowszej partycji i nie najstarszym. Jak powinienem interpretować ten błąd? Czy coś jest nie tak z moimi partycjami, czy też powinienem zachować w tym miejscu najstarszą partycję?

Odpowiedz

4

Tak, komunikat o błędzie jest nieco mylący, ale odnosi się do ostatniej utworzonej STATYCZNIE partycji (w oryginalnej tabeli DDL przed Oracle zaczął automatycznie tworzyć partycje.Myślę, że jedynym sposobem, aby tego uniknąć jest stworzenie sztucznej " MINVAL”partycja, która na pewno nie będzie używany, a następnie upuścić prawdziwe partycje powyżej tego

[Edytuj po wymianie uwag]

Zakładam ten sprawdzian reprodukuje problemu.

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

Kiedy to zrobię, mogę usunąć partycje p0, p1 i p2, ale otrzymasz swój błąd podczas próby p3 spadku, mimo że istnieje poza tym wygenerowana przez system partycja.

Jedyne obejście mogłem znaleźć było tymczasowo przedefiniować partycjonowanie tabel przez:

alter table test set interval(); 

a następnie upuść partycji P3. Następnie można przedefiniować partycjonowanie zgodnie z oryginalną specyfikacją przez:

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

Dzięki nazwie partycji mogę powiedzieć, że ta została automatycznie utworzona i najdziwniejsze jest to, że udało mi się usunąć statycznie utworzone partycje przed tą. W każdym razie chciałem wypróbować twoją sugestię i dostałem ten błąd: zmień tabelę TABELA1 dodaj test partycji WARTA MNIEJ NIŻ ('07 -JUL-09 11.59.00.000000000 PM '); BŁĄD na linii 1: ORA-14760: DODAJ CZĘŚĆ nie jest dozwolona na obiektach podzielonych na przedziały Jakieś pomysły? Dzięki, PJ –

+0

Przepraszam, zapomniałem podziękować :) –

+0

Hmmm ... Wpadłem na twój problem i był to problem pozycjonowania STATIC vs DYNAMIC w moim przypadku. Kiedy wspomniałem partycję MINVAL, myślałem o ponownym utworzeniu tabeli z tą pojedynczą partycją (i zdefiniowanym partycjonowaniem przedziałowym), a następnie ponownym wstawieniem danych - czy jest to możliwe w twojej sytuacji? – dpbradley

2

poprawne w odpowiedzi dpbradley użytkownika. Ale można to zrobić bardziej bezpieczny sposób, jeśli jesteś upuszczenie najstarszy partycję (s):

W rzeczywistości jest to tylko tyle, aby zresetować interwał tak:

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

a następnie upuść partycji najstarszy partycję.

W przeciwnym razie wystąpi ryzyko, że partycja upuszczenia ulegnie awarii, a tabela nie będzie miała interwału. Trzeba więc wychwycić wszystkie wyjątki i obsłużyć to.