sql >> Databasteknik >  >> RDS >> Mysql

MySQL ALTER TABLE tar lång tid i litet bord

Jag skulle gissa att ALTER TABLE väntar på ett metadatalås, och det har faktiskt inte börjat ändra någonting.

Vad är ett metadatalås?

När du kör en fråga som SELECT/INSERT/UPDATE/DELETE mot en tabell måste den få ett metadatalås. Dessa frågor blockerar inte varandra. Valfritt antal frågor av den typen kan ha ett metadatalås.

Men en DDL-sats som CREATE/ALTER/DROP/TRUNCATE/RENAME eller händelse CREATE TRIGGER eller LOCK TABLES måste få en exklusiv metadatalås. Om någon transaktion fortfarande har ett metadatalås, väntar DDL-satsen.

Du kan visa detta. Öppna två terminalfönster och öppna mysql-klienten i varje fönster.

  • Fönster 1:CREATE TABLE foo ( id int primary key );
  • Fönster 1:START TRANSACTION;
  • Fönster 1:SELECT * FROM foo; -- det spelar ingen roll att tabellen saknar data

  • Fönster 2:DROP TABLE foo; -- märk att det väntar

  • Fönster 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 släpptabellen som väntar på tabellens metadatalås. Väntar bara. Hur länge kommer det att vänta? Tills transaktionen i fönster 1 slutförs. Så småningom kommer det att ta slut efter lock_wait_timeout sekunder (som standard är detta inställt på 1 år ).

  • Fönster 1:COMMIT;

  • Fönster 2:Lägg märke till att den slutar vänta och att den omedelbart släpper bordet.

Så vad kan du göra? Se till att det inte finns några långvariga transaktioner som blockerar din ALTER TABLE. Även en transaktion som körde en snabb SELECT mot din tabell tidigare kommer att hålla sitt metadatalås tills transaktionen genomförs.




  1. MySQL Update Query med hjälp av en vänsterkoppling

  2. Exportera data från MySQL till Excel med UTF-8-kodning

  3. JPA:hur behåller jag en sträng i ett databasfält, skriv MYSQL Text

  4. Flera var i