Dla każdego, kto kończy się tutaj, szukając sposobu usunięcia partycji tabeli w PostgreSQL, oto nowoczesna odpowiedź.
Rozwiązaniem nie jest użycie instrukcji DELETE, ponieważ spowoduje to usunięcie danych bez porzucania odpowiednich partycji tabeli, w których były przechowywane dane. OP zapytał o zarządzanie tabelami partycji, a nie usuwanie rekordów, więc każde rozwiązanie korzystające z instrukcji DELETE zwiększa niepotrzebne obciążenie bazy danych związane z usuwaniem rekordów, pozostawia puste tabele partycji i całkowicie ignoruje jedną z głównych korzyści stosowania partycjonowania; UPUSZCZANIE stołu, gdy nie jest już przydatny.
W takim przypadku rozwiązaniem musi być PORZUCENIE niepotrzebnej już tablicy partycji. Napisałem rozwiązanie tego problemu w moim środowisku produkcyjnym, odpowiedź to tutaj .
Aby rozwiązać problem OP, napisana przeze mnie funkcja może zostać użyta z dwoma niewielkimi poprawkami do zmodyfikowania pełnej nazwy tabeli zmienna i format daty. Wiersz zmiennej fullTablename musi zostać zmieniony z
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
do formatu RRRR-MM-DD_log w ten sposób
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Następnie format daty należy nieznacznie zmodyfikować z
WHEN partition_plan='day' THEN 'YYYYDDD'
zgodnie z podaną konwencją nazewnictwa tabel
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Następnie zapytanie SQL, które wywołuje funkcję w celu wykonania czyszczenia, może zostać wywołane ze skryptu codziennej konserwacji w następujący sposób:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Która spowoduje USUNIĘCIE tabel RRRR-MM-DD_log, które są 5 dni starsze niż 180 kilka dni temu. Dla pierwszego uruchomienia w celu usunięcia dziesiątek lub setek starych partycji tabeli, 5 można ustawić na znacznie wyższą wartość, aby osiągnąć pożądany efekt.