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.)
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 unALTER 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.
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