Ik vermoed dat de ALTER TABLE wacht op een metadatavergrendeling en dat deze eigenlijk niets begint te veranderen.
Wat is een metadatavergrendeling?
Wanneer u een query zoals SELECT/INSERT/UPDATE/DELETE tegen een tabel uitvoert, moet deze een metagegevensvergrendeling verkrijgen. Die queries blokkeren elkaar niet. Elk aantal zoekopdrachten van dat type kan een metadatavergrendeling hebben.
Maar een DDL-statement zoals CREATE/ALTER/DROP/TRUNCATE/RENAME of event CREATE TRIGGER of LOCK TABLES, moet een exclusief krijgen metagegevens vergrendelen. Als een transactie nog steeds een metadata-lock bevat, wacht het DDL-statement.
U kunt dit aantonen. Open twee terminalvensters en open de mysql-client in elk venster.
- Venster 1:
CREATE TABLE foo ( id int primary key );
- Venster 1:
START TRANSACTION;
-
Venster 1:
SELECT * FROM foo;
-- het maakt niet uit dat de tabel geen gegevens heeft -
Venster 2:
DROP TABLE foo;
-- merk op dat het wacht -
Venster 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 | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
U kunt de neerzettabel zien wachten op de metagegevensvergrendeling van de tabel. Gewoon aan het wachten. Hoe lang zal het wachten? Totdat de transactie in venster 1 is voltooid. Uiteindelijk zal er een time-out optreden na lock_wait_timeout
seconden (standaard is dit ingesteld op 1 jaar ).
-
Venster 1:
COMMIT;
-
Venster 2:Merk op dat het stopt met wachten en het laat de tafel onmiddellijk vallen.
Dus wat kan je doen? Zorg ervoor dat er geen langlopende transacties zijn die uw ALTER TABLE blokkeren. Zelfs een transactie die eerder een snelle SELECT tegen uw tafel heeft uitgevoerd, houdt de metagegevensvergrendeling vast totdat de transactie wordt vastgelegd.