· 8 min read

4 Outils pour sauvegarder vos bases de données

Sauvegarder vos bases de données est une tâche essentielle pour tout projet. Dans cet article, je vous propose de découvrir 4 outils pour sauvegarder vos bases de données, dont un outil spécifique pour les projets Symfony.

Sauvegarder vos bases de données est une tâche essentielle pour tout projet. Dans cet article, je vous propose de découvrir 4 outils pour sauvegarder vos bases de données, dont un outil spécifique pour les projets Symfony.

Introduction

A l’heure où les données sont de plus en plus importantes, il est essentiel de sauvegarder régulièrement vos bases de données. Cela vous permettra de récupérer vos données en cas de sinistre, de corruption ou de suppression accidentelle.

Nous avons tous connaissance de situations où une base de données a été perdue, et où il a fallu reconstruire les données à partir de zéro. Pour éviter cela, il est important de mettre en place une stratégie de sauvegarde efficace.

Dans cet article, je vous propose de (re)découvrir 4 outils pour sauvegarder vos bases de données (PostgreSQL), dont un outil spécifique pour les projets Symfony.

Nous n’aborderons pas les questions de stratégie de sauvegarde, de fréquence de sauvegarde ou de stockage des sauvegardes. Nous n’aborderons pas non plus les questions de types de sauvegarde (complète, incrémentale, différentielle). Ces questions sont importantes et doivent être traitées en fonction de vos besoins et de vos contraintes.

Un projet de test

Pour illustrer les outils de sauvegarde de bases de données, nous allons utiliser un projet Symfony avec une base de données PostgreSQL. Nous allons sauvegarder cette base de données à l’aide des outils que nous allons découvrir.

Création du projet Symfony

symfony new backup --webapp  
cd backup
docker compose up -d
symfony serve -d

Modification du fichier .compose.override.yaml

On modifie le fichier .compose.override.yaml pour exposer le port de la base de données sur le port 5432 :

version: '3'

services:
###> doctrine/doctrine-bundle ###
  database:
    ports:
      - "5432:5432"
###< doctrine/doctrine-bundle ###

Création d’une entité de test

  • Nous créons une simple entité test avec une propriété test de type string.
  • Nous générons la migration et mettons à jour la base de données.

Ecriture de données de test

  • On installe le FixturesBundle : composer require --dev orm-fixtures
  • On crée un jeu de données de test avec le FixturesBundle :
<?php

namespace App\DataFixtures;

use App\Entity\Test;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class AppFixtures extends Fixture
{
    public function load(ObjectManager $manager): void
    {
        for ($i=0; $i < 1000; $i++) { 
            $test = new Test();
            $test->setTest('Test '.$i);
            $manager->persist($test);
        }

        $manager->flush();
    }
}
  • On charge les fixtures : symfony console doctrine:fixtures:load
  • On vérifie que les données ont bien été insérées dans la base de données symfony console doctrine:query:sql 'SELECT COUNT(*) FROM test'

1. pg_dump & pg_restore : Les classiques

pg_dump et pg_restore sont des outils en ligne de commande fournis avec PostgreSQL. Ils permettent de sauvegarder et de restaurer des bases de données PostgreSQL très simplement mais très efficacement.

L’avantage de ces outils est qu’ils sont disponibles quasiement partout où PostgreSQL est installé, et qu’ils sont très simples à utiliser.

Sauvegarde et restauration d’une base de données au format “texte”

Le format “texte” est le format par défaut de pg_dump. Il est lisible par un humain, mais il est moins performant que le format “archive” que nous verrons plus tard.

Pour sauvegarder une base de données PostgreSQL avec pg_dump, il suffit de lancer la commande suivante :

pg_dump -U app -h 127.0.0.1 -d app > app.sql

Cette commande va sauvegarder la base de données app dans le fichier app.sql.

Pour restaurer une base de données PostgreSQL avec pg_restore, il suffit de lancer la commande suivante :

psql -U app -h 127.0.0.1 -d app < app.sql

Sauvegarde et restauration d’une base de données au format “archive”

Le format “archive” est un format binaire qui est plus performant que le format “texte”. Il est recommandé pour les bases de données de taille importante, il compresse les données et les index.

Pour sauvegarder une base de données PostgreSQL avec pg_dump au format “archive”, il suffit de lancer la commande suivante :

pg_dump -U app -h 127.0.0.1 -d app -F c -f app.dump

Cette commande va sauvegarder la base de données app dans le fichier app.dump.

Pour restaurer une base de données PostgreSQL avec pg_restore au format “archive”, il suffit de lancer la commande suivante :

pg_restore -U app -h 127.0.0.1 -d app -c app.dump

2. DbToolsBundle : Le spécialiste Symfony

Le bundle DbToolsBundle est un bundle Symfony qui permet de sauvegarder et de restaurer vos bases de données. Il propose une interface en ligne de commande pour effectuer des sauvegardes et des restaurations de bases de données.

Bonus, il propose également une commande pour anonymiser les données de vos bases de données. Cela peut être utile pour tester votre application avec des données réalistes, sans exposer les données sensibles de vos utilisateurs (mais ce n’est pas le sujet de cet article 😉).

Installation

Au moment de l’écriture de cet article en mars 2024, nous devons downgrade la version de doctrine/orm à 2.15 pour que le bundle fonctionne correctement dans le fichier composer.json (uniquement si vous utilisez une version supérieure à 3.0 de doctrine/orm) :

{
    "require": {
    // ...
        "doctrine/orm": "^2.15"
    // ...
    }
}

Puis nous éxécutons la commande suivante pour appliquer les changements :

composer update doctrine/orm

Nous pouvons maintenant installer le bundle :

composer require makinacorpus/db-tools-bundle

Copions le fichier de configuration par défaut du bundle :

cp vendor/makinacorpus/db-tools-bundle/config/packages/db_tools.yaml config/packages/

Et enfin, testons si nous disposons de tous les outils nécessaires pour utiliser le bundle :

symfony console db-tools:check

Réalisation d’une sauvegarde

L’avantage de DbToolsBundle est qu’il propose une commande pour sauvegarder une base de données hyper simplement :

symfony console db-tools:backup

Restauration d’une sauvegarde sur la même base de données

Pour restaurer une sauvegarde sur la même base de données, il suffit de lancer la commande suivante :

symfony console db-tools:restore

La commande vous demandera de choisir la sauvegarde à restaurer.

Attention : La restauration d’une sauvegarde écrasera les données existantes de la base de données.

3. docker-db-backup : Beaucoup plus complet

docker-db-backup est un outil beaucoup plus complet que DbToolsBundle. Il permet de sauvegarder et de restaurer des bases de données MySQL, PostgreSQL, MariaDB, MongoDB, Redis, SQLite, et bien d’autres.

Installation et configuration

Pour utiliser docker-db-backup, nous allons l’ajouter à notre projet Symfony en tant que service Docker. Pour cela, nous allons ajouter le service suivant à notre fichier compose.yaml :

###> tiredofit/db-backup ###
  db-backup:
    image: tiredofit/db-backup:latest
    environment:
      - TIMEZONE=Europe/Paris
      - CONTAINER_NAME=db-backup
      - CONTAINER_ENABLE_MONITORING=FALSE
      - BACKUP_JOB_CONCURRENCY=1     # Only run one job at a time
      - DEFAULT_CHECKSUM=NONE        # Don't create checksums
      - DEFAULT_COMPRESSION=ZSTD     # Compress all with ZSTD
      - DEFAULT_BACKUP_INTERVAL=1440   # Backup every 1440 minutes
      - DEFAULT_BACKUP_BEGIN=0000      # Start backing up at midnight
      - DEFAULT_CLEANUP_TIME=8640    # Cleanup backups after a week

      - DB01_TYPE=postgres
      - DB01_HOST=database
      - DB01_NAME=app
      - DB01_USER=app
      - DB01_PASS=!ChangeMe!
      - DB01_BACKUP_INTERVAL=1        # (override) Backup every 1 minutes
      - DB01_BACKUP_BEGIN=+1           # (override) Backup starts immediately
      - DB01_CLEANUP_TIME=180        # (override) Cleanup backups they are older than 180 minutes
      - DB01_CHECKSUM=SHA1           # (override) Create a SHA1 checksum
      - DB01_COMPRESSION=GZ          # (override) Compress with GZIP
    volumes:
      - ./backup:/backup
###< tiredofit/db-backup ###

Ce service va sauvegarder les bases de données app toutes les minutes, et conserver les sauvegardes pendant 3 heures.

La seule chose à faire est de lancer le service :

docker compose up -d

Restauration d’une sauvegarde

La restauration d’une sauvegarde avec docker-db-backup est un peu plus complexe que DbToolsBundle. Il faut éxécuter une commande dans le conteneur db-backup pour restaurer une sauvegarde.

Personnellement, j’utilise Lazydocker pour exécuter des commandes dans les conteneurs Docker. C’est un outil très pratique pour gérer les conteneurs Docker en ligne de commande.

Une fois dans le conteneur db-backup, il suffit de lancer la commande suivante pour restaurer une sauvegarde :

restore pgsql_app_database_20240328-152053.sql.gz postgres database app app !ChangeMe! 5432

4. Ottomatik : La solution tout-en-un

Ottomatik est une solution tout-en-un pour sauvegarder vos bases de données. Elle propose une interface web et une API pour sauvegarder et restaurer vos bases de données en quelques clics.

La solution Ottomatik est payante, mais elle propose un plan gratuit, idéal pour les projets personnels ou les projets de petite taille.

Mise en place d’une instance PostgreSQL

Pour utiliser Ottomatik, créez vous une instance PostgreSQL chez le fournisseur de votre choix. Pour la suite de cet article, je vais utiliser une instance PostgreSQL chez Hidora.

Création de la base de données et fixtures

Pour illustrer le fonctionnement d’Ottomatik, nous allons insérer des fausses données dans notre nouvelle instance PostgreSQL.

Comme nous avons dèja tout ce qu’il faut dans notre projet Symfony, nous allons simplement le “brancher” sur notre nouvelle base de données PostgreSQL.

Pour cela, nous allons modifier le fichier .env.local :

DATABASE_URL="postgresql://webadmin:*********@adresse-ip-v4:5432/app?serverVersion=16&charset=utf8"

Puis nous jouons les migrations et les fixtures :

symfony console d:d:c
symfony console d:m:m
symfony console d:f:l

Configuration d’Ottomatik

Pour la suite, il est nécessaire de créer un compte sur Ottomatik.

  • Première étape, indiquer la source de la sauvegarde, dans notre cas, il s’agit de PostgreSQL.

  • Deuxième étape, indiquer le serveur en charge de la sauvegarde. En effet, Ottomatik propose d’éxécuter les sauvegardes sur leurs serveurs, ou sur votre propre serveur. Pour la démonstration, nous choississons les serveurs Ottomatik.

  • Troisième étape, indiquer les informations de connexion à la base de données source.

  • Quatrième étape, et c’est la toute la puissance d’Ottomatik, indiquer vos fréquences de sauvegarde. Ottomatik propose des fréquences de sauvegarde très précises, allant de toutes les heures à tous les mois, avec dèja des règle de rétention de sauvegarde.

  • Cinquième étape, appréciez le spectacle. Ottomatik va se charger de sauvegarder votre base de données à la fréquence que vous avez indiquée. Vous n’avez plus rien à faire, cool non ?

Conclusion

Sauvegarder vos bases de données est une tâche essentielle pour tout projet. Dans cet article, nous avons découvert 4 outils pour sauvegarder vos bases de données, du plus simple au plus automatisé.

Il existe bien sûr une multitude d’autres outils pour sauvegarder vos bases de données, mais j’espère que cet article vous aura donné un bon aperçu des possibilités qui s’offrent à vous.

N’oubliez pas que la sauvegarde de vos bases de données est une tâche importante, et qu’elle doit être réalisée régulièrement. N’attendez pas d’avoir perdu vos données pour vous rendre compte de l’importance de la sauvegarde, il sera alors trop tard !

Back to Blog