Migrations en ligne sans interruption
AvancéSur une table active, un simple ALTER TABLE peut poser un verrou exclusif et mettre toute l'application à genoux : il faut connaître ce qui est instantané et ce qui bloque.
Toujours protéger la migration#
SET lock_timeout = '3s'; -- abandonne au lieu de faire la queue derrière une transaction longue
SET statement_timeout = '15min';
Piège : un
ALTER TABLEqui attend un verrou bloque toutes les requêtes suivantes sur cette table derrière lui (file d'attente de verrous).lock_timeoutévite la catastrophe : la migration échoue vite et vous la relancez.
Opérations courantes#
| Opération | Comportement | Bonne pratique |
|---|---|---|
Ajouter une colonne nullable ou avec DEFAULT constant | Instantané (PostgreSQL 11+), sans réécriture | Sûr |
| Créer un index | Bloque les écritures pendant la construction | CREATE INDEX CONCURRENTLY (hors transaction, plus long, peut laisser un index INVALID à supprimer et relancer) |
Ajouter une contrainte CHECK / clé étrangère | Parcourt toute la table sous verrou | ADD CONSTRAINT ... NOT VALID puis VALIDATE CONSTRAINT (verrou léger) |
Passer une colonne en NOT NULL | Parcourt la table | Ajouter un CHECK (col IS NOT NULL) NOT VALID, le valider, puis SET NOT NULL (PostgreSQL 12+ évite le second parcours) |
| Changer le type d'une colonne | Souvent une réécriture complète | Nouvelle colonne + copie par lots + bascule (expand/contract) |
| Renommer / supprimer une colonne | Instantané côté base | Casse le code déployé : découpez en plusieurs déploiements |
CREATE INDEX CONCURRENTLY commandes_client_idx ON commandes (client_id);
ALTER TABLE commandes ADD CONSTRAINT commandes_client_fk
FOREIGN KEY (client_id) REFERENCES clients (id) NOT VALID;
ALTER TABLE commandes VALIDATE CONSTRAINT commandes_client_fk;
Remplir une grande table par lots#
UPDATE commandes SET nouvelle_colonne = ancienne_colonne
WHERE id BETWEEN 1 AND 50000 AND nouvelle_colonne IS NULL; -- répéter par tranches, avec une pause
Les lots limitent la durée des verrous, laissent respirer l'autovacuum et la réplication.