Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
Jak utworzyć bazę i sklonować istniejącą (template)
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.
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ć.
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.
CREATE DATABASE moja_baza;. Powstanie ona z domyślnego szablonu template1. Możesz też użyć narzędzia z powłoki: createdb moja_baza.SELECT pid, usename, application_name FROM pg_stat_activity WHERE datname = 'zrodlo';.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.CREATE DATABASE zrodlo_kopia TEMPLATE zrodlo;. PostgreSQL zrobi wierną kopię wszystkich obiektów i danych.CREATE DATABASE zrodlo_kopia TEMPLATE zrodlo OWNER klient42;. Możesz też jawnie podać kodowanie i ustawienia sortowania, gdy kopiujesz z template0.pg_dump plus odtworzenie do nowej bazy - ta metoda działa na działającej bazie.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

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

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
Komentarze (0)
Brak komentarzy...