Zastanawiam się nad zmianą sposobu wykonywania kopii zapasowych i zastanawiam się, czy istnieje sposób ustalenia, które bazy danych w klastrze postgreql nie zostały ostatnio zmienione?
Zamiast używać pg_dumpall, chciałbym użyć pg_dump i zrzucić tylko te bazy danych, które zmieniły się od czasu ostatniej kopii zapasowej (niektóre bazy danych nie są aktualizowane bardzo często) - chodzi o to, że jeśli nic się nie zmieni, to bieżąca kopia zapasowa powinna wciąż bądź dobry.
Czy ktoś zna sposób ustalenia, kiedy konkretna baza danych była ostatnio aktualizowana / zmieniana?
Dzięki...
Aktualizacja:
Miałem nadzieję, że nie będę musiał pisać wyzwalaczy wszędzie, ponieważ nie mam kontroli nad tworzeniem baz danych w jednym konkretnym klastrze (nie mówiąc już o tworzeniu obiektów db w bazie danych).
Kopiąc dalej, wygląda na to, że istnieje korelacja między zawartością pliku $ PGDATA / global / pg_database (konkretnie drugim polem) a nazwami katalogów w $ PGDATA / base.
Wychodząc z kończyny, zgaduję, że drugie pole pliku pg_database to oid bazy danych i że każda baza danych ma swój własny podkatalog w katalogu $ PGDATA / base (z oid dla nazwy podkatalogu). Czy to jest poprawne? Jeśli tak, czy uzasadnione jest użycie znaczników czasowych plików z plików w katalogu $ PGDATA / base / * jako wyzwalacza potrzebnego do utworzenia kopii zapasowej?
...Czy jest jakiś lepszy sposób?
Dzięki jeszcze raz...
źródło
Odpowiedzi:
Podczas używania
select datname, xact_commit from pg_stat_database;
zgodnie z sugestią @Jack Douglas nie całkiem działa (najwyraźniej z powodu autovacuum),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
wydaje się działać. Zarówno zmiany DML, jak i DDL zmienią wartości kolumn tup_ *, podczas gdy avacuum
nie (vacuum analyze
z drugiej strony ...).Przy okazji, że może to być przydatne dla innych, dołączam skrypt kopii zapasowej, który zainstalowałem. Działa to dla Pg 8.4.x, ale nie dla 8.2.x - YMMV w zależności od użytej wersji Pg.
Aktualizacja: skrypt został umieszczony na github tutaj .
źródło
Wygląda na to, że możesz użyć
pg_stat_database
do uzyskania liczby transakcji i sprawdzenia, czy zmieni się to z jednego uruchomienia kopii zapasowej do następnego:Jeśli ktoś zadzwonił
pg_stat_reset
, nie możesz być pewien, czy db zmienił się, czy nie, ale możesz uznać to za mało prawdopodobne, aby tak się stało, a następnie dokładnie taką liczbę transakcji, która odpowiada Twojemu ostatniemu odczytowi.--EDYTOWAĆ
zobacz to SO pytanie, dlaczego to może nie działać. Nie jestem pewien, dlaczego tak się dzieje, ale włączenie rejestrowania może rzucić nieco światła ...
źródło
pg_stat_reset
prawdopodobieństwo, że wartość xact_commit pasuje do poprzedniego, może być całkiem niskie, nie? Tak więc z pewnością wygląda to na złapanie istnienia zmian DML. Teraz muszę tylko złapać, jeśli nastąpiły zmiany DDL.create table ...
wydaje się, że szybki test zwiększa xact_commit.Z kopania po dokumentach postgres i grupach dyskusyjnych:
txid_current()
da ci nowąxid
- jeśli wywołasz tę funkcję ponownie później, jeśli dostanieszxid
jedną wyższą, wiesz, że między dwiema rozmowami nie zostały popełnione żadne transakcje. Możesz jednak otrzymać fałszywe alarmy - np. Jeśli ktoś zadzwonitxid_current()
źródło
Zapamiętaj znacznik czasu w swoich plikach zawierających dane DB i sprawdź, czy się zmieniły. Jeśli tak, to jest napis.
Edytuj po podpowiedzi WAL: Powinieneś to zrobić tylko po wyczyszczeniu zaległych zapisów.
źródło
Postgresql 9.5 pozwala nam śledzić ostatnią modyfikowaną sygnaturę czasową sprawdź ten link https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html
źródło