Faites-le par étapes. Ajoutez la colonne en nullable sans valeur par défaut pour que le changement ne touche que les métadonnées, déployez du code qui l'écrit sur tous les chemins tout en tolérant encore les nuls, remplissez par petits lots avec des pauses pour que verrous et réplication restent sains, vérifiez qu'il ne reste aucun nul, puis ajoutez la contrainte not null (validée séparément là où c'est possible) et retirez le code de repli. Jamais un seul ALTER bloquant sur une table de cette taille.
Pourquoi les recruteurs posent cette question
C'est la migration expand and contract, et elle sépare ceux qui ont livré sur de grosses tables de ceux qui ne l'ont pas fait. Le recruteur veut la séquence en plusieurs déploiements, la conscience qu'un ALTER naïf prend un verrou et réécrit la table, le découpage en lots pour protéger les réplicas, et la discipline de vérifier avant d'imposer. Ça sonde aussi si vous tenez compte des déploiements progressifs où ancien et nouveau code tournent en même temps.
Comment structurer votre réponse
- Rejetez explicitement la migration bloquante en une fois.
- Déroulez la séquence expand, remplissage, contract.
- Expliquez le découpage en lots et pourquoi il protège les réplicas.
- Tenez compte de l'ancien et du nouveau code qui tournent côte à côte.
Exemple de réponse
Ce que je ne ferai pas, c'est un seul ALTER qui ajoute une colonne not null avec une valeur par défaut, parce que sur un moteur plus ancien ça réécrit toute la table sous un verrou exclusif et le service est à terre pendant tout ce temps. Je fais donc l'expansion d'abord : je l'ajoute en nullable, ce qui sur un Postgres moderne est un changement de métadonnées et donc quasi instantané. Ensuite je déploie du code qui écrit la nouvelle colonne à chaque insertion et mise à jour tout en tolérant encore les nuls en lecture, parce que pendant un déploiement progressif les anciens et les nouveaux pods sont tous les deux en vie et je ne peux pas supposer autre chose. Puis le remplissage, par lots de peut-être dix mille lignes indexés par clé primaire avec une courte pause entre eux, en surveillant le retard de réplication pendant que ça tourne et en ralentissant s'il grimpe. Une fois le compte de nuls à zéro, j'ajoute la contrainte, et dans Postgres je l'ajouterais en not valid puis je la validerais séparément pour prendre un verrou plus faible. Le dernier déploiement retire le repli. Chaque étape est réversible individuellement.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment reviendriez-vous en arrière une fois le remplissage commencé ?
- Et si le remplissage a besoin de logique applicative ligne par ligne ?
- En quoi ça serait différent sur MySQL ?
Autres questions pour Ingénieur logiciel
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions