Retour au blog
DevOps

Migrations base de données sans interruption

12 Oct 2024 10 min
Database Migration DevOps

Zero-downtime database migrations

Les migrations de base de données sont souvent la partie la plus risquée d'un déploiement. Voici comment les réaliser sans interruption.

Règles fondamentales

  • Ne jamais supprimer une colonne utilisée par le code en production
  • Toujours ajouter les nouvelles colonnes comme nullable
  • Séparer les migrations de schéma des migrations de données
  • Tester les migrations sur une copie de la base de production

Pattern Expand-Contract

Phase 1 - Expand : Ajouter la nouvelle structure

-- Migration 1 : Ajouter la nouvelle colonne
ALTER TABLE users ADD COLUMN email_verified BOOLEAN DEFAULT FALSE;

-- Migration 2 : Remplir les données
UPDATE users SET email_verified = TRUE WHERE verified_at IS NOT NULL;

Phase 2 - Déployer le code utilisant les deux colonnes

Phase 3 - Contract : Supprimer l'ancienne structure

-- Migration 3 : Supprimer l'ancienne colonne
ALTER TABLE users DROP COLUMN verified_at;

Migrations Doctrine optimisées

public function up(Schema $schema): void
{
    // Utiliser des opérations non-bloquantes
    $this->addSql('ALTER TABLE orders ADD COLUMN status VARCHAR(50) DEFAULT NULL');

    // Pour les grandes tables, utiliser pt-online-schema-change
    // ou gh-ost pour éviter les locks
}

Outils recommandés

  • pt-online-schema-change : migrations sans lock pour MySQL
  • gh-ost : alternative GitHub pour les migrations en ligne
  • Doctrine Migrations : gestion versionnée des migrations
  • Flyway : outil de migration multi-base