Moja sugestia dotycząca archiwizacji:
- Utwórz
archive_tablespace
(jeśli chcesz, możesz oddzielić sprzęt na archiwum)
Twórz tabele. Na przykład chcemy zarchiwizować posty w tabeli.
create table posts_all ( LIKE public.posts) ;
create table posts_archive () inherits ( public.posts_all) ;
alter table public.posts inherits ( public.posts_all ) ;
Następnie będziemy mieć 2 nowe tabele: public.posts_all (z tymi samymi kolumnami, co w postach) do przeszukiwania wszystkich postów (archiwum i produkcja) oraz public.posts_archive do przeszukiwania wszystkich postów archiwalnych. Public.posts odziedziczy po post_all.
Inserty powinny iść w stary sposób (do tabeli public.posts), chyba że napiszesz wyzwalacze na posts_all w celu przekierowania wstawek do tabeli postów. Jeśli masz partycjonowanie, będzie to bardziej skomplikowane. W działającej aplikacji i przed migracją starych danych nie trzeba nic zmieniać w kodzie aplikacji, aby pracować z tym podejściem.
Utwórz archiwum schematów dla logicznej separacji. Moją sugestią będzie rozdzielenie danych archiwalnych według pewnego okresu (roku lub miesiąca), jeśli to możliwe (archive_2005).
Utwórz tabele archiwów w schemacie archiwum_rok
create table archive_2005.posts (
check(record_date >= '2005-01-01 00:00:00'::timestamp
and record_date < '2006-01-01 00:00:00'::timestamp)
) inherits (posts_archive) tablespace archive_tablesapce;
Następnie będziesz mieć nowe posty w tabeli w schemacie archive_2005, a planista postgresql będzie wiedział, że dane istnieją tylko w wyznaczonym okresie. Jeśli zapytasz o inny okres, postgresql nie będzie wyszukiwał w tej tabeli.
Utwórz funkcje / procedury / wyzwalacze, aby przenieść dane do tabel archiwum.
- Zarchiwizuj raz na pewien okres (tutaj rok) i odkurz stary stół lub zrób to automatycznie za pomocą wyzwalaczy (cięższe na autovacuum). Obie techniki mają wiele zalet i wad.
Jeśli wdrożony:
- Może osobno przesyłać kwerendy do archiwum (wybierz * z post_archive), wszystkich (wybierz * z posts_all) i danych produkcyjnych (wybierz * z public.posts)
- Można zrzucić schematy archiwum osobno i w łatwy sposób upuścić na nie kaskady. pg_dump -s archive_2005 nazwa_bazy_danych schemat upuszczenia kaskada_archiwum_2005; - bądź ostrożny, ponieważ usuwa wszystkie powiązane tabele
- Stare dane rozdzielone fizycznie według obszaru tabel i logicznie według schematu.
- Dość skomplikowana struktura do zarządzania procesem archiwizacji
- Potrafi tworzyć różne indeksy w tabelach produkcji i archiwizacji w celu optymalizacji zapytań zarówno (mniejsze i wyspecjalizowane indeksy = szybsze zapytania i mniejsze zapotrzebowanie na miejsce)
- Jeśli masz partycjonowane tabele (według roku lub miesiąca), proces archiwizacji będzie polegał na przeniesieniu całej tabeli
archive_tablespace
polegał lub po prostu zmianie jej na dziedziczenie z post_archive (nie testowałem tego)
- Jeśli nie chcesz uzyskać dostępu do starych (zarchiwizowanych) danych, nie musisz nic zmieniać w aplikacji.
To ogólna technika, którą powinieneś dostosować do swoich potrzeb. Wszelkie sugestie, aby to poprawić?
Dalsza lektura: Dziedziczenie PostgreSQL , partycjonowanie
Create tables (table posts example):
. Czy potrafisz wyjaśnić ten konkretny krok, ile jest łącznie tabel i jak dziedziczenie między tabelami jest ze sobą powiązane?posts
,posts-all
lubposts-archive
), który istnieje tylko do reprezentowania całego zestawu danych?