</>
Plan du cours — 48/64

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 TABLE qui 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érationComportementBonne pratique
Ajouter une colonne nullable ou avec DEFAULT constantInstantané (PostgreSQL 11+), sans réécritureSûr
Créer un indexBloque les écritures pendant la constructionCREATE INDEX CONCURRENTLY (hors transaction, plus long, peut laisser un index INVALID à supprimer et relancer)
Ajouter une contrainte CHECK / clé étrangèreParcourt toute la table sous verrouADD CONSTRAINT ... NOT VALID puis VALIDATE CONSTRAINT (verrou léger)
Passer une colonne en NOT NULLParcourt la tableAjouter 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 colonneSouvent une réécriture complèteNouvelle colonne + copie par lots + bascule (expand/contract)
Renommer / supprimer une colonneInstantané côté baseCasse 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.