Kopia zapasowa i odzyskiwanie baz danych PostgreSQL: Kompletny przewodnik dla użytkowników AlexHost
Dlaczego strategia kopii zapasowych PostgreSQL jest ważniejsza niż myślisz
Utrata danych to nie hipotetyczne ryzyko — to pewność operacyjna, z którą każdy administrator bazy danych będzie się mierzyć w pewnym momencie. Awarie sprzętu, przypadkowe usunięcia, uszkodzone transakcje i ataki ransomware mogą doprowadzić środowisko produkcyjne do upadku w ciągu sekund. Dla użytkowników PostgreSQL posiadanie solidnej, przetestowanej i zautomatyzowanej strategii kopii zapasowych to różnica między drobnym incydentem a katastrofalną porażką biznesu.
Serwery dedykowane AlexHost zapewniają idealną podstawę do hostowania i ochrony baz danych PostgreSQL. Dzięki magazynowaniu NVMe SSD klasy korporacyjnej zapewniającemu wyjątkową przepustowość I/O, pełnemu dostępowi root do pełnej kontroli konfiguracji i wbudowanej ochronie przed DDoS, AlexHost zapewnia wydajność infrastruktury i postawę bezpieczeństwa, które wymagają poważne obciążenia baz danych.
Niezależnie od tego, czy prowadzisz platformę e-commerce o dużym ruchu, aplikację SaaS, instalację WordPress wspieraną przez relacyjną bazę danych, czy niestandardowy system korporacyjny, ten przewodnik przeprowadzi Cię przez każdą główną metodę tworzenia kopii zapasowych i odzyskiwania PostgreSQL — od prostych zrzutów SQL do zaawansowanego odzyskiwania do punktu w czasie (PITR) — wszystko zoptymalizowane dla środowisk produkcyjnych.
Spis treści
- Zrozumienie opcji kopii zapasowych PostgreSQL
- Wymagania wstępne i uprawnienia
- Metoda 1 — Zrzut SQL z
pg_dump - Metoda 2 — Tworzenie kopii zapasowych wszystkich baz danych z
pg_dumpall - Metoda 3 — Kopie zapasowe w formacie niestandardowym dla dużych baz danych
- Przywracanie ze zrzutów SQL
- Przywracanie ze zrzutów w formacie niestandardowym
- Metoda 4 — Ciągłe archiwizowanie i odzyskiwanie do punktu w czasie (PITR)
- Automatyzacja kopii zapasowych za pomocą Cron
- Zabezpieczanie i przechowywanie kopii zapasowych poza siedzibą
- Podsumowanie najlepszych praktyk
1. Zrozumienie opcji kopii zapasowych PostgreSQL
PostgreSQL jest dostarczany z kilkoma dojrzałymi, dobrze udokumentowanymi mechanizmami tworzenia kopii zapasowych. Wybór właściwego zależy od rozmiaru bazy danych, celów czasu odzyskiwania (RTO), celów punktu odzyskiwania (RPO) i tolerancji złożoności operacyjnej.
| Metoda | Najlepsze dla | Zalety | Wady |
|---|---|---|---|
Zrzut SQL (pg_dump) | Małe do średnich baz danych | Proste, przenośne, czytelne dla człowieka | Powolne dla bardzo dużych baz danych |
| Zrzut w formacie niestandardowym | Średnie do dużych baz danych | Skompresowany, równoległa restauracja | Binarny, wymaga pg_restore |
| Migawka systemu plików | Bardzo duże bazy danych | Szybka, spójna | Wymaga wiedzy, baza danych musi być wyciszona lub świadoma migawek |
| PITR (archiwizowanie WAL) | Krytyczne systemy produkcyjne | Szczegółowe odzyskiwanie do punktu w czasie | Złożona konfiguracja i konserwacja |
Zrozumienie tych kompromisów przed rozpoczęciem jest niezbędne. Większość środowisk produkcyjnych korzysta z połączenia co najmniej dwóch podejść — na przykład nocnych zrzutów w formacie niestandardowym wraz z ciągłym archiwizowaniem WAL dla szczegółowej możliwości odzyskiwania.
2. Wymagania wstępne i uprawnienia
Przed wykonaniem jakiejkolwiek operacji tworzenia kopii zapasowej potwierdź, że spełnione są następujące wymagania wstępne:
Uprawnienia użytkownika:
- Musisz być superużytkownikiem PostgreSQL lub właścicielem docelowej bazy danych, aby wykonać pełną kopię zapasową.
- Dla
pg_dumpallwymagane są uprawnienia superużytkownika.
Sprawdź wersję PostgreSQL:
psql --versionSprawdź dostępne miejsce na dysku przed wykonaniem kopii zapasowej:
df -h /var/lib/postgresql/Upewnij się, że miejsce docelowe kopii zapasowej ma wystarczającą wolną przestrzeń — co najmniej 1,5× rozmiar bazy danych, której kopia zapasowa jest tworzona, aby uwzględnić pliki tymczasowe i narzut kompresji.
Połącz się z serwerem za pośrednictwem SSH:
ssh root@your-server-ipJeśli korzystasz z planu VPS Hosting, będziesz mieć pełny dostęp SSH i możliwość instalacji, konfiguracji i zarządzania PostgreSQL bez ograniczeń.
3. Metoda 1 — Zrzut SQL z pg_dump
Narzędzie pg_dump jest najczęściej używanym narzędziem do tworzenia kopii zapasowych PostgreSQL. Tworzy spójną migawkę pojedynczej bazy danych, nawet gdy baza danych jest aktywnie używana. Wynik to zwykły skrypt SQL, który można przejrzeć, edytować i odtworzyć na dowolnej kompatybilnej instalacji PostgreSQL.
Krok 1: Otwórz terminal i uzyskaj dostęp do serwera
ssh root@your-alexhost-server-ipKrok 2: Uruchom polecenie pg_dump
pg_dump -U username -W -F p database_name > /backups/backup_file.sqlRozbicie parametrów:
| Parametr | Opis |
|---|---|
-U username | Użytkownik PostgreSQL wykonujący kopię zapasową |
-W | Interaktywnie poproś o hasło |
-F p | Format wyjściowy: p = zwykły tekst SQL |
database_name | Nazwa bazy danych, której kopię zapasową chcesz wykonać |
> /backups/backup_file.sql | Przekieruj wyjście do pliku |
Praktyczny przykład:
pg_dump -U postgres -W -F p my_production_db > /backups/my_production_db_$(date +%Y%m%d_%H%M%S).sql> Pro Tip: Dołączenie sygnatury czasowej za pomocą $(date +%Y%m%d_%H%M%S) do nazwy pliku kopii zapasowej zapewnia, że nigdy nie przypadkowo nie nadpiszesz poprzedniej kopii zapasowej i tworzysz naturalny chronologiczny archiwum.
Krok 3: Sprawdź plik kopii zapasowej
ls -lh /backups/
head -50 /backups/my_production_db_*.sqlPlik powinien zaczynać się od komentarzy nagłówka PostgreSQL i instrukcji SET, potwierdzając, że została utworzona prawidłowa kopia zapasowa.
4. Metoda 2 — Tworzenie kopii zapasowych wszystkich baz danych z pg_dumpall
Gdy musisz wykonać kopię zapasową każdej bazy danych w instancji PostgreSQL — w tym obiektów globalnych, takich jak role i przestrzenie tabel — pg_dumpall jest właściwym narzędziem.
pg_dumpall -U postgres -W > /backups/all_databases_$(date +%Y%m%d).sqlTo polecenie eksportuje:
- Wszystkie bazy danych
- Wszystkie role (użytkownicy i grupy)
- Wszystkie przestrzenie tabel
- Całą konfigurację globalną
Ważne: Plik wyjściowy z pg_dumpall może być bardzo duży na zajętych serwerach. Upewnij się, że partycja kopii zapasowej ma wystarczającą przestrzeń i rozważ natychmiastową kompresję wyjścia:
pg_dumpall -U postgres | gzip > /backups/all_databases_$(date +%Y%m%d).sql.gz5. Metoda 3 — Kopie zapasowe w formacie niestandardowym dla dużych baz danych
W przypadku produkcyjnych baz danych przekraczających kilka gigabajtów, format niestandardowy (-F c) jest zdecydowanie zalecany zamiast zwykłych zrzutów SQL. Kopie zapasowe w formacie niestandardowym to:
- Domyślnie skompresowane — znacznie zmniejszające wymagania dotyczące przechowywania
- Szybsze do przywrócenia — obsługujące równoległe operacje przywracania za pomocą flagi
-j - Selektywnie przywracalne — umożliwiające przywrócenie poszczególnych tabel lub schematów
Tworzenie kopii zapasowej w formacie niestandardowym
pg_dump -U postgres -W -F c my_production_db > /backups/my_production_db_$(date +%Y%m%d).dumpTworzenie skompresowanej kopii zapasowej w formacie katalogu (obsługuje równoległy proces)
pg_dump -U postgres -W -F d -j 4 -f /backups/my_production_db_dir my_production_db| Parametr | Opis |
|---|---|
-F d | Format katalogu — jeden plik na tabelę |
-j 4 | Użyj 4 równoległych procesów roboczych |
-f /path/to/dir | Katalog wyjściowy (nie może jeszcze istnieć) |
To podejście dramatycznie skraca czas tworzenia kopii zapasowej na serwerach wielordzeniowych, co czyni go idealnym dla środowisk serwerów dedykowanych o wysokiej wydajności dostępnych w AlexHost.
6. Przywracanie ze zrzutów SQL
Przywróć pojedynczą bazę danych ze zwykłego zrzutu SQL
Najpierw upewnij się, że docelowa baza danych istnieje. Jeśli nie, utwórz ją:
psql -U postgres -c "CREATE DATABASE my_restored_db;"Następnie przywróć:
psql -U postgres -d my_restored_db -f /backups/my_production_db_backup.sqlRozbicie parametrów:
| Parametr | Opis |
|---|---|
-U postgres | Superużytkownik PostgreSQL |
-d my_restored_db | Docelowa baza danych do przywrócenia |
-f /path/to/file.sql | Ścieżka do pliku zrzutu SQL |
Monitoruj postęp przywracania
W przypadku dużych plików SQL możesz monitorować postęp za pomocą pv:
pv /backups/my_production_db_backup.sql | psql -U postgres -d my_restored_db7. Przywracanie ze zrzutów w formacie niestandardowym
Zrzuty w formacie niestandardowym wymagają narzędzia pg_restore zamiast psql.
Podstawowe przywrócenie
pg_restore -U postgres -d my_restored_db /backups/my_production_db.dumpPrzywróć i automatycznie utwórz bazę danych
Użyj flagi -C aby poinstruować pg_restore aby utworzyć bazę danych przed jej wypełnieniem:
pg_restore -U postgres -C -d postgres /backups/my_production_db.dumpRównoległa restauracja dla szybszego odzyskiwania
pg_restore -U postgres -d my_restored_db -j 4 /backups/my_production_db_dir/Użycie -j 4 z kopią zapasową w formacie katalogu może zmniejszyć czas przywracania o do 75% na serwerze czterordzeniowym — znaczna przewaga przy minimalizowaniu przestojów podczas odzyskiwania po awarii.
Przywróć tylko określoną tabelę
pg_restore -U postgres -d my_restored_db -t orders /backups/my_production_db.dumpTa szczegółowa możliwość jest jedną z kluczowych zalet formatu niestandardowego w stosunku do zwykłych zrzutów SQL.
8. Metoda 4 — Ciągłe archiwizowanie i odzyskiwanie do punktu w czasie (PITR)
PITR to złoty standard dla krytycznych wdrożeń PostgreSQL. Umożliwia przywrócenie bazy danych do dowolnego konkretnego momentu w czasie — nie tylko ostatniej kopii zapasowej — poprzez odtworzenie segmentów Write-Ahead Log (WAL) na górze kopii zapasowej. Jest to niezbędne w scenariuszach, w których musisz odzyskać się z błędu logicznego (takiego jak przypadkowy DROP TABLE), który miał miejsce w znanym znaczniku czasu.
Krok 1: Włącz archiwizowanie WAL w postgresql.conf
Zlokalizuj i edytuj plik konfiguracji PostgreSQL:
nano /etc/postgresql/15/main/postgresql.confDodaj lub zmodyfikuj następujące dyrektywy:
# Enable WAL archiving
wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'Wyjaśnienie parametru:
| Parametr | Wartość | Opis |
|---|---|---|
wal_level | replica | Włącza wystarczające szczegóły WAL do archiwizowania |
archive_mode | on | Aktywuje proces archiwizowania |
archive_command | 'cp %p /path/%f' | Polecenie powłoki do skopiowania plików WAL do archiwum |
Utwórz katalog archiwum i ustaw prawidłowe uprawnienia:
mkdir -p /var/lib/postgresql/wal_archive
chown postgres:postgres /var/lib/postgresql/wal_archive
chmod 700 /var/lib/postgresql/wal_archiveUruchom ponownie PostgreSQL, aby zastosować zmiany:
systemctl restart postgresqlKrok 2: Utwórz kopię zapasową bazy za pomocą pg_basebackup
pg_basebackup -U postgres -D /backups/base_backup -Ft -z -P -Xs| Parametr | Opis |
|---|---|
-D /backups/base_backup | Katalog docelowy dla kopii zapasowej bazy |
-Ft | Wyjście w formacie Tar |
-z | Kompresuj za pomocą gzip |
-P | Pokaż postęp |
-Xs | Przesyłaj WAL podczas tworzenia kopii zapasowej |
Krok 3: Przywróć do określonego punktu w czasie
Aby przywrócić z kopii zapasowej bazy i archiwów WAL:
- Zatrzymaj PostgreSQL:
systemctl stop postgresql- Wyczyść istniejący katalog danych:
rm -rf /var/lib/postgresql/15/main/*- Wyodrębnij kopię zapasową bazy:
tar -xzf /backups/base_backup/base.tar.gz -C /var/lib/postgresql/15/main/- Utwórz
recovery.conf(PostgreSQL 11 i wcześniej) lub skonfigurujpostgresql.confi utwórz plikrecovery.signal(PostgreSQL 12+):
# For PostgreSQL 12+
touch /var/lib/postgresql/15/main/recovery.signalDodaj do postgresql.conf:
restore_command = 'cp /var/lib/postgresql/wal_archive/%f %p'
recovery_target_time = '2025-01-15 14:30:00'
recovery_target_action = 'promote'- Ustaw prawidłową własność i uruchom PostgreSQL:
chown -R postgres:postgres /var/lib/postgresql/15/main/
systemctl start postgresqlPostgreSQL będzie odtwarzać segmenty WAL do określonego znacznika czasu, a następnie promować do normalnego stanu do odczytu i zapisu.
9. Automatyzacja kopii zapasowych za pomocą Cron
Ręczne kopie zapasowe są zawodne.
