Automatyczne wygasanie (usuwanie) starych rekordów w Postgres

15

Czy Postgres ma jakieś funkcje wspierające wygaśnięcie starych rekordów?

Chcę używać Postgres do rejestrowania, jako rodzaju kolejki, w której rekordy (zdarzenia dziennika) starsze niż dwa tygodnie są automatycznie usuwane.

Basil Bourque
źródło
Użyj partycjonowania. Samo usunięcie rekordów nie zmniejszy rozmiaru tabeli na dysku.
sivann
@sivann Czy twoje zalecenie nie zakłada, że ​​jego problemem jest rozmiar dysku? Jeśli jego problemem jest czas wykonania zapytania, wydaje się, że usunięcie może być prostszą odpowiedzią niż podział na partycje, prawda? (wciąż próbuję to zrozumieć)
stephenmm
1
Problem polega po prostu na tym, że rekordy dziennika nie są już interesujące po pewnym czasie. Usunięcie starych wierszy powinno zrobić miejsce dla nowych świeżych wierszy.
Basil Bourque

Odpowiedzi:

15

Nie ma wbudowanej funkcji automatycznego usuwania wierszy w systemie opartym na czasie (o którym bym wiedział).

Możesz uruchomić codzienne (decydujesz) zadanie cron, aby zaplanować proste DELETEpolecenia lub użyć do tego celu pgAgent .

Lub możesz użyć partycjonowania z partycjami cotygodniowymi, które dziedziczą z tabeli głównej , nazwijmy to log. Dzięki temu usuwanie byłoby bardzo tanie : zachowaj ostatnie dwa tygodnie i porzuć starsze partycje.

Utwórz a RULElub a TRIGGERw tabeli głównej, która przekierowuje WSTAWKI do partycji bieżącego tygodnia na podstawie czasu systemowego. Zawsze loguj się do tabeli głównej log. Twórz z wyprzedzeniem tabele potomne. Poświęć na to kilka tygodni, aby mieć pewność, i uruchom cotygodniowe zadanie cron, które doda przyszłe tabele potomne ...

Istnieją przykłady kodu w instrukcji .
Powiązana odpowiedź z funkcją plpgsql automatycznie tworzącą tabele:

Powiązane rozwiązanie odtwarza w RULEcelu przekierowania WSTAWEK. Funkcja wyzwalacza może zapisywać do bieżącej partycji dynamicznie ...

Erwin Brandstetter
źródło