Restauration

Procédure pour restaurer une base de données CNPG Kubernetes

Les différentes méthodes pour restaurer une base CNPG sont décrites ici ici.

La procédure classique que nous devrions tester en priorité est celle-ci :

  1. Lister les backups

    kubectl get backups.postgresql.cnpg.io -n namespace
    
  2. Restaurer la base depuis le dernier backup listé ci-dessus

    https://cloudnative-pg.io/documentation/1.20/recovery/#recovery-from-a-backup-object

Procédure d’urgence pour restaurer une base de données CNPG Kubernetes avec une seul réplicat en état Pending

Une fois que vous avez essayé toutes les méthodes standard indiquées ici pour restaurer votre base, mais que rien ne fonctionne, voici une méthode qui consiste à récupérer les données depuis le PVC du dernier réplicat encore vivant pour en extraire localement ensuite un dump propre a restaurer ensuite sur une instance CNPG vierge.

Étapes

  1. Copier les données du volume PVC

    Récupérez les données du répertoire PostgreSQL à l’aide de kubectl cp :

    kubectl cp mydb-1:/var/lib/postgresql/data .
    sudo chown -R 26:26 ./data
    
  2. Supprimer le fichier custom.conf

    Localisez et supprimez le fichier suivant dans les données copiées :

    rm data/pgdata/custom.conf
    
  3. Lancer un conteneur PostgreSQL pour récupération

    Montez les données et démarrez un conteneur de récupération, prendre garde à utiliser la même version de postgresql :

    docker run -n recovery -i -t --rm \
        -e PGDATA=/var/lib/postgresql/data/pgdata \
        -e POSTGRES_HOST_AUTH_METHOD=trust \
        -v $(pwd)/data:/var/lib/postgresql/data \
        docker.tedomum.net/tedomum/cloudnative-pg/postgresql:16.1
    
  4. Créer un dump PostgreSQL

    Une fois le conteneur lancé, exportez les données avec pg_dump :

    docker exec recovery pg_dump -Fc -d app > app.dump
    
  5. Supprimer le cluster PostgreSQL défectueux Supprimez le cluster défaillant :

    kubectl delete clusters.postgresql.cnpg.io mydb
    
  6. S’assurer que l’application utilisant la base est scale à zero

    kubectl scale --replicas 0 deployment -n namespace myapp
    
  7. Recréer un cluster vide avec ArgoCD

    Synchronisez ArgoCD pour recréer le cluster vide :

    En Clic-clic dans l’interface argocd, ou via la CLI que nous ne supportons pas pour le moment.

    argocd app sync <nom-de-l'application>
    
  8. Restaurer les données à partir du dump

    Importez le dump dans le nouveau cluster :

    kubectl exec -n <namespace> -i mydb-1 -c postgres -- \
        pg_restore --no-owner --role=app -d app --verbose < app.dump
    
  9. Autoriser l’écrasement des sauvegardes précédentes

    Ajoutez une annotation pour permettre au cluster de remplacer les sauvegardes précédentes :

    kubectl annotate clusters.postgresql.cnpg.io -n <namespace> mydb cnpg.io/skipEmptyWalArchiveCheck=enabled
    
  10. S’assurer que l’application utilisant la base est scale à son nombre de replica attentu

    kubectl scale --replicas 1 deployment -n namespace myapp
    
  11. Faire le ménage en local, si tous va bien

    docker rm -f recovery
    # rm -rf ./data, seulement si on est certain d'avoir sauver la base !
    

Notes