Cette formation est sous licence CC-BY-NC-SA.
Vous êtes libre de la redistribuer et/ou modifier aux conditions
suivantes :
Paternité
Pas d’utilisation commerciale
Partage des conditions initiales à l’identique
Marques déposées
PostgreSQL® Postgres® et le logo Slonik sont des marques
déposées par PostgreSQL Community Association of Canada.
Versions de
PostgreSQL couvertes
Ce document ne couvre que les versions supportées de PostgreSQL au
moment de sa rédaction, soit les versions 12 à 16.
PostgreSQL : Gestion d’un sinistre
Introduction
Une bonne politique de sauvegardes est cruciale
mais elle n’empêche pas les incidents
Il faut être prêt à y faire face
Au menu
Anticiper les désastres
Réagir aux désastres
Rechercher l’origine du problème
Outils utiles
Cas type de désastres
Anticiper les désastres
Un désastre peut toujours survenir
Il faut savoir le détecter le plus tôt possible
et s’être préparé à y répondre
Documentation
Documentation complète et à jour
emplacement et fréquence des sauvegardes
emplacement des traces
procédures et scripts d’exploitation
Sauvegarder et versionner la documentation
Procédures et scripts
Procédures détaillées de restauration / PRA
préparer des scripts / utiliser des outils
minimiser le nombre d’actions manuelles
Tester les procédures régulièrement
bases de test, développement…
s’assurer que chacun les maîtrise
Sauvegarder et versionner les scripts
Supervision et historisation
Tout doit être supervisé
réseau, matériel, système, logiciels…
les niveaux d’alerte doivent être significatifs
Les métriques importantes doivent être historisées
cela permet de retrouver le moment où le problème est apparu
quand cela a un sens, faire des graphes
Automatisation
Des outils existent
PAF (Pacemaker), patroni, repmgr…
Automatiser une bascule est complexe
cela peut mener à davantage d’incidents
voire à des désastres (split brain)
Réagir aux désastres
Savoir identifier un problème majeur
Bons réflexes
Mauvais réflexes
Symptômes d’un désastre
Crash de l’instance
Résultats de requêtes erronnés
Messages d’erreurs dans les traces
Dégradation importante des temps d’exécution
Processus manquants
ou en court d’exécution depuis trop longtemps
Bons réflexes 1
Garder la tête froide
Répartir les tâches clairement
Minimiser les canaux de communication
Garder des notes de chaque action entreprise
Bons réflexes 2
Se prémunir contre une aggravation du problème
couper les accès applicatifs
Si une corruption est suspectée
arrêter immédiatement l’instance
faire une sauvegarde immédiate des fichiers
travailler sur une copie
Bons réflexes 3
Déterminer le moment de démarrage du désastre
Adopter une vision générale plutôt que focalisée sur un détail
Remettre en cause chaque élément de l’architecture
aussi stable (et/ou coûteux/complexe) soit-il
Éliminer en priorité les causes possibles côté hardware,
système
Isoler le comportement précis du problème
identifier les requêtes / tables / index impliqués
Bons réflexes 4
En cas de défaillance matérielle
s’assurer de corriger sur du hardware sain et non affecté !
baies partagées…
Bons réflexes 5
Communiquer, ne pas rester isolé
Demander de l’aide si le problème est trop complexe
autres équipes
support
forums
listes
Bons réflexes 6
Dérouler les procédures comme prévu
En cas de situation non prévue, s’arrêter pour faire le point
ne pas hésiter à remettre en cause l’analyse
ou la procédure elle-même
Bons réflexes 7
En cas de bug avéré
tenter de le cerner et de le reproduire au mieux
le signaler à la communauté de préférence (configuration, comment
reproduire)
Bons réflexes 8
Après correction
Tester complètement l’intégrité des données
pour détecter tous les problèmes
Validation avec export logique complet
pg_dumpall> /dev/null
Ou physique
pg_basebackup
Reconstruction dans une autre instance (vérification de
cohérence)
pg_dumpall|psql-h autre serveur
Mauvais réflexes 1
Paniquer
Prendre une décision hâtive
exemple, supprimer des fichiers du répertoire
pg_wal
Lancer une commande sans la comprendre, par exemple :
pg_resetwal
l’extension pg_surgery
DANGER, dernier espoir
Mauvais réflexes 2
Arrêter le diagnostic quand les symptômes disparaissent
Ne pas pousser l’analyse jusqu’au bout
Mauvais réflexes 3
Ne pas documenter
le résultat de l’investigation
les actions effectuées
Rechercher l’origine du
problème
Quelques pistes de recherche pour cerner le problème
Liste non exhaustive
Prérequis
Avant de commencer à creuser
référencer les symptômes
identifier au mieux l’instant de démarrage du problème
Recherche d’historique
Ces symptômes ont-ils déjà été rencontrés dans le passé ?
Ces symptômes ont-ils déjà été rencontrés par d’autres ?
Attention à ne pas prendre les informations trouvées pour argent
comptant !
Matériel
Vérifier le système disque (SAN, carte RAID, disques)
Un fsync est-il bien honoré de l’OS au disque ?
(batteries !)
Rechercher toute erreur matérielle
Firmwares pas à jour
ou récemment mis à jour
Matériel récemment changé
Virtualisation
Mutualisation excessive
Configuration du stockage virtualisé
Rechercher les erreurs aussi niveau superviseur
Mises à jour non appliquées
ou appliquées récemment
Modifications de configuration récentes
Système d’exploitation 1
Erreurs dans les traces
Mises à jour système non appliquées
Modifications de configuration récentes
Système d’exploitation 2
Opération d’IO impossible
FS plein ?
FS monté en lecture seule ?
Tester l’écriture sur PGDATA
Tester la lecture sur PGDATA
Système d’exploitation 3
Consommation excessive des ressources
OOM killer (overcommit !)
Après un crash, vérifier les processus actifs
ne pas tenter de redémarrer si des processus persistent
Outils : sar, atop…
PostgreSQL
Relever les erreurs dans les traces
ou messages inhabituels
Vérifier les mises à jour mineures
Paramétrage de
PostgreSQL : écriture des fichiers
La désactivation de certains paramètres est dangereuse
fsync
full_page_write
Paramétrage de
PostgreSQL : les sommes de contrôle
Activez les checksums !
initdb --data-checksums
pg_checksums --enable (à posteriori, v12)
Détecte les corruptions silencieuses
Impact faible sur les performances
Vérification lors de pg_basebackup (v11)
Erreur de manipulation
Traces système, traces PostgreSQL
Revue des dernières manipulations effectuées
Historique des commandes
Danger : kill -9, rm -rf,
rsync, find … -exec …
Outils
Quelques outils peuvent aider
à diagnostiquer la nature du problème
à valider la correction apportée
à appliquer un contournement
ATTENTION
certains de ces outils peuvent corrompre les données !
Outils - pg_controldata
Fournit des informations de contrôle sur l’instance
Ne nécessite pas que l’instance soit démarrée
Outils - export/import de
données
pg_dump
pg_dumpall
COPY
psql / pg_restore
--section=pre-data / data /
post-data
Outils - pageinspect
Extension
Vision du contenu d’un bloc
Sans le dictionnaire, donc sans décodage des données
Affichage brut
Utilisé surtout en debug, ou dans les cas de corruption
Fonctions de décodage pour les tables, les index (B-tree, hash, GIN,
GiST), FSM
Nécessite de connaître le code de PostgreSQL
Outils - pg_resetwal
Efface les WAL courants
Permet à l’instance de démarrer en cas de corruption d’un WAL
comme si elle était dans un état cohérent
…ce qui n’est pas le cas
Cet outil est dangereux et mène à des corruptions
!!!
Pour récupérer ce qu’on peut, et réimporter ailleurs
Outils - Extension
pg_surgery
Extension apparue en v14
Collection de fonctions permettant de modifier le statut des tuples
d’une relation
Extrêmement dangereuse
Outils - Vérification
d’intégrité
À froid : pg_checksums (à froid, v11)
Lors d’une sauvegarde : pg_basebackup (v11)
amcheck : pure vérification
v10 : 2 fonctions pour l’intégrité des index
v11 : vérification de la cohérence avec la table (probabiliste)
v14 : ajout d’un outil pg_amcheck
Cas type de désastres
Les cas suivants sont assez rares
Ils nécessitent généralement une restauration
Certaines manipulations à haut risque sont possibles
mais complètement déconseillées !
Avertissement
Privilégier une solution fiable (restauration, bascule)
Les actions listées ici sont parfois destructrices
La plupart peuvent (et vont) provoquer des incohérences
Travailler sur une copie
Corruption de blocs dans des
index
Messages d’erreur lors des accès par l’index ; requêtes
incohérentes
Données différentes entre un indexscan et un seqscan
Supprimer et recréer l’index : REINDEX
Corruption de blocs dans
des tables 1
ERROR: invalid page header in block 32570 of relation base/16390/2663ERROR: could not read block 32570 of relation base/16390/2663: read only 0 of 8192 bytes
Cas plus problématique
Restauration probablement nécessaire
Corruption de blocs dans
des tables 2
SET zero_damaged_pages =true ;VACUUM FULL tablecorrompue ;
Des données vont certainement être perdues !
Corruption de blocs dans
des tables 3
Si la corruption est importante, l’accès au bloc peut faire crasher
l’instance
Il est tout de même possible de réinitialiser le bloc
identifier le fichier à l’aide de
pg_relation_filepath()
trouver le bloc avec ctid /
pageinspect
réinitialiser le bloc avec dd
il faut vraiment ne pas avoir d’autre choix
Corruption des WAL 1
Situés dans le répertoire pg_wal
Les WAL sont nécessaires au recovery
Démarrage impossible s’ils sont corrompus ou manquants
Si les fichiers WAL ont été archivés, les récupérer
Sinon, la restauration est la seule solution viable
Corruption des WAL 2
pg_resetwal permet de forcer le démarrage
ATTENTION !!!
cela va provoquer des pertes de données
des corruptions de données sont également probables
ce n’est pas une action corrective !
Corruption du fichier de
contrôle
Fichier global/pg_control
Contient les informations liées au dernier checkpoint