Jak uzyskać działającą i pełną kopię zapasową PostgreSQL DB i przetestować

45

Miałem nadzieję, że uda mi się uzyskać jasną odpowiedź na pytanie, jak zapewnić wykonanie pełnej kopii zapasowej Postgres, tak jak w przypadku MS SQL Server, a następnie zająć się osieroconymi użytkownikami.

Z tego, co przeczytałem, i może być źle, znalezienie dobrego bloga PostgreSQL było trudnym wyzwaniem, więc proszę polecić mi trochę, muszę dowiedzieć się, jak działa ta aplikacja, aby mieć zaufanie do moich kopii zapasowych i Slony replikacja. Miałem deweloper przywrócić kopię zapasową wziąłem od PgadminIII pośrednictwem custom, directoryoraz tarformatu podczas wybierania OIDs ale powiedział, dwie z nich nie obciążenie, tartak, ale to było tylko katalogiem, a nie danych. Jestem teraz naprawdę zdezorientowany.

  1. Korzystam z PGAdminIII, ma opcję pg_dumpi pg_dumpall. Chcę wykonać kopię zapasową wszystkiego , czego potrzebuję, aby gdzieś przetestować przywracanie tej bazy danych i sprawdzić, czy tak, wszystkie potrzebne dane i nasza kopia zapasowa są dobre. W końcu chcę napisać skrypt automatycznego przywracania, ale jeden dzień na raz.

pg_dumpallnajwyraźniej ma -globalsopcję, która ma wykonać kopię zapasową wszystkiego, ale pomoc dla pg_dumpallpokazuje, a -g, --globals-only dump only global objects, no databasesnie --globalsopcję.

Myślałem, pg_dumpallże przynajmniej stworzę kopię zapasową kluczy obcych, ale nawet to wydaje się być „opcją”. Zgodnie z dokumentacją , nawet jeśli pg_dumpallmuszę użyć -oopcji do tworzenia kopii zapasowych kluczy obcych, nie mogę sobie wyobrazić, kiedy nie chciałbym tworzyć kopii zapasowych kluczy obcych, a to byłoby bardziej sensowne jako opcja domyślna.

  1. Jak mam zająć się osieroconymi użytkownikami i sprawdzić, czy mam wszystko? Chciałbym przywrócić plik kopii zapasowej na innym serwerze i sprawdzić, czy wszystko działa. Jeśli ktoś ma jakieś sugestie, jak zrobić prawdziwą kopię zapasową w PostgreSQL i przywrócić, byłbym bardzo wdzięczny.

Miałem serwer PostgreSQL, ale nadal nie mogę zrozumieć, dlaczego aplikacja OIDdomyślnie nie tworzy kopii zapasowych ! Wydaje się, że 99,9% czasu tego chcesz.

AKTUALIZACJA 1:

Postgres'a dokumentacja wspomina, że globalsopcja Szukałem wydaje się być opcja domyślna dla tej wersji, ale nadal potrzebuje -oopcję. Jeśli ktoś może zweryfikować lub podać przykładowe polecenie przywrócenia pojedynczej bazy danych w innym miejscu ze wszystkim, czego potrzebuje, byłbym wdzięczny.

Edycja: poproszony przez witrynę o pokazanie wyjątkowości tego pytania poprzez edycję mojego pytania. To pytanie podnosi problem i zapewnia przejrzystość identyfikatorów OID w kopiach zapasowych, różnicę między globalnymi i nieglobalnymi, a także testowanie przywraca zalecenia, aby upewnić się, że kopia zapasowa jest dobra, a nie tylko sama kopia zapasowa. Dzięki odpowiedziom udało mi się wykonać kopię zapasową, dowiedzieć się o globals / oids i co noc rozpocząłem testowy proces przywracania na Postgres przy użyciu zadań cron. Dzięki za pomoc!

Ali Razeghi
źródło

Odpowiedzi:

58

Możesz zrzucić cały klaster PostgreSQL za pomocą pg_dumpall. To są wszystkie bazy danych i wszystkie globale dla jednego klastra. Z wiersza poleceń na serwerze zrobiłbym coś takiego. (Mój nasłuchuje na porcie 5433, a nie na porcie domyślnym.) Możesz - lub nie potrzebować opcji --clean.

$ pg_dumpall -U postgres -h localhost -p 5433 --clean --file=dump.sql

Obejmuje to dane globalne - informacje o użytkownikach i grupach, obszarach tabel itp.

Gdybym miał wykonać kopię zapasową pojedynczej bazy danych i przenieść ją na serwer scratch , zrzuciłbym bazę danych za pomocą pg_dump, a globalny za pomocą

  • pg_dumpall --globals-onlylub
  • pg_dumpall --roles-only (jeśli potrzebujesz tylko ról)

lubię to.

$ pg_dump -U postgres -h localhost -p 5433 --clean --file=sandbox.sql sandbox
$ pg_dumpall -U postgres -h localhost -p 5433 --clean --globals-only --file=globals.sql

Dane wyjściowe to tylko pliki tekstowe.

Po przeniesieniu tych plików na inny serwer najpierw załaduj globals, a następnie zrzut bazy danych.

$ psql -U postgres -h localhost -p 5433 < globals.sql
$ psql -U postgres -h localhost -p 5433 < sandbox.sql

Myślałem, że pg_dumpall przynajmniej utworzy kopię zapasową kluczy obcych, ale nawet to wydaje się być „opcją”. Zgodnie z: http://www.postgresql.org/docs/9.1/static/app-pg-dumpall.html nawet z pg_dumpall muszę użyć opcji -o do tworzenia kopii zapasowych kluczy obcych

Nie, w tym odwołaniu jest napisane: „Użyj tej opcji, jeśli aplikacja w jakiś sposób odwołuje się do kolumn OID (np. Z ograniczeniem klucza obcego). W przeciwnym razie ta opcja nie powinna być używana”. (Podkreślenie dodane.) Myślę, że jest mało prawdopodobne, aby twoja aplikacja odwoływała się do kolumn OID. Nie musisz używać tej opcji do tworzenia kopii zapasowych kluczy obcych. (Przeczytaj plik zrzutu w edytorze lub przeglądarce plików).

Mike Sherrill „Cat Recall”
źródło
3
Czy w wierszu, w którym importowany jest sandbox.sql, nie ma nazwy bazy danych? psql -U postgres -h localhost -p 5433 sandbox < sandbox.sql
SebK
Widzi, że pg_dumpallwersja 9.5 nie działa poprawnie z NULLwartościami podczas używania COPY. Otrzymuję wiele takich błędów: psql:/tmp/dumpall.sql:4133559: invalid command \N psql:/tmp/dumpall.sql:4133560: invalid command \.Podczas importowania z powrotem do Postgres 10 przy użyciupsql -f /tmp/dumpall.sql
piotrekkr