Przypuszczam, że ALTER TABLE czeka na blokadę metadanych i faktycznie nie zaczyna niczego zmieniać.
Co to jest blokada metadanych?
Po uruchomieniu dowolnego zapytania, takiego jak SELECT/INSERT/UPDATE/DELETE względem tabeli, musi ono uzyskać blokadę metadanych. Te zapytania nie blokują się nawzajem. Dowolna liczba zapytań tego typu może mieć blokadę metadanych.
Ale instrukcja DDL, taka jak CREATE/ALTER/DROP/TRUNCATE/RENAME lub zdarzenie CREATE TRIGGER lub LOCK TABLES, musi uzyskać wyłączność blokada metadanych. Jeśli jakakolwiek transakcja nadal utrzymuje blokadę metadanych, instrukcja DDL czeka.
Możesz to zademonstrować. Otwórz dwa okna terminala i otwórz klienta mysql w każdym oknie.
- Okno 1:
CREATE TABLE foo ( id int primary key );
- Okno 1:
START TRANSACTION;
-
Okno 1:
SELECT * FROM foo;
-- nie ma znaczenia, że w tabeli nie ma danych -
Okno 2:
DROP TABLE foo;
-- zauważ, że czeka -
Okno 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 | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
Możesz zobaczyć tabelę upuszczania oczekującą na blokadę metadanych tabeli. Tylko czekam. Jak długo to będzie czekać? Do czasu zakończenia transakcji w oknie 1. W końcu minie limit czasu po lock_wait_timeout
sekundy (domyślnie jest to 1 rok ).
-
Okno 1:
COMMIT;
-
Okno 2:Zauważ, że przestaje czekać i natychmiast upuszcza stół.
Więc co możesz zrobić? Upewnij się, że nie ma długotrwałych transakcji blokujących ALTER TABLE. Nawet transakcja, która wcześniej wykonała szybki SELECT względem Twojej tabeli, utrzyma blokadę metadanych do momentu zatwierdzenia transakcji.