Détection de la corruption avec pgBackRest

      Comment se passe la détection de la corruption lors d'une sauvegarde pgBackRest ?
      Pour ce scenario, nous allons supposer que nous avons configuré pgBackRest 2.x dans un environnement PostgreSQL 11 sur Debian 10. Nous allons simuler une corruption et effectuer une sauvegarde :

-- utilisateur postgres, nous creons une "grosse" table dans la base postgres psql -p 5432 CREATE SCHEMA postgres; CREATE SCHEMA CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION create table geants as with recursive serie(i) as (select 550000 UNION ALL select i - 1 from serie where i > 100001) select 550001 - i idg, uuid_generate_v4() idgu, current_timestamp - (ceil(i/3) || ' minutes')::interval + (trunc(random() * 100 + 1) || ' days')::interval dtn, 200 + (trunc(random() * 200 + 1)) taille, upper(md5(random()::text)) devise, case when random() < 0.001 then true else false end berserk from serie; SELECT 450000 commit; COMMIT -- utilisateur postgres, corruption de cette table (methode Greg Sabino Mullane) cd /var/lib/postgresql/11/apptra001/base/13101/ ls -ltr ... -rw------- 1 postgres postgres 49152000 juil. 25 16:09 16601 echo -n "Shuriken!" | dd conv=notrunc oflag=seek_bytes seek=20 bs=9 count=1 of=16601 1+0 enregistrements lus 1+0 enregistrements écrits 9 octets copiés, 0,000447296 s, 20,1 kB/s -- utilisateur postgres, sauvegarde du cluster apptra001 pgbackrest --compress-level=1 --process-max=4 --type=full --stanza=apptra001 backup WARN: invalid page checksum found in file /var/lib/postgresql/11/apptra001/base/13101/16601 at page 0 echo $? 0 /usr/lib/postgresql/11/bin/pg_checksums -c /var/lib/postgresql/11/apptra001 pg_checksums: checksum verification failed in file "/var/lib/postgresql/11/apptra001/base/13101/16601", block 0: calculated checksum 4928 but expected 9924 Checksum scan completed Files scanned: 1326 Blocks scanned: 10073 Blocks skipped: 6 Bad checksums: 1 Data checksum version: 1 echo $? 1

      pgBackRest détecte bien par défaut la corruption lorsque les sommes de contrôle (checksums) sont activées au niveau du cluster PostgreSQL. Il convient toutefois d'analyser le log de la sauvegarde car pgBackRest 2.10 sort en 0 dans ce cas : la corruption fait l'objet d'un simple warning.
      A noter que l'utilitaire pg_checksums obtenu sur Debian 10 via le paquet postgresql-11-pg-checksums sort lui en 1 (erreur).

Mise à jour : 25/07/2019