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