Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Jak utworzyć bazę i sklonować istniejącą (template)

W skrócie

  • Potrzebujesz kopii istniejącej bazy - na testy albo pod nowego klienta - i nie chcesz eksportować i importować dumpa za każdym razem.
  • Każda nowa baza w PostgreSQL i tak powstaje z szablonu, więc kopię robisz po prostu, wskazując swoją bazę jako szablon.
  • Wykonaj CREATE DATABASE kopia TEMPLATE zrodlo, upewniając się wcześniej, że do bazy-źródła nikt nie jest podłączony.

Klonowanie bazy w PostgreSQL jest zaskakująco proste, bo mechanizm szablonów jest wbudowany w samą operację tworzenia bazy. Nie musisz robić eksportu do pliku i importu z powrotem - wystarczy jedno polecenie. Trzeba tylko wiedzieć, jak to działa pod spodem i dlaczego czasem kopiowanie odmawia startu. Pokażemy, jak utworzyć zwykłą bazę i jak zrobić z niej wierną kopię gotową na testy albo jako punkt startowy pod nową instancję aplikacji.

Jak to wygląda w praktyce

Zespół chce mieć bazę testową, która wygląda dokładnie jak produkcja, ale bez ryzyka popsucia produkcji. Klasyczne podejście to pg_dump do pliku i pg_restore do nowej bazy - działa, ale przy dużej bazie trwa długo i zżera miejsce na dysku na plik pośredni. Ktoś próbuje więc skrótu przez TEMPLATE i natrafia na komunikat "source database is being accessed by other users" - kopiowanie się nie udaje, bo do bazy-źródła ktoś jest podłączony. Inny objaw to zdziwienie, skąd w ogóle biorą się bazy template0 i template1 na świeżej instalacji i czy wolno ich dotykać.

Dlaczego tak się dzieje

W PostgreSQL nie ma czegoś takiego jak tworzenie bazy z niczego. Zawsze powstaje ona jako fizyczna kopia bazy-szablonu. Domyślnie tym szablonem jest template1 - i dlatego wszystko, co dodasz do template1 (na przykład rozszerzenie), pojawi się w każdej nowej bazie. Obok istnieje nietykalny template0, czysty wzorzec, którego używa się przy odtwarzaniu, gdy chcemy bazę bez żadnych lokalnych dodatków. Skoro tworzenie bazy to kopiowanie szablonu, to nic nie stoi na przeszkodzie, żeby jako szablon wskazać własną, wypełnioną danymi bazę. Haczyk jest jeden: żeby PostgreSQL mógł zrobić spójną fizyczną kopię, do bazy-szablonu w trakcie operacji nie może być podłączona żadna sesja. Stąd błąd o innych użytkownikach - ktoś trzyma otwarte połączenie do źródła.

Jak to rozwiązać krok po kroku

  1. Zwykłą, pustą bazę utworzysz jednym poleceniem: CREATE DATABASE moja_baza;. Powstanie ona z domyślnego szablonu template1. Możesz też użyć narzędzia z powłoki: createdb moja_baza.
  2. Żeby sklonować istniejącą bazę, najpierw odłącz od niej wszystkie sesje. Sprawdź, kto jest podłączony: SELECT pid, usename, application_name FROM pg_stat_activity WHERE datname = 'zrodlo';.
  3. Rozłącz aktywne sesje do źródła, jeśli to bezpieczne: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'zrodlo' AND pid <> pg_backend_pid();. Rób to tylko na bazie, która na czas kopiowania może być wolna.
  4. Wykonaj klonowanie, wskazując swoją bazę jako szablon: CREATE DATABASE zrodlo_kopia TEMPLATE zrodlo;. PostgreSQL zrobi wierną kopię wszystkich obiektów i danych.
  5. Jeśli nowa baza ma należeć do innego właściciela, ustaw to od razu: CREATE DATABASE zrodlo_kopia TEMPLATE zrodlo OWNER klient42;. Możesz też jawnie podać kodowanie i ustawienia sortowania, gdy kopiujesz z template0.
  6. Gdy nie da się odłączyć sesji od źródła (żywa produkcja), zrezygnuj z TEMPLATE i użyj klasycznej ścieżki pg_dump plus odtworzenie do nowej bazy - ta metoda działa na działającej bazie.

Jak sprawdzić, że zadziałało

Listę baz wraz z ich właścicielami i rozmiarami zobaczysz w psql poleceniem \l+. Nowa kopia powinna być na liście i mieć rozmiar zbliżony do źródła. Żeby potwierdzić, że dane naprawdę się przeniosły, połącz się z kopią (\c zrodlo_kopia) i porównaj liczbę tabel poleceniem \dt oraz liczbę wierszy w kilku kluczowych tabelach z tym, co jest w źródle. Warto też sprawdzić, czy przeniosły się obiekty inne niż tabele - sekwencje, widoki, funkcje - bo kopia przez TEMPLATE bierze całą zawartość bazy, a nie tylko dane. Jeśli liczby się zgadzają, klon jest kompletny.

Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Szkolenie Zaawansowana administracja PostgreSQL - HA, DR, monitoring, skalowanie

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Jak sklonować istniejącą bazę bez eksportu i importu dumpa?
Użyj bazy-źródła jako szablonu: CREATE DATABASE kopia TEMPLATE zrodlo. PostgreSQL zrobi wierną fizyczną kopię wszystkich obiektów i danych. Warunek jest jeden - do bazy-źródła w trakcie kopiowania nie może być podłączona żadna sesja, inaczej operacja zwróci błąd o innych użytkownikach.
Do czego służą bazy template0 i template1?
To wbudowane wzorce, z których powstają nowe bazy. Domyślnie tworzenie bazy kopiuje template1, więc wszystko, co do niej dodasz, pojawi się w każdej nowej bazie. template0 to nietykalny, czysty wzorzec bez lokalnych dodatków, używany między innymi przy odtwarzaniu, gdy chcesz bazę bez żadnych naleciałości.
Kopiowanie przez TEMPLATE zwraca błąd o innych użytkownikach - co zrobić?
Znaczy to, że do bazy-źródła ktoś jest podłączony. Sprawdź sesje w pg_stat_activity dla tej bazy i rozłącz je, jeśli to bezpieczne, funkcją pg_terminate_backend. Jeśli źródłem jest żywa produkcja, której nie da się odłączyć, zrezygnuj z TEMPLATE i użyj pg_dump, który działa na czynnej bazie.
Czy przy klonowaniu bazy mogę od razu ustawić innego właściciela?
Tak, dodaj klauzulę OWNER: CREATE DATABASE kopia TEMPLATE zrodlo OWNER klient42. Nowa baza od razu będzie należeć do wskazanej roli. Przy tworzeniu bazy z czystego template0 możesz też jawnie podać kodowanie i ustawienia sortowania, jeśli mają się różnić od wzorca.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...