aktualizacja z Postgres 9.1 do 9.3 na serwerze Ubuntu

27

Mam mój serwer produkcyjny (ubuntu 13.10) działający z postgresql 9.1.

Chcę użyć kilku funkcji 9.3, dlatego chcę zaktualizować.

Czy ktoś może mi pomóc w aktualizacji z wersji 9.1 do wersji 9.3, aby przestój wynosił nie więcej niż 30 minut. lub tak?

Podstawową troską jest zapobieganie utracie danych lub redundancji plików.

Ram Kumar
źródło
2
Dokumenty Postgres są naprawdę dobre. google.co.uk/#q=postgres+upgrade+od+9.1+to+9.3
Philᵀᴹ
Nie jestem DBA per se (muszę dbać o dziwną instalację Postgres, a nawet odder mysql;}), a ten post jest stary, ale dlaczego miałbyś używać dowolnej wersji Ubuntu X.10 dla prod zamiast X.04 LTS?
Tink

Odpowiedzi:

28

Istnieją zasadniczo trzy sposoby uaktualnienia PostgreSQL z różnych głównych wersji (np. 9.1 do 9.3).

Aktualizacja za pomocą pg_dump

Pierwszym i zalecanym, jeśli to możliwe, jest zrzucenie starej wersji (9.1) przy użyciu pliku binarnego nowszej wersji (9.3) i przywrócenie jej w nowym klastrze utworzonym z nowszej wersji.

Podejście to jest na ogół wolniejsze, ale także najbardziej realne. Jedną wskazówką, aby przyspieszyć, jest stosowanie współbieżności. Aby zrzucić zadania równoległe, możesz:

$ pg_dump --format=directory --jobs=4 --no-synchronized-snapshots --file=/path/to/mydump mydatabase

Musisz to zrobić dla każdej bazy danych, dopasować --jobs=4wartość do dowolnej wartości (przetestuj wartości od 2 do liczby rdzeni i sprawdź, która daje większą prędkość). Ponadto w tej fazie nikt nie powinien być połączony z bazą danych, każda modyfikacja spowoduje uszkodzenie zrzutu (z powodu niezabezpieczonej opcji --no-synchronized-snapshots).

Następnie możesz przywrócić zrzut do nowej instancji za pomocą pg_restore:

$ createdb <options> -T template0 mydatabase
$ pg_restore --exit-on-error --jobs=4 --dbname=mydatabase /path/to/mydump

Następnie zaleca się uruchomienie ANALYZEw bazie danych:

$ vacuumdb --analyze-only mydatabase

(jeśli możesz sobie pozwolić na czas, biegnij tylko --analyzedo VACUUMbazy danych i zaktualizuj mapy widoczności)

Aktualizacja za pomocą pg_upgrade

Inną opcją jest użycie contribpg_upgrade . Ta --linkmetoda zapewnia naprawdę szybki sposób aktualizacji PostgreSQL.

Przed użyciem musisz wykonać kopię zapasową całego katalogu danych, ponieważ w --linktrybie, jeśli coś pójdzie nie tak, możesz stracić oba dane (nowe i stare). Przeczytaj także wszystkie dokumenty, a zwłaszcza notatki na dole (istnieją pewne ograniczenia dotyczące pg_upgrade).

AKTUALIZACJA: Użyj --checkopcji przed uruchomieniem ostatecznego polecenia. Ponadto w przypadku dużych baz danych zaleca się uruchomienie tego polecenia w sesji ekranowej.

Uaktualnij za pomocą narzędzia replikacji opartego na wyzwalaczu

Inną opcją uaktualnienia wersji jest użycie narzędzia replikacji opartego na wyzwalaczu. Jak Slony, Bucardo i Londiste.

Jest to opcja, która wymaga jak najmniej przestojów, ale jest najtrudniejsza do pracy.

Aby to zrobić, musisz zbudować master-slave, w którym master jest twoją bieżącą wersją (9.1), a slave jest nową wersją (9.3). Następnie czekasz na pierwszą synchronizację (z systemem nadal produkowanym), a następnie zamykasz wszystkich podłączonych do bazy danych (tutaj zaczyna się przestój), czekasz na nadrobienie zaległości, awansujesz (niewolnik) do opanowania i przekieruj wszystkich klientów / aplikacji do tej nowej wersji. I jesteś skończony.

Dokumentacja Slony zapewnia krok po kroku aktualizację PostgreSQL przy użyciu Slony .

Który wybrać

Cóż, jak zawsze zależy, wznawiając:

  • Zrzut + przywracanie jest najbardziej niezawodny, ale ogólnie najbardziej powolny (równoległość może dać całkiem dobre wyniki)
  • Pg_upgrade to jedna z najlepszych opcji na krótkie przestoje (jeśli możesz użyć, zobacz ograniczenia), często zajmuje to tylko kilka minut, nawet w przypadku dużych baz danych
  • Replikacja wyzwalacza jest bez wątpienia tym, który zapewnia możliwie jak najmniej przestojów (prawie zero), ale jest naprawdę trudny do osiągnięcia i polecam tylko doświadczonym osobom (zarówno na PostgreSQL, jak i narzędziu do replikacji).

Mam nadzieję, że mógłbym pomóc. Powodzenia.

MatheusOl
źródło
Czy pg_upgrade działa również z 8.4.17 do 9.3?
JohnMerlino
@JohnMerlino: tak, pg_upgrade może aktualizować z wersji 8.3 lub wyższej (zawiera 8.3, 8.4, 9.0, 9.1, 9.2, ...).
MatheusOl
„używanie pliku binarnego w nowszej wersji (9.3)” może nie być tak konieczne. Przynajmniej mam go do pracy bez robienia tego.
theicfire,
@ Theicfire to faktycznie zależy od obu wersji (starej i nowej), może działać lub nie. W rzeczywistości będzie działać w większości przypadków, z wyjątkiem niektórych komunikatów o błędach, które zwykle można zapisać ... Oficjalną procedurą jest jednak użycie pliku binarnego nowszej wersji!
MatheusOl,
Możesz być w stanie użyć pg_dumpalldo zrzucenia wszystkich baz danych za jednym razem.
Matthieu,
7

Aby zaktualizować Postgres 9.1 do 9.3, wykonaj następujące kroki:

  1. Najpierw utwórz plik /etc/apt/sources.list.d/pgdg.list z następującą zawartością dla Ubuntu:

    deb http://apt.postgresql.org/pub/repos/apt/ saucy-pgdg main 
  2. Dodaj klucz działający w następujący sposób:

     wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
  3. Zainstaluj narzędzia programistyczne z postgres:

    sudo apt-get install postgresql-9.3 postgresql-contrib-9.3 postgresql-server-dev-9.3 pgadmin3
  4. Aby potwierdzić naszą instalację, wprowadzimy „sudo pg_lsclusters” i zobaczymy uruchomione dwie wersje PostgreSQL.

  5. Zatrzymaj usługę Postgressql:

    sudo service postgresql stop
  6. Usuń domyślny klaster 9.3 utworzony przez instalację 9.3.

    sudo pg_dropcluster --stop 9.3 main
  7. Utwórz nowy klaster 9.3 z istniejącego klastra 9.1.

    sudo pg_upgradecluster 9.1 main
  8. Potwierdź, że nowy klaster się ładuje i korzystamy z PostgreSQL 9.3.

    sudo service postgresql start 9.3
  9. Jeśli wszystko działa, upuść do klastra 9.1.

    pg_dropcluster --stop 9.1 main

Aby uzyskać więcej informacji, zapoznaj się z tym linkiem

Snehal Parmar
źródło