sql >> Database teknologi >  >> RDS >> Mysql

MySQL ALTER TABLE tager lang tid i lille bord

Jeg vil gætte på, at ALTER TABLE venter på en metadatalås, og den begynder faktisk ikke at ændre noget.

Hvad er en metadatalås?

Når du kører en forespørgsel som SELECT/INSERT/UPDATE/DELETE mod en tabel, skal den anskaffe en metadatalås. Disse forespørgsler blokerer ikke hinanden. Et hvilket som helst antal forespørgsler af den type kan have en metadatalås.

Men en DDL-sætning som CREATE/ALTER/DROP/TRUNCATE/RENAME eller begivenhed CREATE TRIGGER eller LOCK TABLES skal erhverve en eksklusiv metadatalås. Hvis en transaktion stadig har en metadatalås, venter DDL-sætningen.

Du kan demonstrere dette. Åbn to terminalvinduer og åbn mysql-klienten i hvert vindue.

  • Vindue 1:CREATE TABLE foo ( id int primary key );
  • Vindue 1:START TRANSACTION;
  • Vindue 1:SELECT * FROM foo; -- det gør ikke noget, at tabellen ikke har nogen data

  • Vindue 2:DROP TABLE foo; -- bemærk, at det venter

  • Vindue 1:SHOW PROCESSLIST;

    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+ | 679 | root | localhost | test | Query | 0 | starting | show processlist | 0 | 0 | | 680 | root | localhost | test | Query | 4 | Waiting for table metadata lock | drop table foo | 0 | 0 | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+

Du kan se drop-tabellen, der venter på tabellens metadatalås. Venter bare. Hvor længe vil det vente? Indtil transaktionen i vindue 1 er fuldført. Til sidst vil den timeout efter lock_wait_timeout sekunder (som standard er dette indstillet til 1 år ).

  • Vindue 1:COMMIT;

  • Vindue 2:Bemærk, at den holder op med at vente, og den taber bordet med det samme.

Så hvad kan du gøre? Sørg for, at der ikke er nogen langvarige transaktioner, der blokerer din ALTER TABLE. Selv en transaktion, der kørte en hurtig SELECT mod din tabel tidligere, vil holde sin metadatalås, indtil transaktionen forpligtes.




  1. Opret bruger i Azure SQL-database ved hjælp af Azure-funktioner?

  2. Hvordan returnerer man flere værdier i én kolonne (T-SQL)?

  3. Hvad er den bedste måde at finde ud af, hvilken version af Oracle-klienten jeg kører på?

  4. Sådan installeres SQL Server Manager Studio (SSMS) - SQL Server / TSQL vejledning del 1