Backup, restore i podstawowa konserwacja: ochrona danych PostgreSQL

Witaj z powrotem.
W poprzedniej lekcji nauczyłeś się, jak PostgreSQL łączy się z prawdziwymi aplikacjami.
Poznałeś:
- host;
- port;
- nazwę bazy danych;
- username;
- password;
- connection string;
- zmienne środowiskowe;
- pliki
.env; - użytkowników aplikacyjnych;
- uprawnienia;
- nazwy hostów w Dockerze;
- typowe błędy połączenia.
Bardzo dobrze.
Teraz twoja baza danych może pracować z prawdziwymi aplikacjami.
To potężne.
Ale moc oznacza odpowiedzialność.
I czasem panikę.
Bo gdy aplikacja zaczyna przechowywać prawdziwe dane, jedno pytanie staje się bardzo ważne:
Co się stanie, jeśli coś pójdzie źle?
Tabela zostanie usunięta.
Serwer się zawiesi.
Zła migracja zostanie uruchomiona.
Programista wpisze DELETE bez WHERE.
Laptop umrze.
Dysk padnie.
Ktoś powie:
Zmieniłem tylko jedną małą rzecz.
Bardzo niebezpieczne zdanie.
Dzisiaj nauczymy się backupów, restore i podstawowej konserwacji.
To nie jest najbardziej glamour część baz danych.
Nikt nie otwiera kursu PostgreSQL i nie mówi:
Nie mogę się doczekać strategii backupów.
Ale backupy są nudne tylko do dnia, w którym ich potrzebujesz.
Wtedy stają się piękne.
Jak spadochron.
Mało ekscytujący podczas normalnego spaceru.
Bardzo ważny podczas spadania.
Czego się nauczysz
W tej lekcji nauczysz się:
- dlaczego backupy są ważne;
- co robi
pg_dump; - jak stworzyć prosty backup SQL;
- jak przywrócić prosty backup SQL;
- jak stworzyć backup w formacie custom;
- jak przywracać za pomocą
pg_restore; - jak zrobić backup jednej bazy danych;
- jak przywrócić backup do nowej bazy;
- dlaczego testowanie backupów ma znaczenie;
- podstawowej strategii backupów;
- co robi
VACUUM; - co robi
ANALYZE; - co robi
REINDEX; - podstawowych nawyków konserwacji;
- typowych błędów z backupami.
Pod koniec tej lekcji zrozumiesz, jak chronić swoje dane PostgreSQL.
Bo tworzenie danych jest dobre.
Używanie danych jest przydatne.
Utrata danych buduje charakter.
Ale spróbujmy uniknąć zbyt dużego budowania charakteru.
Dlaczego backupy są ważne
Backup to kopia twojej bazy danych, której możesz użyć, jeśli coś pójdzie źle.
Prosta idea.
Bardzo ważna.
Bez backupów utrata danych może być trwała.
Przykłady problemów:
Ktoś przypadkowo usuwa wiersze.
Migracja psuje tabele.
Dysk serwera się psuje.
Baza danych zostaje uszkodzona.
Zły command usuwa tabelę.
Deploy idzie źle.
Baza produkcyjna zostaje nadpisana.
Niektóre z tych sytuacji brzmią dramatycznie.
Niektóre brzmią głupio.
W prawdziwym życiu zdarzają się obie.
Komputery zawodzą.
Ludzie zawodzą.
Programiści zawodzą kreatywnie.
Backup daje ci drogę powrotu.
To nie magia.
Ale to nadzieja w formie pliku.
Backup nie jest prawdziwy, dopóki restore nie działa
Bardzo ważna zasada:
Backup, którego nigdy nie testowałeś, jest tylko teorią.
Możesz mieć plik backupu.
Ale czy potrafisz go przywrócić?
Czy zawiera dane, których oczekujesz?
Czy jest kompletny?
Czy nie jest zbyt stary?
Czy wymaga hasła, którego zapomniałeś?
Czy przywraca się do działającej bazy danych?
Jeśli tego nie wiesz, nie masz naprawdę strategii backupu.
Masz talizman szczęścia.
A PostgreSQL nie jest pod wrażeniem talizmanów szczęścia.
Dlatego pamiętaj:
Backup to krok pierwszy.
Test restore to krok drugi.
Oba są ważne.
Przygotowanie bazy demo
Otwórz PostgreSQL:
sudo -iu postgres psql
Utwórz bazę demo:
CREATE DATABASE backup_demo_db;
Połącz się z nią:
\c backup_demo_db
Utwórz tabelę:
CREATE TABLE notes (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Wstaw trochę danych:
INSERT INTO notes (title, content)
VALUES
('First Note', 'This is the first note.'),
('Backup Note', 'This row should survive backup and restore.'),
('PostgreSQL Note', 'Databases remember things. Sometimes too well.');
Sprawdź dane:
SELECT * FROM notes;
Teraz mamy małą bazę danych do backupu.
Nie są to bardzo ważne dane.
Ale dobre do praktyki.
Ćwicz na fałszywych danych.
Nie na produkcji.
Produkcja to nie plac zabaw.
Produkcja to miejsce, gdzie małe błędy noszą drogie buty.
Czym jest pg_dump?
pg_dump to narzędzie PostgreSQL, które tworzy backup bazy danych.
Może eksportować:
strukturę tabel
dane
indeksy
constrainty
sekwencje
obiekty bazy danych
Domyślnie nie robi backupu całego serwera PostgreSQL.
Robi backup jednej bazy danych.
Podstawowa idea:
pg_dump czyta bazę danych i zapisuje plik backupu.
pg_dump uruchamiasz z terminala.
Nie wewnątrz psql.
To ważne.
Wewnątrz psql piszesz komendy SQL.
W terminalu uruchamiasz narzędzia takie jak:
pg_dump
psql
createdb
dropdb
pg_restore
Różne miejsca.
Różne narzędzia.
Ta sama bazodanowa przygoda.
Tworzenie prostego backupu SQL
Najpierw wyjdź z psql:
\q
Teraz uruchom to z terminala:
pg_dump -U postgres -d backup_demo_db > backup_demo_db.sql
To tworzy plik:
backup_demo_db.sql
To jest prosty backup SQL.
Zawiera komendy SQL, które mogą odtworzyć strukturę i dane bazy.
Możesz go sprawdzić:
less backup_demo_db.sql
Możesz zobaczyć komendy typu:
CREATE TABLE
COPY
ALTER TABLE
CREATE SEQUENCE
Prosty backup SQL jest czytelny dla człowieka.
To miłe.
Można go przywrócić za pomocą psql.
Proste.
Przydatne.
Bardzo dobre dla początkujących.
Backup z hostem i portem
Czasem trzeba podać host i port:
pg_dump -h localhost -p 5432 -U postgres -d backup_demo_db > backup_demo_db.sql
To oznacza:
-h localhost połącz się z localhost
-p 5432 użyj portu 5432
-U postgres połącz się jako użytkownik postgres
-d backup_demo_db zrób backup tej bazy
Jeśli używasz użytkownika aplikacyjnego, zamień postgres na tego użytkownika.
Przykład:
pg_dump -h localhost -p 5432 -U app_user -d app_db > app_db.sql
Użytkownik musi mieć prawo odczytu bazy danych.
PostgreSQL nie może zrobić backupu tego, czego użytkownik nie może zobaczyć.
Bardzo sprawiedliwe.
Bardzo surowe.
Bardzo PostgreSQL.
Przywracanie prostego backupu SQL
Teraz przywróćmy backup do nowej bazy danych.
Utwórz nową bazę:
createdb -U postgres backup_demo_restore_db
Teraz przywróć:
psql -U postgres -d backup_demo_restore_db < backup_demo_db.sql
To czyta plik SQL i wykonuje go w nowej bazie danych.
Teraz połącz się:
psql -U postgres -d backup_demo_restore_db
Sprawdź dane:
SELECT * FROM notes;
Powinieneś zobaczyć wiersze.
Dobrze.
Utworzyłeś backup.
Przywróciłeś go.
Przetestowałeś go.
To właściwa droga.
Backup bez testu restore to teatr pewności.
Test restore to rzeczywistość.
Rzeczywistość ma znaczenie.
Irytujące, ale prawdziwe.
Przykład DROP i restore
Zasymulujmy katastrofę.
Połącz się z przywróconą bazą:
psql -U postgres -d backup_demo_restore_db
Usuń tabelę:
DROP TABLE notes;
Teraz sprawdź:
SELECT * FROM notes;
PostgreSQL będzie narzekał:
relation "notes" does not exist
Bardzo smutne.
Bardzo edukacyjne.
Wyjdź:
\q
Przywróć ponownie:
psql -U postgres -d backup_demo_restore_db < backup_demo_db.sql
Jeśli tabela już istnieje, możesz dostać błędy, chyba że backup zawiera komendy usuwania.
Dla czystszego ćwiczenia możesz odtworzyć bazę:
dropdb -U postgres backup_demo_restore_db
createdb -U postgres backup_demo_restore_db
psql -U postgres -d backup_demo_restore_db < backup_demo_db.sql
Potem sprawdź ponownie:
psql -U postgres -d backup_demo_restore_db
SELECT * FROM notes;
Dane wróciły.
To jest magiczne uczucie backupów.
Nie prawdziwa magia.
Coś lepszego.
Przetestowana procedura.
Tworzenie backupu z --clean
Możesz stworzyć backup, który zawiera komendy usuwania istniejących obiektów przed ich ponownym utworzeniem.
Przykład:
pg_dump -U postgres --clean --if-exists -d backup_demo_db > backup_demo_clean.sql
Opcje:
--clean dodaje komendy DROP
--if-exists unika błędów, jeśli obiekty nie istnieją
To może ułatwić przywracanie na istniejącą bazę.
Ale uważaj.
Backup z komendami DROP może usuwać istniejące obiekty podczas restore.
Może właśnie tego chcesz.
Albo może to być sposób, w jaki twój dzień staje się bardzo ekscytujący.
Zawsze wiedz, co robi twój plik backupu.
Pliki SQL nie są dekoracją.
One się wykonują.
PostgreSQL słucha.
Wsparcie emocjonalne nie jest dołączone.
Backup w formacie custom
PostgreSQL obsługuje też backupy w formacie custom.
Utwórz taki backup:
pg_dump -U postgres -F c -d backup_demo_db -f backup_demo_db.dump
Tutaj:
-F c format custom
-f nazwa_pliku plik wyjściowy
To tworzy:
backup_demo_db.dump
Ten plik nie jest zwykłym czytelnym SQL-em.
Ale jest elastyczny.
Przywraca się go za pomocą pg_restore.
Format custom jest przydatny, bo możesz:
przywracać wybrane tabele
przywracać z większą liczbą opcji
używać równoległego restore w większych przypadkach
wyświetlać zawartość backupu
W wielu prawdziwych projektach format custom jest dobrym wyborem.
Mniej czytelny.
Bardziej potężny.
Jak skompresowana skrzynka narzędziowa dla bazy danych.
Przywracanie backupu custom
Utwórz nową bazę danych:
createdb -U postgres backup_demo_custom_restore_db
Przywróć za pomocą pg_restore:
pg_restore -U postgres -d backup_demo_custom_restore_db backup_demo_db.dump
Teraz połącz się:
psql -U postgres -d backup_demo_custom_restore_db
Sprawdź dane:
SELECT * FROM notes;
Powinieneś zobaczyć dane.
Dobrze.
Teraz znasz oba style:
prosty backup SQL -> restore przez psql
backup custom -> restore przez pg_restore
Prosta zasada.
Bardzo przydatna.
Prosty SQL vs format custom
Prosty backup SQL:
pg_dump -U postgres -d backup_demo_db > backup_demo_db.sql
Restore:
psql -U postgres -d new_db < backup_demo_db.sql
Dobry do:
prostych backupów
nauki
plików czytelnych dla człowieka
małych baz danych
łatwego sprawdzania
Backup w formacie custom:
pg_dump -U postgres -F c -d backup_demo_db -f backup_demo_db.dump
Restore:
pg_restore -U postgres -d new_db backup_demo_db.dump
Dobry do:
większych baz danych
bardziej elastycznego restore
przywracania wybranych obiektów
workflow bliższego produkcji
Oba są przydatne.
Nie zamieniaj tego w wojnę religijną.
Bazy danych i tak mają wystarczająco dramatu.
Wyświetlanie zawartości backupu custom
Możesz sprawdzić backup custom:
pg_restore -l backup_demo_db.dump
To pokazuje, co znajduje się w backupie.
Możesz zobaczyć tabele, sekwencje, constrainty i sekcje danych.
To przydatne, jeśli chcesz zrozumieć, co zawiera backup.
Bo “mam nadzieję, że tam jest tabela” to nie strategia.
Sprawdź.
Zweryfikuj.
Potem śpij spokojniej.
Może.
Nazwy plików backupu
Używaj jasnych nazw plików.
Źle:
backup.sql
new_backup.sql
backup_final.sql
backup_final_REAL.sql
backup_please_work.sql
Dobrze:
backup_demo_db_2026-05-03.sql
shop_db_2026-05-03_22-30.dump
portfolio_db_before_migration_2026-05-03.dump
Uwzględnij:
nazwę bazy danych
datę
czas, jeśli przydatny
powód, jeśli przydatny
Przykład:
pg_dump -U postgres -F c -d shop_db -f shop_db_2026-05-03.dump
Dobre nazwy oszczędzają mózg.
Złe nazwy tworzą archeologię.
A nikt nie chce wykopywać plików backupu o 2 w nocy.
Kompresowanie prostego backupu SQL
Proste backupy SQL mogą być duże.
Możesz je skompresować:
pg_dump -U postgres -d backup_demo_db | gzip > backup_demo_db.sql.gz
Przywracanie skompresowanego backupu:
gunzip -c backup_demo_db.sql.gz | psql -U postgres -d backup_demo_restore_db
To przydatne do oszczędzania miejsca na dysku.
Ale pamiętaj:
Skompresowane pliki też trzeba testować.
Skompresowany zepsuty backup nadal jest zepsuty.
Tylko mniejszy.
Bardzo efektywny smutek.
Backup przed niebezpiecznymi zmianami
Przed ryzykownymi operacjami stwórz backup.
Przykłady ryzykownych operacji:
duża migracja
usuwanie kolumn
zmiana typów danych
masowy update
masowy delete
przebudowa schematu
deploy na produkcji
import danych zewnętrznych
Przykład backupu:
pg_dump -U postgres -F c -d shop_db -f shop_db_before_migration_2026-05-03.dump
Potem wykonaj niebezpieczną zmianę.
Jeśli coś pójdzie źle, masz punkt powrotu.
To profesjonalne.
To spokojne.
To sposób, żeby nie robić historii bazy danych w złym znaczeniu.
Niebezpieczny przykład DELETE
To jest niebezpieczne:
DELETE FROM customers;
Usuwa wszystkie wiersze z customers.
Może miałeś na myśli:
DELETE FROM customers
WHERE id = 5;
Mała różnica.
Ogromny rezultat.
Przed wykonywaniem niebezpiecznych komend używaj transakcji, kiedy to możliwe:
BEGIN;
Wykonaj komendę:
DELETE FROM customers
WHERE id = 5;
Sprawdź:
SELECT * FROM customers;
Jeśli jest dobrze:
COMMIT;
Jeśli jest źle:
ROLLBACK;
Transakcje mogą uratować cię przed niektórymi błędami.
Backupy mogą uratować cię przed większymi błędami.
Oba są przydatne.
Jak pasy bezpieczeństwa i poduszki powietrzne.
Nie wybieraj tylko jednego, bo czujesz się odważny.
Podstawowa strategia backupów
Prosta strategia backupu powinna odpowiadać na pytania:
Jak często robimy backup?
Gdzie przechowujemy backupy?
Jak długo je trzymamy?
Kto ma dostęp do backupów?
Jak robimy restore?
Czy testowaliśmy restore?
Dla małego projektu możesz robić:
backup codzienny
trzymać ostatnie 7 backupów dziennych
trzymać backup tygodniowy przez 1 miesiąc
przechowywać backupy poza serwerem
regularnie testować restore
Dla poważniejszych projektów potrzebny jest mocniejszy plan.
Ale nawet prosty przetestowany plan jest dużo lepszy niż:
Myślę, że provider serwera coś ma.
Może ma.
Może nie.
Może to kosztuje dodatkowo.
Może nigdy nie zostało włączone.
Może przywraca cały serwer, ale nie tę jedną bazę, której potrzebujesz.
Sprawdź.
Nie zakładaj.
Założenie jest kuzynem katastrofy.
Przechowywanie backupów w bezpiecznym miejscu
Jeśli baza danych i backup są na tym samym serwerze, a serwer padnie, możesz stracić oba.
Źle.
Lepsze miejsca na backupy:
inny serwer
zewnętrzny storage
bezpieczny cloud storage
szyfrowany storage backupów
kopia offline dla ważnych danych
Minimum to unikanie sytuacji, w której jedyny backup leży obok oryginalnej bazy.
To jak trzymanie zapasowego klucza do domu w płonącym domu.
Technicznie zapasowy.
Praktycznie niezbyt pomocny.
Ochrona plików backupu
Backupy zawierają dane.
Czasem dane wrażliwe.
To oznacza, że pliki backupu muszą być chronione.
Zasady:
nie wystawiaj backupów publicznie
ogranicz dostęp
używaj mocnych uprawnień
rozważ szyfrowanie
bezpiecznie usuwaj stare backupy
nie wysyłaj dumpów bazy mailem bezmyślnie
Backup bazy danych może być tak samo wrażliwy jak działająca baza.
Czasem bardziej.
Bo ludzie zapominają, że istnieje.
Atakujący nie zapominają.
Bardzo niegrzeczne z ich strony.
Ale prawdziwe.
Podstawowa konserwacja: VACUUM
PostgreSQL używa systemu, w którym zaktualizowane i usunięte wiersze zostawiają stare wersje wierszy.
To część sposobu, w jaki PostgreSQL obsługuje współbieżność.
Bardzo sprytne.
Ale oznacza to, że PostgreSQL potrzebuje sprzątania.
To sprzątanie nazywa się:
VACUUM
Uruchom:
VACUUM;
To czyści martwe wiersze w aktualnej bazie danych.
Większość instalacji PostgreSQL ma włączony autovacuum.
Autovacuum działa automatycznie.
Dobrze.
Bo ręczne pamiętanie o wszystkim to sposób, w jaki ludzie przegrywają.
Mimo to warto wiedzieć, co robi VACUUM.
Pomaga PostgreSQL utrzymywać tabele w dobrym stanie.
Jak sprzątanie warsztatu.
Nie glamour.
Bardzo potrzebne.
VACUUM ANALYZE
Możesz uruchomić:
VACUUM ANALYZE;
To robi dwie rzeczy:
VACUUM czyści martwe wersje wierszy.
ANALYZE aktualizuje statystyki planera.
Statystyki planera pomagają PostgreSQL wybierać dobre plany zapytań.
Jeśli statystyki są nieaktualne, PostgreSQL może podejmować złe decyzje.
Na przykład użyć złego indeksu.
Albo skanować za dużo.
Albo ogólnie zachowywać się jak zagubiony księgowy.
ANALYZE pomaga PostgreSQL lepiej rozumieć dane.
Baza z aktualnymi statystykami to szczęśliwsza baza.
Prawdopodobnie.
PostgreSQL się nie uśmiecha.
Ale wydajność może się poprawić.
Samo ANALYZE
Możesz uruchomić:
ANALYZE;
To aktualizuje statystyki bez vacuum.
Możesz też analizować jedną tabelę:
ANALYZE products;
To przydatne po dużych zmianach danych.
Przykład:
zaimportowano wiele wierszy
usunięto wiele wierszy
zaktualizowano wiele wierszy
zmienił się rozkład danych
PostgreSQL używa statystyk, żeby decydować, jak wykonać zapytania.
Złe statystyki mogą dawać złe plany.
Złe plany dają wolne zapytania.
Wolne zapytania dają smutnych programistów.
Łańcuch jest jasny.
REINDEX
Indeksy czasem mogą się rozrosnąć albo wymagać przebudowy.
PostgreSQL ma:
REINDEX
Przykład:
REINDEX DATABASE backup_demo_db;
Albo jeden indeks:
REINDEX INDEX index_name;
Albo jedną tabelę:
REINDEX TABLE table_name;
Nie uruchamiaj REINDEX losowo co pięć minut.
To nie mycie zębów.
Używaj go wtedy, gdy jest potrzebny.
Dla początkujących wystarczy wiedzieć:
REINDEX przebudowuje indeksy.
W prawdziwej konserwacji trzeba rozumieć, dlaczego to robisz.
Ślepa konserwacja nadal jest ślepa.
Nawet jeśli nosi poważny kapelusz.
Sprawdzanie rozmiaru bazy danych
Możesz sprawdzić rozmiar bazy danych:
SELECT pg_size_pretty(pg_database_size('backup_demo_db'));
Sprawdź rozmiary tabel:
SELECT
relname AS table_name,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
To pomaga zrozumieć, co zajmuje miejsce.
Czasem największa tabela jest oczekiwana.
Czasem to tabela logów, której nikt nie sprzątał przez trzy lata.
Bazy danych zbierają historię.
Czasem zbyt dużo historii.
Jak szuflada pełna starych kabli.
Sprawdzanie aktywnych połączeń
Możesz zobaczyć aktywne połączenia:
SELECT
pid,
usename,
datname,
state,
query
FROM pg_stat_activity;
To pokazuje, kto jest połączony i co robi.
Przydatne do debugowania.
Może aplikacja ma za dużo połączeń.
Może zapytanie się zawiesiło.
Może ktoś otworzył psql i poszedł na obiad.
PostgreSQL wie.
PostgreSQL pamięta.
PostgreSQL ocenia w ciszy.
Znajdowanie wolnych zapytań
PostgreSQL może logować wolne zapytania, jeśli jest tak skonfigurowany.
Typowe ustawienie to:
log_min_duration_statement
Przykładowa idea:
loguj zapytania wolniejsze niż 1000 ms
Zwykle konfiguruje się to w plikach konfiguracyjnych PostgreSQL.
Dla początkujących ważna idea brzmi:
Wolne zapytania trzeba obserwować, a nie zgadywać.
Używaj narzędzi takich jak:
EXPLAIN ANALYZE
logi
monitoring
pg_stat_statements
pg_stat_statements to rozszerzenie, które pomaga śledzić wydajność zapytań.
To bardziej zaawansowane.
Ale dobrze wiedzieć, że istnieje.
Praca nad wydajnością bez obserwacji to astrologia baz danych.
A astrologii baz danych już nie ufamy.
Checklist backupów i konserwacji
Prosta checklist:
Twórz regularne backupy.
Przechowuj backupy poza serwerem bazy danych.
Chroń pliki backupów.
Testuj restore.
Rób backup przed migracjami.
Używaj użytkowników aplikacyjnych.
Aktualizuj PostgreSQL.
Monitoruj miejsce na dysku.
Obserwuj wolne zapytania.
Pozwól działać autovacuum.
Uruchamiaj ANALYZE po dużych importach, jeśli trzeba.
Dokumentuj kroki restore.
Dokumentacja ma znaczenie.
Procedura restore nie powinna żyć tylko w twojej głowie.
Zwłaszcza jeśli twoja głowa jest zmęczona.
Albo na wakacjach.
Albo pije kawę, gdy produkcja płonie.
Zapisz kroki.
Przyszły ty zasługuje na litość.
Typowe błędy z backupami
Nigdy nie testować restore
To największy błąd.
Sam plik backupu nie wystarczy.
Musisz wiedzieć, że da się go przywrócić.
Testuj restore na innej bazie danych.
Przykład:
createdb -U postgres restore_test_db
pg_restore -U postgres -d restore_test_db shop_db_2026-05-03.dump
Potem sprawdź dane.
Ufaj, ale sprawdzaj.
A właściwie przy backupach:
Nie ufaj.
Sprawdzaj.
Trzymanie backupów tylko na tym samym serwerze
Jeśli serwer padnie, możesz stracić bazę i backup razem.
Źle.
Przechowuj kopie gdzie indziej.
Backup powinien przetrwać awarię oryginalnej maszyny.
O to właśnie chodzi.
Robienie backupów zbyt rzadko
Jeśli robisz backup raz w miesiącu, możesz stracić miesiąc danych.
Może to akceptowalne dla zabawkowego projektu.
Nieakceptowalne dla prawdziwego sklepu.
Wybierz częstotliwość backupów na podstawie tego, ile danych możesz stracić.
To pytanie ma poważną nazwę:
Recovery Point Objective
Prosta wersja:
Jaka utrata danych jest akceptowalna?
Jeśli odpowiedź brzmi “prawie żadna”, potrzebujesz poważnej strategii.
Nie wiedzieć, ile trwa restore
Backup może istnieć.
Ale restore może trwać.
Dla małych baz może to być kilka sekund.
Dla ogromnych baz może to być kilka godzin.
Jeśli aplikacja nie działa, czas restore ma znaczenie.
To pytanie ma inną poważną nazwę:
Recovery Time Objective
Prosta wersja:
Jak długo system może być offline?
Tutaj ludzie biznesu nagle zaczynają bardzo interesować się bazami danych.
Ciekawe, jak to działa.
Robienie backupu złej bazy danych
Klasyczny błąd.
Myślisz, że zrobiłeś backup produkcji.
A naprawdę zrobiłeś backup lokalnego developmentu.
Backup zawiera trzech testowych użytkowników i produkt nazwany “banana”.
Sprawdź:
SELECT current_database();
Sprawdź nazwy plików backupu.
Sprawdź wynik restore.
Nie zakładaj.
Praktyka
Utwórz backup backup_demo_db:
pg_dump -U postgres -d backup_demo_db > backup_demo_db.sql
Utwórz bazę do restore:
createdb -U postgres backup_demo_restore_db
Przywróć:
psql -U postgres -d backup_demo_restore_db < backup_demo_db.sql
Sprawdź:
psql -U postgres -d backup_demo_restore_db
SELECT * FROM notes;
Utwórz backup custom:
pg_dump -U postgres -F c -d backup_demo_db -f backup_demo_db.dump
Utwórz kolejną bazę do restore:
createdb -U postgres backup_demo_custom_restore_db
Przywróć:
pg_restore -U postgres -d backup_demo_custom_restore_db backup_demo_db.dump
Sprawdź:
psql -U postgres -d backup_demo_custom_restore_db
SELECT * FROM notes;
Uruchom konserwację:
VACUUM ANALYZE;
Sprawdź rozmiar bazy danych:
SELECT pg_size_pretty(pg_database_size(current_database()));
To praktyczne.
To nie glamour.
To przydatne.
Jak dobry śrubokręt.
Znowu.
Bazy danych lubią śrubokręty.
Metaforycznie.
Mini wyzwanie
Stwórz plan backupu dla małej bazy bloga.
Załóż:
nazwa bazy: blog_app_db
dane zmieniają się codziennie
blog jest mały
utrata więcej niż jednego dnia danych jest zła
deploy robisz co tydzień
Napisz prosty plan backupu:
Częstotliwość backupu:
Format backupu:
Lokalizacja backupu:
Retencja:
Częstotliwość testu restore:
Backup przed migracjami:
Kto ma dostęp do backupów:
Przykładowa odpowiedź:
Częstotliwość backupu: codziennie
Format backupu: format custom przez pg_dump -F c
Lokalizacja backupu: zewnętrzny bezpieczny storage
Retencja: trzymać backupy dzienne przez 7 dni i tygodniowe przez 1 miesiąc
Częstotliwość testu restore: raz w miesiącu
Backup przed migracjami: zawsze
Kto ma dostęp do backupów: tylko administrator
Teraz utwórz komendę backupu:
pg_dump -U postgres -F c -d blog_app_db -f blog_app_db_2026-05-03.dump
Utwórz komendę testowego restore:
createdb -U postgres blog_app_restore_test_db
pg_restore -U postgres -d blog_app_restore_test_db blog_app_db_2026-05-03.dump
Potem napisz zapytanie kontrolne:
SELECT COUNT(*) FROM posts;
Tak zaczynasz myśleć jak ktoś odpowiedzialny za dane.
Trochę straszne.
Bardzo przydatne.
Bardzo dorosłe.
Podsumowanie
Dzisiaj nauczyłeś się:
- backupy chronią dane przed błędami i awariami;
pg_dumptworzy backupy PostgreSQL;- proste backupy SQL można przywracać przez
psql; - backupy custom można przywracać przez
pg_restore; - pliki backupów powinny mieć jasne nazwy;
- skompresowane backupy mogą oszczędzać miejsce;
- backupy trzeba przechowywać bezpiecznie;
- backupy trzeba chronić jak dane wrażliwe;
- testowanie restore jest konieczne;
- rób backup przed niebezpiecznymi migracjami albo dużymi zmianami;
VACUUMczyści martwe wersje wierszy;ANALYZEaktualizuje statystyki planera;VACUUM ANALYZErobi obie rzeczy;REINDEXprzebudowuje indeksy, kiedy trzeba;- można sprawdzać rozmiar bazy i aktywne połączenia;
- wolne zapytania trzeba mierzyć;
- strategia backupu powinna zawierać częstotliwość, lokalizację, retencję i testy restore.
Ta lekcja jest ekstremalnie ważna.
Może nie efektowna.
Ale ważna.
Programista, który umie tworzyć tabele, jest przydatny.
Programista, który umie odpytywać dane, jest lepszy.
Programista, który umie chronić i przywracać dane, jest dużo bardziej godny zaufania.
Bo prawdziwe projekty nie polegają tylko na budowaniu.
Polega też na przetrwaniu błędów.
A backupy są jednym z najlepszych sposobów na przetrwanie.
Podsumowanie kursu
Dotarłeś do końca tego kursu PostgreSQL.
Nauczyłeś się:
- czym są bazy danych;
- jak działa PostgreSQL;
- jak tworzyć bazy danych;
- jak tworzyć tabele;
- jak wstawiać dane;
- jak czytać dane przez
SELECT; - jak filtrować i sortować dane;
- jak aktualizować i usuwać wiersze;
- jak działają typy danych;
- jak constrainty chronią dane;
- jak klucze główne identyfikują wiersze;
- jak klucze obce łączą tabele;
- jak działają relacje;
- jak
JOINsprawia, że powiązane dane stają się czytelne; - jak funkcje agregujące podsumowują dane;
- jak działa
GROUP BYiHAVING; - jak indeksy pomagają wydajności;
- jak zbudować praktyczną bazę sklepu;
- jak aplikacje łączą się z PostgreSQL;
- jak backup i restore chronią twoją pracę.
To dużo.
Nie nauczyłeś się tylko komend.
Nauczyłeś się myśleć o danych.
To ma znaczenie.
Bo aplikacje przychodzą i odchodzą.
Frameworki się zmieniają.
Trendy frontendowe zmieniają się co piętnaście minut.
Ale dane zostają ważne.
PostgreSQL to poważne narzędzie.
Teraz wiesz wystarczająco dużo, żeby zacząć używać go poważnie.
Ostrożnie.
Praktycznie.
I z backupami.
Zawsze z backupami.
Ostatnie słowa
PostgreSQL nie zawsze będzie łatwy.
Czasem będzie narzekał.
Czasem odrzuci twoje zapytanie.
Czasem powie:
syntax error at or near...
a ty będziesz patrzeć na jeden przecinek przez dziesięć minut.
To normalne.
Uczysz się prawdziwego narzędzia.
Potężnego narzędzia.
Narzędzia używanego w prawdziwych aplikacjach, prawdziwych firmach, prawdziwych API, prawdziwych dashboardach i prawdziwych systemach, gdzie dane mają znaczenie.
Ćwicz dalej.
Twórz małe projekty.
Psuj rzeczy.
Przywracaj je.
Pisz zapytania.
Używaj EXPLAIN ANALYZE.
Rób backupy.
Testuj backupy.
Szanuj dane.
I pamiętaj:
Przeglądarki zapominają.
Bazy danych pamiętają.
Backupy wybaczają.
Bardzo PostgreSQL.
Bardzo praktycznie.
Bardzo dobrze.