PostgreSQL 12/13: aktywacja sum kontrolnych w plikach danych

W domyślnej konfiguracji serwera, ewentualne uszkodzenia plików danych są wykrywane podczas dostępu do bloku dyskowego tylko w sytuacji, kiedy blok danych nie może być odczytany z dysku lub jego zawartość jest nieczytelna (uszkodzony format bloku). Niestety, bardziej „subtelne” uszkodzenia, polegające np. na przekłamaniu pojedynczego bajtu, są niedostrzegalne dla serwera PostgreSQL.

Aby umożliwić automatyczną detekcję nawet takich „subtelnych” uszkodzeń, już w wersji 9.3 wprowadzono mechanizm sum kontrolnych, które pozwalają wykrywać jakiekolwiek zaburzenia zawartości bloków danych. Niestety, mechanizm sum kontrolnych mógł być aktywowany wyłącznie w momencie kreowania inicjalnego katalogu danych (initdb) – później było to już niemożliwe.

Warto zatem odnotować wdzięczne usprawnienie, wprowadzone w wersji PostgreSQL 12 w formie nowego narzędzia pg_checksums, które umożliwia wdrożenie mechanizmu sum kontrolnych w już istniejącym środowisku PostgreSQL. Narzędzie to umożliwia zarówno włączenie, wyłączenie, jak i weryfikację poprawności wszystkich plików danych.

Oto krótka demonstracja. Rozpoczynamy z istniejącym już katalogiem danych, w którym nie aktywowano mechanizmu sum kontrolnych, o czym zresztą możemy się przekonać za pomocą następującego wywołania narzędzia pg_checksums:

$ pg_ctl stop
$ pg_checksums -D /var/lib/pgsql/13/data
pg_checksums: error: data checksums are not enabled in cluster

Aktywujmy teraz używanie sum kontrolnych w plikach danych:

$ pg_checksums -D /var/lib/pgsql/13/data --enable
Checksum operation completed
Files scanned:  920
Blocks scanned: 55752
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster

Od tego momentu możemy okresowo weryfikować integralność naszych baz danych:

$ pg_checksums -D /var/lib/pgsql/13/data --check
Checksum operation completed
Files scanned:  920
Blocks scanned: 55752
Bad checksums:  0
Data checksum version: 1

A gdyby w którymś z bloków zakradł się błąd? Wtedy otrzymalibyśmy taki wynik:

pg_checksums -D /var/lib/pgsql/13/data --check
pg_checksums: error: checksum verification failed in file "/var/lib/pgsql/13/data/base/13434/16405", block 10: calculated checksum B6AE but block contains 1C31
Checksum operation completed
Files scanned:  923
Blocks scanned: 55831
Bad checksums:  1
Data checksum version: 1

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *