Предполагам, че ALTER TABLE чака заключване на метаданни и всъщност не е започнало да променя нищо.
Какво е заключване на метаданни?
Когато стартирате заявка като SELECT/INSERT/UPDATE/DELETE срещу таблица, тя трябва да получи заключване на метаданни. Тези заявки не се блокират една друга. Всеки брой заявки от този тип могат да имат заключване на метаданни.
Но DDL израз като CREATE/ALTER/DROP/TRUNCATE/RENAME или събитие CREATE TRIGGER или LOCK TABLES трябва да придобие изключителен заключване на метаданни. Ако някоя транзакция все още съдържа заключване на метаданни, операторът DDL изчаква.
Можете да демонстрирате това. Отворете два терминални прозореца и отворете mysql клиента във всеки прозорец.
- Прозорец 1:
CREATE TABLE foo ( id int primary key );
- Прозорец 1:
START TRANSACTION;
-
Прозорец 1:
SELECT * FROM foo;
-- няма значение, че таблицата няма данни -
Прозорец 2:
DROP TABLE foo;
-- забележете, че чака -
Прозорец 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 | +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
Можете да видите падащата таблица, чакаща заключването на метаданните на таблицата. Просто чакам. Колко време ще чака? Докато транзакцията в прозорец 1 завърши. В крайна сметка ще изтече след lock_wait_timeout
секунди (по подразбиране това е зададено на 1 година ).
-
Прозорец 1:
COMMIT;
-
Прозорец 2:Забележете, че спира да чака и веднага изпуска таблицата.
И така, какво можете да направите? Уверете се, че няма дълготрайни транзакции, блокиращи вашата ALTER TABLE. Дори транзакция, която е изпълнила бърз SELECT срещу вашата таблица по-рано, ще задържи заключването на своите метаданни, докато транзакцията не се ангажира.