Вы можете запросить таблицы INNODB_LOCK_WAITS и INNODB_LOCKS.
Ответы:
40
См. Ссылку Марко для таблиц InnoDB и предостережений.
Для MyISAM не существует абсолютно простого решения «это оскорбительный запрос». Вы должны всегда начинать с списка процессов. Но обязательно включите полное ключевое слово, чтобы печатные запросы не усекались:
SHOW FULL PROCESSLIST;
Это покажет вам список всех текущих процессов, их SQL-запросов и состояния. Теперь обычно, если один запрос вызывает блокировку многих других, его будет легко идентифицировать. У затронутых запросов будет состояние, Lockedа запрос, вызывающий сбои, будет сам по себе, возможно, ожидая чего-то интенсивного, например, временной таблицы.
Если это неочевидно, вам придется использовать свои способности к выводу SQL, чтобы определить, какой кусок нарушающего SQL может быть причиной ваших проблем.
Ни один из ответов не может показать все блокировки, которые в данный момент удерживаются.
Сделайте это, например, в 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, и я не стал беспокоиться. Возможно, это может сработать.
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
Ответы:
См. Ссылку Марко для таблиц InnoDB и предостережений.
Для MyISAM не существует абсолютно простого решения «это оскорбительный запрос». Вы должны всегда начинать с списка процессов. Но обязательно включите полное ключевое слово, чтобы печатные запросы не усекались:
Это покажет вам список всех текущих процессов, их SQL-запросов и состояния. Теперь обычно, если один запрос вызывает блокировку многих других, его будет легко идентифицировать. У затронутых запросов будет состояние,
Locked
а запрос, вызывающий сбои, будет сам по себе, возможно, ожидая чего-то интенсивного, например, временной таблицы.Если это неочевидно, вам придется использовать свои способности к выводу SQL, чтобы определить, какой кусок нарушающего SQL может быть причиной ваших проблем.
источник
Если вы используете InnoDB и вам нужно проверить запущенные запросы, я рекомендую
show engine innodb status;
как упомянуто в ссылке Марко. Это даст вам запрос блокировки, сколько строк / таблиц заблокировано им и т. Д. Смотрите в разделе СДЕЛКИ.
Проблема с использованием
SHOW PROCESSLIST
заключается в том, что вы не увидите блокировки, если другие запросы не будут поставлены в очередь.источник
Попробуй
SHOW OPEN TABLES
:источник
Используя эту команду
покажет все процессы, запущенные в данный момент, включая процесс, получивший блокировку для таблиц.
источник
Ни один из ответов не может показать все блокировки, которые в данный момент удерживаются.
Сделайте это, например, в MySQL в терминале.
Понятно, что транзакция выше удерживает блокировку, потому что транзакция все еще активна. Но сейчас не выполняется никаких запросов, и никто нигде не ждет блокировки (пока, по крайней мере).
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, и я не стал беспокоиться. Возможно, это может сработать.
источник
AFAIK, в MYSQL до сих пор нет собственного пути, но я использую innotop . Это бесплатно и имеет много других функций.
Также смотрите эту ссылку для получения дополнительной информации об использовании инструмента innotop.
источник
Ссылка взята из этого поста.
Вы можете использовать ниже скрипт:
источник