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