web-dev-qa-db-fra.com

ALTER TABLE - ADD COLUMN verrouille-t-il la table?

J'ai une question sur le ALTER TABLE ... ADD COLUMN Instruction DDL .

Sur une instance Amazon RDS avec MariaDB v10.2, j'ai remarqué que les instructions INSERT se terminent et que les lignes sont correctement insérées dans le tableau (comme vérifié via SELECT) avant un ALTER TABLE ... ADD COLUMN sur les finitions de la table.

Aucune instruction DML qui effectue une écriture ne doit-elle être mise en file d'attente jusqu'à ce que ALTER TABLE l'opération se termine?

Je poste cette question car on m'a demandé d'effectuer un test pour vérifier s'il est possible d'exécuter ALTER TABLE ... ADD COLUMN sur une base de données de production en direct pendant les heures ouvrables, sur une base de données très utilisée, sur des tables de plusieurs millions de lignes - ce que je trouve très mal avisé. Même si ALTER TABLE ne place pas de verrou sur la table, il devra attendre que toute connexion n'utilise plus la table (en raison de la connexion plaçant un verrou de métadonnées ), ce qui peut arriver beaucoup plus tard.
EDIT: Apparemment, cette évaluation était trop pessimiste. J'ai fait plusieurs tests avec mysqlslap effectuant des opérations lourdes sur la table (INSERT, UPDATE, DELETE instructions et SELECT avec LIKE pour éviter d'utiliser des index) sur 150 connexions simultanées simulées tandis que ALTER TABLE ... ADD COLUMN s'exécute; le profilage montre des verrous de métadonnées mais avec des temps d'attente courts (1 sec chacun), et la modification de la table se termine en environ 30 minutes, contre 10 minutes sans exécution d'instructions SQL. Bien que cela soit satisfaisant, d'un autre côté, j'aimerais savoir s'il est sûr de supposer que les instructions DDL ne sont pas bloquantes.

(Il convient probablement de noter qu'il existe un Instant ADD COLUMN fonctionnalité sur InnoDB , qui permet l'ajout instantané d'une colonne à la table (sous contraintes spécifiques), mais elle n'est pas disponible avant la v10.3.2.)

6
dr_

Oui, cela verrouille la table. Depuis les documents sur MySQL 8,

L'exception mentionnée plus haut est que ALTER TABLE bloque les lectures (pas seulement les écritures) au point où il est prêt à effacer les structures de table obsolètes des caches de table et de définition de table. À ce stade, il doit acquérir un verrou exclusif. Pour ce faire, il attend la fin des lecteurs actuels et bloque les nouvelles lectures et écritures.

Et à partir des documents que vous avez liés , c'est assez explicite

Avec instant ADD COLUMN, vous pouvez profiter de tous les avantages du stockage structuré sans l'inconvénient d'avoir à reconstruire la table.

Comme vous l'avez dit, vous êtes sur 10.2. Il semble donc que l'ajout d'une colonne nécessite la reconstruction de la table entière.

Quant à ce qui se passe lorsque vous ne pouvez pas recevoir de verrou,

J'ai remarqué que les instructions INSERT sont terminées et que les lignes sont correctement insérées dans le tableau (comme vérifié via SELECT) avant un ALTER TABLE ... ADD COLUMN sur les finitions de la table.

Oui, c'est généralement ce qui se passe pendant un verrou, mais sachez que ce n'est pas toujours ce qui se passe. Parfois, les relevés et les transactions cessent d'attendre. Parfois, les backends et les pools sont récoltés lorsqu'ils sont bloqués à attendre. Il est toujours plus sûr de le faire pendant les temps d'arrêt, d'avoir des délais d'expiration et de détecter les erreurs des bibliothèques lorsque les délais d'expiration expirent. Tant que vous utilisez des transactions, les choses sont annulées si quelque chose est déclenché et ne peut pas être verrouillé avant l'expiration - tout sera casher.

3
Evan Carroll

cela dépend en fait de la table alter spécifique, mais dans tous les cas, je suggérerais de rechercher des outils de changement de schéma en ligne comme ghost (de GitHub) ou pt-online-schema-change (par percona).

Les deux outils effectuent le changement sur une table séparée et commutent avec l'original à la fin - vous pouvez même conserver l'ancien pour une restauration rapide.

C’est une route beaucoup plus sûre, en particulier pour les tables chargées

2
cohenjo