Назад | Перейти на главную страницу

Как я могу показать блокировки mysql?

Есть ли способ показать все блокировки, которые активны в базе данных mysql?

См. Ссылку Марко для таблиц InnoDB и предупреждений.

Для MyISAM не существует простого решения типа «это оскорбительный запрос». Вы всегда должны начинать со списка процессов. Но не забудьте включить ключевое слово полностью, чтобы напечатанные запросы не усекались:

SHOW FULL PROCESSLIST;

Это покажет вам список всех текущих процессов, их SQL-запросы и состояние. Обычно, если один запрос вызывает блокировку многих других, это должно быть легко идентифицировать. Затронутые запросы будут иметь статус Locked и вызывающий нарушение запрос будет отключен сам по себе, возможно, ожидая чего-то интенсивного, например временной таблицы.

Если это неочевидно, вам придется использовать свои способности дедукции SQL, чтобы определить, какая часть неправильного SQL может быть причиной ваших бед.

Если вы используете InnoDB и вам нужно проверить запущенные запросы, я рекомендую

show engine innodb status;

как указано в ссылке Марко. Это даст вам запрос блокировки, сколько строк / таблиц заблокировано им и т. Д. Посмотрите в разделе ТРАНЗАКЦИИ.

Проблема с использованием SHOW PROCESSLIST заключается в том, что вы не увидите блокировки, если в очереди не будут стоять другие запросы.

Пытаться SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

Ни один из ответов не может показать все блокировки, которые в настоящее время удерживаются.

Сделайте это, например, в mysql в терминале.

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

Очевидно, что транзакция выше содержит блокировку, поскольку транзакция все еще активна. Но сейчас никаких запросов не происходит и никто нигде не ждет блокировки (по крайней мере, пока).

INFORMATION_SCHEMA.INNODB_LOCKS пусто, что имеет смысл, учитывая документация, потому что есть только одна транзакция и в настоящее время никто не ждет блокировок. Также INNODB_LOCKS в любом случае устарел.

SHOW ENGINE INNODB STATUS бесполезно: someTable вообще не упоминается

SHOW FULL PROCESSLIST пусто, потому что виновник на самом деле не выполняет запрос прямо сейчас.

Ты можешь использовать INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_history и performance_schema.threads для извлечения запросов, которые любые активные транзакции выполняли в прошлом, как указано в мой другой ответ, но я не нашел способа увидеть это someTable заблокирован в приведенном выше сценарии.

Предложения в других ответах пока не помогут.

Отказ от ответственности: у меня не установлен innotop, и я не беспокоился. Возможно, что мог работай.

Используя эту команду

SHOW PROCESSLIST

покажет весь запущенный в данный момент процесс, включая процесс, который получил блокировку таблиц.

AFAIK в MYSQL все еще нет собственного способа, но я использую Innotop. Это бесплатно и имеет множество других функций.

Также см эта ссылка для получения дополнительной информации об использовании инструмента innotop.

Ссылка взята из этого поста.

Вы можете использовать следующий сценарий:

SELECT 
    pl.id
    ,pl.user
    ,pl.state
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query
    ,it.trx_id AS blocking_trx_id
    ,it.trx_mysql_thread_id AS blocking_thread
    ,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it
    ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
    ON it.trx_id = ilw.requesting_trx_id 
        AND it.trx_id = ilw.blocking_trx_id