Chciałbym podzielić tabelę z 1M + wierszy według zakresu dat. Jak to się zwykle robi, nie wymagając dużo przestojów lub ryzyka utraty danych? Oto strategie, które rozważam, ale są otwarte na sugestie:
Istniejący stół jest wzorcem, a dzieci dziedziczą po nim. Z biegiem czasu przenoszą dane z głównego na potomne, ale przez pewien czas niektóre dane znajdą się w głównej tabeli, a niektóre w potomnych.
Utwórz nowe tabele główne i podrzędne. Utwórz kopię danych w istniejącej tabeli w tabelach podrzędnych (więc dane będą znajdować się w dwóch miejscach). Gdy tabele potomne będą miały najnowsze dane, zmień wszystkie wstawki, aby wskazać nową tabelę główną, i usuń istniejącą tabelę.
postgresql
optimization
partitioning
Evan Appleby
źródło
źródło
DELETE FROM ONLY master_table
jest rozwiązaniem.Odpowiedzi:
Ponieważ nr 1 wymaga kopiowania danych z wzorca do dziecka, gdy jest ono w aktywnym środowisku produkcyjnym, osobiście poszedłem z rozdz. 2 (tworzenie nowego wzorca). Zapobiega to zakłóceniom oryginalnej tabeli, gdy jest ona aktywnie używana, a jeśli występują jakiekolwiek problemy, mogę łatwo usunąć nowy wzorzec bez problemów i kontynuować korzystanie z oryginalnej tabeli. Oto kroki, aby to zrobić:
Utwórz nowy stół główny.
Twórz dzieci dziedziczące od mistrza.
Skopiuj wszystkie dane historyczne do nowej tabeli głównej
Tymczasowo wstrzymaj nowe wstawki / aktualizacje produkcyjnej bazy danych
Skopiuj najnowsze dane do nowej tabeli głównej
Zmień nazwy tabel, aby new_master stał się produkcyjną bazą danych.
Dodaj funkcję instrukcji INSERT do old_master, aby dane były przekazywane do właściwej partycji.
Dodaj wyzwalacz, aby funkcja była wywoływana na WSTAWKI
Ustaw wykluczenie ograniczenia na WŁ
Ponownie włącz AKTUALIZACJE i WSTAWKI w produkcyjnej bazie danych
Skonfiguruj wyzwalacz lub cron, aby utworzyć nowe partycje i zaktualizować funkcję w celu przypisania nowych danych do poprawnej partycji. W tym artykule znajdują się przykłady kodu
Usuń old_master_backup
źródło
vacuum
brakiem nadrabiania zaległości lub zapobieganiem im z powodu sesji „bezczynności w transakcji”.Istnieje nowe narzędzie o nazwie pg_pathman ( https://github.com/postgrespro/pg_pathman ), które zrobi to za Ciebie automatycznie.
Zrobiłoby to coś takiego.
źródło