# Sauvegarder une BDD

### Réaliser une sauvegarde d'une BDD

Pour créer une sauvegarde (**backup** en Anglais) de la base de données sur PostgreSQL c’est très simple car il existe un utilitaire `pg_dump` pour créer une sauvegarde même si la base données est en cours d’utilisation.

Les sauvegardes peuvent être produits dans des formats de script ou de fichier d'archive. elles sont constitué des fichiers en texte clair contenant les commandes SQL nécessaires pour reconstruire la base de données dans l'état où elle se trouvait au moment où elle a été enregistrée.

Tout d’abord nous allons créer un répertoire de sauvegarde pour centraliser les sauvegarde de base de données. Puis nous allons créer une sauvegarde pour vérifier que tout fonctionne. Ensuite nous allons créer un script de sauvegarde de BDD qui s’exécutera périodiquement.

#####   


##### Création du répertoire des sauvegardes

```shell
sudo mkdir -p /var/backup
```

##### Créer une sauvegarde

<span class="hljs-comment">Commande pour créer une sauvegarde. </span><span class="hljs-comment">Remplacer les variables par les bonnes valeur avant de l'exécuter.</span>

<table border="1" id="bkmrk-%24%7Bdb_user%7D-utilisate" style="border-collapse: collapse; width: 100%; height: 119.188px;"><tbody><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_USER}**</span></td><td style="width: 79.11%; height: 29.7969px;">Utilisateur ayant accès a la base de données</td></tr><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_PASSWORD}**</span></td><td style="width: 79.11%; height: 29.7969px;">Mot de passe de l'utilisateur</td></tr><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_HOST}**</span></td><td style="width: 79.11%; height: 29.7969px;">Host de la base de données : Adresse IP ou nom de domaine</td></tr><tr style="height: 29.7969px;"><td style="width: 20.89%; height: 29.7969px;"><span class="hljs-comment">**${DB\_NAME}**</span></td><td style="width: 79.11%; height: 29.7969px;">Nom de la base de données</td></tr></tbody></table>

```shell
/usr/bin/pg_dump postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME} | gzip -c > /var/backup/"${DB_NAME}-`date +%d-%m-%y_%T`".sql.gz;
```

Le fichier générer sera sous le nom suivant : <span class="hljs-comment">**${DB\_NAME}-${DATE}\_${HEURE}.sql.gz** </span>

### Automatiser la sauvegarde

Le processus de remplacement des variables pour réaliser une sauvegarde peut-être long et fatiguant. Il est serait plus pratique de créer un script regroupant les démarches précédentes.

##### Création du script

```shell
sudo nano save-database
```

##### Contenu du script 

```shell
#!/bin/bash

# # # # # # # # # # # # # # #
# SAVE DATABASE by gpatruno #
# # # # # # # # # # # # # # #

# définition des variables
backupdir='/etc/backup';
datefolder=`date +%m-%y`;
datescript=`date +%d-%m-%y_%T`;
DB_USER=postgres
DB_NAME=dbname
DB_PASSWORD=dbpassword
DB_HOST=localhost

echo "Répertoire de destination : $backupdir/$datefolder"
mkdir -p $backupdir/$datefolder;

echo  "PostgreSQL Backup for database : ${DB_NAME} start at " `date +%T`;
echo  "Exporting ${DB_NAME}";

# Pour conserver la version non compressé du fichier 'gzip -c fichier-de-sortie.ext > fichier-de-sortie.ext.gz'
# Sinon  compresse le fichier fichier-de-sortie et la remplace par la version compressé nommé avec l’extention *.gz 'gzip fichier-de-sortie.ext.gz'
echo "/usr/bin/pg_dump postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME} | gzip -c > $backupdir/$datefolder/"${DB_NAME}-$datescript".sql.gz;"
/usr/bin/pg_dump postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME} | gzip -c > $backupdir/$datefolder/"${DB_NAME}-$datescript".sql.gz;

echo  "done";
echo `date +%d-%m-%y`" "`date +%T`;
```

##### Donner le droit d'exécution

```shell
sudo chmod +x save-database
```

##### Exécuter le script

```shell
./save-database
```

L'exécution du script donne la sortie suivante :

```shell
Répertoire de destination : /var/backup
PostgreSQL Backup for database : dbname start at  16:38:07
Exporting dbname 
/usr/bin/pg_dump postgresql://postgres:dbpassword@localhost/dbname | gzip -c > /etc/backup/dbname-03-12-21_16:38:07.sql.gz;
done
03-12-21 16:38:07
```

### Exécution régulière

Afin de mettre en place une exécution régulière du script nous allons utiliser l'outil Linux appelé `Cron`. C'est un programme disponible sur les systèmes de type Unix (Linux, Mac Osx ...) permettant de planifier des taches régulières.

##### Ouvrir Crontab

```shell
crontab -e
```

##### Mettre le contenu suivant 

```shell
# Exécution du script tous les jours à 2h du matin
0 2 * * * /bin/sh /script/save-database
```

La tâche `Cron` ci-dessus sera exécutée tous les jours à 2 heures du matin et lancera un script `save-database` avec l'interpréteur `bash`. Ceci maintiendra la sauvegarde chaque jour.