Sauvegarder et restaurer une base PostgreSQL
Ce guide crée une destination de sauvegarde depuis la console Hikube, programme la sauvegarde quotidienne d'une base PostgreSQL, en lance une à la demande, puis restaure l'archive obtenue. La démarche est la même pour une base MariaDB, une VM ou un disque.
Prérequis
- Un projet Hikube contenant :
- un bucket S3 (voir Créer un bucket) ;
- une base PostgreSQL, par exemple
orders-db(voir Démarrage rapide PostgreSQL).
- Pour l'onglet API : une clé d'API
admindu projet et les variablesHIKUBE_API,HIKUBE_API_KEYetPROJECT_ID(voir Préparer l'environnement) ; les exemples utilisentcurletjq. Remplacez<bucket>par le nom de votre bucket.
Étape 1 : Ouvrir la création de destination
- Console
- API
- Dans le menu latéral, ouvrez Infrastructure > Sauvegardes.
- Ouvrez l'onglet Destinations, puis cliquez sur Créer une destination.
La page Nouvelle destination s'ouvre.
Avec l'API, il n'y a pas de page de création. Vérifiez que la clé donne accès au service en listant les destinations du projet :
curl -sS "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/destinations" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" | jq '{totalCount, destinations: [.destinations[]?.name]}'
Étape 2 : Configurer et valider
- Console
- API
- Nom :
quotidien(minuscules, chiffres et tirets, 40 caractères au plus). - Bucket : choisissez le bucket du projet.
- Identifiants : laissez Créer un utilisateur dédié et saisissez un Nom de l'utilisateur, par exemple
backup. Ses identifiants ne serviront qu'aux sauvegardes. - Rétention (jours) : conservez
30. - Cliquez sur Créer.
La console affiche Destination créée : « quotidien » est en préparation.
Créez l'utilisateur dédié du bucket, puis la destination :
curl -sS -X POST "$HIKUBE_API/bucket/v1alpha1/projects/$PROJECT_ID/buckets/<bucket>/users" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"username": "backup", "config": {"readonly": false}}' > /dev/null
curl -sS -X POST "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/destinations" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "quotidien", "bucketName": "<bucket>", "bucketUser": "backup", "retentionDays": 30}' \
| jq '.destination | {name, status}'
Étape 3 : Vérifier l'état
- Console
- API
Dans l'onglet Destinations, l'état de quotidien passe de En préparation à Prête en quelques instants.
Résultat attendu : destination Prête, avec le bucket, l'utilisateur et la rétention de 30 jours.
curl -sS "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/destinations/quotidien" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" | jq '.destination | {status, bucketName, bucketUser, retentionDays}'
Résultat attendu : status passe de provisioning à ready.
Étape 4 : Programmer et lancer une sauvegarde
- Console
- API
- Ouvrez PostgreSQL, cliquez sur
orders-db, puis sur l'onglet Sauvegardes. - Dans Programmation, cliquez sur Programmer. La fenêtre Programmer une sauvegarde s'ouvre :
- Nom du plan :
orders-db-quotidien; - Destination :
quotidien; - onglet Préréglage, Fréquence : Chaque jour, Heure
02, Minute00(heure locale).
- Nom du plan :
- Cliquez sur Programmer. La carte Programmation affiche l'horaire et la Prochaine exécution.
- Dans Sauvegarde à la demande, cliquez sur Sauvegarder maintenant. La console affiche Sauvegarde démarrée vers « quotidien ».
La sauvegarde apparaît dans État des exécutions, puis dans la liste des archives de la base.
Résultat attendu : au bout de quelques minutes, l'archive passe à Prête.
Programmez une sauvegarde quotidienne à 01:00 UTC, puis lancez une sauvegarde immédiate :
curl -sS -X POST "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/plans" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "orders-db-quotidien", "application": {"kind": "postgres", "name": "orders-db"}, "destination": "quotidien", "cron": "0 1 * * *"}' \
| jq '.plan | {status, nextRunAt}'
JOB=$(curl -sS -X POST "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/jobs" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"application": {"kind": "postgres", "name": "orders-db"}, "destination": "quotidien"}' | jq -r '.job.name')
curl -sS "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/jobs/$JOB" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" | jq '.job | {status, backup}'
Résultat attendu : au bout de quelques minutes, status vaut succeeded et backup nomme l'archive. Notez ce nom : BACKUP=<nom de l'archive>.
L'heure choisie dans le préréglage est convertie en UTC. Elle se décalera donc d'une heure en heure locale au prochain changement d'heure. Voir Concepts.
Étape 5 : Restaurer et vérifier
Ajoutez d'abord une donnée témoin, pour constater ensuite son absence après restauration :
CREATE TABLE apres_sauvegarde (id int);
Puis restaurez l'archive sur la base d'origine :
- Console
- API
- Dans l'onglet Sauvegardes de
orders-db, sur la ligne de l'archive, cliquez sur Restaurer. - Cible de la restauration : Sur la base d'origine.
- Restaurer jusqu'à : laissez l'état de la sauvegarde sélectionnée.
- Saisissez
orders-dbpour confirmer, puis cliquez sur le bouton de restauration (Restaurer l'état de la sauvegarde du…).
curl -sS -X POST "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/restores" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"backup\": \"$BACKUP\", \"confirmDestructive\": true}" | jq '.restore | {name, status}'
Suivez la restauration avec GET $HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/restores/<nom> jusqu'à status succeeded.
Une restauration en place écrase le contenu actuel de la base. Pour tester sans toucher à vos données, créez une seconde base PostgreSQL vide de la même version et choisissez Sur une autre base de données.
La restauration apparaît dans Restaurations, puis passe à Réussie. Reconnectez-vous à la base :
SELECT to_regclass('apres_sauvegarde');
Résultat attendu : NULL : la table créée après la sauvegarde n'existe plus.
Étape 6 : Dépannage rapide
| Symptôme | Action |
|---|---|
| Aucun bucket dans ce projet | Créez un bucket depuis Buckets S3, puis revenez à la création de destination. |
| La destination reste En erreur | Le bucket ou son utilisateur n'est plus lisible : voir Dépannage. |
| Aucune destination prête dans ce projet dans la fenêtre de programmation | Attendez que la destination soit Prête. |
| L'archive est Échouée | Lisez le message de l'exécution dans Sauvegardes > Activité, puis voir Dépannage. |
| La restauration est refusée | Voir Dépannage. |
Étape 7 : Nettoyage
- Console
- API
- Dans l'onglet Sauvegardes de
orders-db, carte Programmation, cliquez sur Supprimer et confirmez. Les archives sont conservées. - Supprimez les archives de test avec Supprimer sur chaque ligne. Pour PostgreSQL, seule la fiche disparaît : les données restent dans le bucket, que vous pouvez vider depuis Buckets S3.
- Dans Sauvegardes > Destinations, ouvrez le menu de
quotidienet choisissez Supprimer. La suppression est refusée tant qu'une programmation, une sauvegarde ou une restauration l'utilise.
curl -sS -X DELETE "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/plans/orders-db-quotidien" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY"
curl -sS -X DELETE "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/backups/$BACKUP" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY"
curl -sS -X DELETE "$HIKUBE_API/backup/v1alpha1/projects/$PROJECT_ID/destinations/quotidien" \
-H "X-Hikube-Api-Key: $HIKUBE_API_KEY"
Pour PostgreSQL, seule la fiche de l'archive disparaît : les données restent dans le bucket.