Я ожидаю, что вы видите что-то вроде этого:
mysql> show processlist;
+----+-----------------+-----------+------+---------+------+---------------------------------+------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+------+---------------------------------+------------------------+
| 8 | msandbox | localhost | test | Query | 435 | Waiting for table metadata lock | truncate table mytable |
Попробуйте этот эксперимент в тестовом экземпляре MySQL (как в вашей локальной среде разработки): откройте два окна оболочки и запустите клиент mysql. Создать тестовую таблицу.
mysql> create table test.mytable ( answer int );
mysql> insert into test.mytable set answer = 42;
Теперь запустите транзакцию и запросите таблицу, но пока не фиксируйте транзакцию.
mysql> begin;
mysql> select * from test.mytable;
+--------+
| answer |
+--------+
| 42 |
+--------+
Во втором окне попробуйте усечь эту таблицу.
mysql> truncate table mytable;
<hangs>
Он ожидает блокировки метаданных . Он будет ждать в течение количества секунд, равных параметру конфигурации lock_wait_timeout .
Теперь вернитесь к первому окну и подтвердите.
mysql> commit;
Теперь посмотрите, во втором окне, TRUNCATE TABLE перестает ждать и, наконец, выполняет свою работу, обрезая таблицу.
Любой оператор DDL, такой как ALTER TABLE, TRUNCATE TABLE, DROP TABLE, должен получить эксклюзивную блокировку метаданных для таблицы. Но любая транзакция, которая читала или записывала эту таблицу, содержит блокировку общих метаданных. Это означает, что многие параллельные сеансы могут выполнять свою работу, например SELECT / UPDATE / INSERT / DELETE, не блокируя друг друга (потому что их блокировки являются общими). Но для оператора DDL требуется исключительная блокировка метаданных, то есть не может существовать никакой другой блокировки метаданных, как общей, так и исключительной.
Так что, я думаю, есть какая-то транзакция, которая выполняла некоторые операции чтения или записи для вашей таблицы без фиксации. Либо сам запрос выполняется очень долго, либо запрос завершен, а транзакция - нет.
Вы должны выяснить, где находится незавершенная транзакция. Если вы используете MySQL 5.7 или более позднюю версию, вы можете читать таблицу sys.schema_lock_waits , пока один из операторов усеченной таблицы ожидает.
select * from sys.schema_table_lock_waits\G
*************************** 1. row ***************************
object_schema: test
object_name: mytable
waiting_thread_id: 47
waiting_pid: 8
waiting_account: msandbox@localhost
waiting_lock_type: EXCLUSIVE
waiting_lock_duration: TRANSACTION
waiting_query: truncate table mytable
waiting_query_secs: 625
waiting_query_rows_affected: 0
waiting_query_rows_examined: 0
blocking_thread_id: 48
blocking_pid: 9
blocking_account: msandbox@localhost
blocking_lock_type: SHARED_READ
blocking_lock_duration: TRANSACTION
sql_kill_blocking_query: KILL QUERY 9
sql_kill_blocking_connection: KILL 9
Это говорит нам, какой сеанс заблокирован, ожидая блокировки метаданных. waiting_pid
(8 в приведенном выше примере) соответствует Id
в списке процессов заблокированного сеанса.
blocking_pid
(9 в приведенном выше примере) соответствует Id
в списке процессов сеанса, который в данный момент удерживает блокировку и который блокирует таблицу усечений.
Он даже говорит вам, как именно убить сеанс, который удерживает блокировку:
mysql> KILL 9;
После того, как сеанс завершен, он должен освободить свои блокировки, и таблица усечения наконец завершается.
mysql> truncate table mytable;
Query OK, 0 rows affected (13 min 34.50 sec)
К сожалению, вы используете MariaDB 10.1. Это не поддерживает схему sys
или таблицу performance_schema.metadata_locks, необходимые для сообщения об этих блокировках. MariaDB - это ветвь MySQL 5.5, которой уже почти десять лет, и в то время у них не было таблицы metadata_locks.
Я не использую MariaDB, но я гуглил и обнаружил, что у них есть своя собственная запатентованная реализация для запроса блокировок метаданных: https://mariadb.com/kb/en/library/metadata_lock_info/ Я не использовал ее, поэтому я оставлю это вам на чтение документы об этом.