0Pricing
SQL Academy · Lekcja

Odzyskiwanie do określonego momentu

Przywracaj bazę do dowolnego momentu za pomocą WAL

Odzyskiwanie do określonego momentu to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym jest odzyskiwanie do określonego momentu

Odzyskiwanie do określonego momentu (Point-in-Time Recovery, PITR) pozwala przywrócić bazę danych do dowolnego konkretnego momentu w przeszłości, a nie tylko do czasu wykonania ostatniej migawki kopii zapasowej.

Jest to możliwe, ponieważ PostgreSQL stale zapisuje każdą zmianę w strumieniu nazywanym dziennikiem z wyprzedzeniem (Write-Ahead Log, WAL). Odtwarzając rekordy WAL na bazowej kopii zapasowej, można dotrzeć dokładnie do potrzebnego momentu.

Dziennik z wyprzedzeniem (WAL)

Każda instrukcja INSERT, UPDATE, DELETE i DDL jest najpierw zapisywana w WAL, zanim zmodyfikuje właściwe pliki danych. Gwarantuje to trwałość danych nawet w przypadku awarii serwera w trakcie zapisu.

W przypadku PITR zarchiwizowane segmenty WAL pełnią rolę taśm wehikułu czasu. Kopia bazowa jest punktem wyjścia, a WAL uzupełnia wszystko, co wydarzyło się później.

-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
       pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;

Włączanie archiwizacji WAL

Zanim odzyskiwanie do określonego momentu będzie możliwe, archiwizację WAL trzeba włączyć w pliku postgresql.conf. Najważniejsze parametry to wal_level, archive_mode i archive_command.

Polecenie archiwizacji kopiuje każdy ukończony segment WAL do bezpiecznej lokalizacji, takiej jak katalog lokalny, punkt montowania NFS lub zasobnik w chmurze.

-- View current WAL and archive settings
SELECT name, setting, unit
FROM   pg_settings
WHERE  name IN (
  'wal_level',
  'archive_mode',
  'archive_command',
  'archive_status'
)
ORDER  BY name;

Tworzenie bazowej kopii zapasowej

Kopia bazowa to spójna kopia całego katalogu danych utworzona podczas pracy serwera. PostgreSQL udostępnia narzędzie pg_basebackup oraz niskopoziomowe funkcje SQL do koordynowania tego procesu.

Kopia wraz z zarchiwizowanymi segmentami WAL zarejestrowanymi od momentu rozpoczęcia tworzenia kopii stanowi wszystko, czego potrzeba do PITR.

-- Check the latest base backup information
SELECT backup_start,
       backup_end,
       pg_size_pretty(backup_total) AS total_size
FROM   pg_stat_basebackup;

Określanie docelowego czasu odzyskiwania

Gdy wydarzy się awaria, pierwszym krokiem jest ustalenie dokładnego znacznika czasu, do którego ma zostać przywrócona baza danych. Często wybiera się znacznik czasu tuż przed szkodliwym zdarzeniem, takim jak przypadkowe masowe DELETE.

Tabele dzienników transakcji lub dzienniki aplikacji często zawierają ten znacznik czasu. Sam WAL rejestruje znaczniki czasu zatwierdzenia, gdy włączony jest parametr track_commit_timestamp.

-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
       pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM   pg_stat_activity
WHERE  state = 'idle'
LIMIT  10;

Parametry recovery.conf / recovery

Zachowaniem podczas odzyskiwania sterują parametry umieszczone w pliku postgresql.conf (PostgreSQL 12+) albo w starszym pliku recovery.conf. Najważniejsze z nich to:

  • restore_command — sposób pobierania zarchiwizowanych segmentów WAL
  • recovery_target_time — dokładny znacznik czasu, na którym należy się zatrzymać
  • recovery_target_action — działanie po osiągnięciu celu (promote, pause, shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM   pg_settings
WHERE  name IN (
  'restore_command',
  'recovery_target_time',
  'recovery_target_action',
  'recovery_target_inclusive'
)
ORDER  BY name;

Inne typy celu odzyskiwania

Czas nie jest jedynym sposobem określenia celu odzyskiwania. PostgreSQL obsługuje cztery typy celów:

  • recovery_target_time — ciąg znaków reprezentujący znacznik czasu
  • recovery_target_xid — określony identyfikator transakcji
  • recovery_target_lsn — numer sekwencji dziennika WAL
  • recovery_target_name — nazwany punkt przywracania utworzony za pomocą pg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;

Symulowanie awarii

Aby przećwiczyć PITR w środowisku testowym, należy celowo uszkodzić lub usunąć dane po odnotowaniu bieżącego czasu. Pozwala to zweryfikować, czy odzyskiwanie kończy się we właściwym momencie i czy usunięte wiersze zostają przywrócone.

-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;

-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';

-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;

Przeprowadzanie odzyskiwania

Odzyskiwanie obejmuje trzy kroki:

  1. Należy zatrzymać uruchomioną instancję PostgreSQL.
  2. Należy odtworzyć kopię bazową w katalogu danych.
  3. Należy skonfigurować parametry odzyskiwania i uruchomić PostgreSQL w trybie odzyskiwania — odtwarza on WAL aż do osiągnięcia czasu docelowego, a następnie przełącza się w tryb zwykłego serwera do odczytu i zapisu.

Dzienniki serwera pokazują każdy stosowany plik WAL, co ułatwia śledzenie postępu.

-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
       pg_last_xact_replay_timestamp() AS last_replayed_txn;

Weryfikowanie odzyskiwania

Po promocji serwera należy zweryfikować, czy dane są w oczekiwanym stanie. Należy sprawdzić liczbę wierszy, znaczniki czasu najnowszych wierszy oraz wszelkie wartości kluczowe dla działalności.

Warto wykonać te zapytania weryfikacyjne przed ponownym dopuszczeniem ruchu aplikacji, aby w razie potrzeby odtworzyć późniejszy stan lub zmienić czas docelowy.

-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders'       AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items'  AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers'    AS tbl, COUNT(*) AS rows FROM customers
ORDER  BY tbl;

Najlepsze praktyki PITR

Niezawodna konfiguracja PITR wymaga czegoś więcej niż tylko włączenia archiwizacji. Najważniejsze praktyki to:

  • Regularne testowanie odtwarzania — nieprzetestowana kopia zapasowa nie jest kopią zapasową.
  • Monitorowanie opóźnienia archiwizacji WAL — luki w zarchiwizowanym WAL uniemożliwiają pełne odzyskanie danych.
  • Zachowanie wystarczającej historii WAL — segmenty należy przechowywać co najmniej od momentu utworzenia najstarszej prawidłowej kopii bazowej.
  • Korzystanie z oddzielnej lokalizacji przechowywania — jeśli podstawowy dysk ulegnie awarii, zarchiwizowany WAL znajdujący się na tym samym dysku również zostanie utracony.
-- Check for any WAL archiving failures
SELECT archived_count,
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM   pg_stat_archiver;

Szybki test

Sprawdź znajomość odzyskiwania do punktu w czasie.

Podsumowanie: Odzyskiwanie do punktu w czasie

W tej lekcji poznali Państwo, jak dziennik Write-Ahead Log PostgreSQL umożliwia odzyskanie danych z dowolnego momentu w przeszłości:

  • Archiwizacja WAL rejestruje każdą zmianę po wykonaniu kopii bazowej.
  • Cele odzyskiwania mogą obejmować znacznik czasu, identyfikator transakcji, LSN lub nazwany punkt przywracania.
  • Proces odzyskiwania odtwarza kopię bazową, odtwarza zarchiwizowany WAL i przełącza serwer po osiągnięciu celu.
  • Weryfikacja potwierdza integralność danych przed ponownym udostępnieniem ruchu.
  • Najlepsze praktyki obejmują regularne testy odtwarzania, monitorowanie archiwizacji i przechowywanie WAL poza główną lokalizacją.

PITR jest zabezpieczeniem przed błędami ludzkimi i uszkodzeniem danych — opanowanie go oznacza opanowanie odzyskiwania po awarii.

Często zadawane pytania

Czy lekcja „Odzyskiwanie do określonego momentu” jest bezpłatna?

Tak — pełny tekst „Odzyskiwanie do określonego momentu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Odzyskiwanie do określonego momentu”?

Przywracaj bazę do dowolnego momentu za pomocą WAL Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Odzyskiwanie do określonego momentu”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kopie logiczne a fizyczne
  2. Odzyskiwanie do określonego momentu
  3. Testowanie przywracania kopii
  4. Planowanie odtwarzania po awarii
← Powrót do SQL Academy