Weryfikacja poprawności kopii bezpieczeństwa w PostgreSQL 13

Spośród wielu nowości, jakie pojawiły się w wersji 13 serwera PostgreSQL, wielu z nas doceni interesujące narzędzie, umożliwiające weryfikację poprawności przechowywanej fizycznej kopii bezpieczeństwa: pg_verifybackup.

Na wstępie należy zauważyć, że podczas wykonywania fizycznej kopii bezpieczeństwa za pomocą pg_basebackup, teraz generowany jest specjalny plik deskryptora, nazwany backup_manifest, który zawiera wykaz wszystkich plików wchodzących w skład kopii bezpieczeństwa, wraz z ich sumami kontrolnymi. Dodatkowo, plik backup_manifest zawiera również deklarację zakresu rekordów WAL, które będą niezbędne do uspójnienia zawartości kopii bezpieczeństwa, gdy kopia zostanie użyta do odtworzenia stanu bazy danych po awarii. I właśnie z tego pliku korzysta nowe narzędzie pg_verifybackup, sprawdzające zarówno obecność każdego z plików kopii bezpieczeństwa, jego sumę kontrolną, a także weryfikujące poprawność zabezpieczonych plików WAL w podanym zakresie rekordów (użyto do pg_waldump w trybie cichym).

W ramach prostej demonstracji zilustrujemy użycie narzędzia pg_verifybackup. W pierwszym kroku wykonujemy fizyczną kopię bezpieczeństwa naszego katalogu danych:

$ pg_basebackup -D backups/daily

Przyjrzyjmy się zawartości wygenerowanego pliku backup_manifest:

$ less backups/daily/backup_manifest
{ "PostgreSQL-Backup-Manifest-Version": 1,
"Files": [
{ "Path": "backup_label", "Size": 226, "Last-Modified": "2020-12-12 10:04:23 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "c927d580" },
{ "Path": "global/1262", "Size": 8192, "Last-Modified": "2020-12-03 17:35:59 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "ae6ede64" },
...
{ "Path": "global/pg_control", "Size": 8192, "Last-Modified": "2020-12-12 10:04:22 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "43872087" }],
"WAL-Ranges": [{ "Timeline": 1, "Start-LSN": "0/EB000028", "End-LSN": "0/EB000138" }],
"Manifest-Checksum": "04e59701bdafafec5f77117cadd2425e863397a4a1c8447cd34900062b24e1c1"}

Skorzystajmy teraz z pg_verifybackup do weryfikacji poprawności utworzonej kopii bezpieczeństwa:

$ pg_verifybackup backups/daily
backup successfully verified

Wyświetlony komunikat potwierdza poprawność znajdującej się na dysku kopii bezpieczeństwa. A jak wyglądałby wyświetlony raport, gdyby istotnie kopia była uszkodzona? Oto przykład:

# uszkadzamy jeden z plików
$ dd of=backups/daily/global/pg_control bs=8192 conv=notrunc seek=0 <<EOF
XXX
EOF
# usuwamy pliki WAL
$ rm backups/daily/pg_wal/*
# weryfikujemy poprawność kopii bezpieczeństwa
$ pg_verifybackup backups/daily
pg_verifybackup: error: checksum mismatch for file "global/pg_control"
pg_waldump: fatal: could not find any WAL file
pg_verifybackup: error: WAL parsing failed for timeline 1

Podsumowując, pg_verifybackup to bardzo cenne i potrzebne narzędzie, które powinno być stosowane jako element polityki ochrony baz danych przed skutkami awarii.

Dokumentacja: https://www.postgresql.org/docs/13/app-pgverifybackup.html

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *