Відповіді:
Дивіться посилання Марко для таблиць 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
замкнений в наведеному вище сценарії.
Пропозиції в інших відповідях поки що не допоможуть принаймні.
Відмова від відповідальності: У мене не встановлено inatop, і я не турбувався. Можливо, це могло б спрацювати.
AFAIK все ще немає рідного способу в MYSQL, але я використовую inatop . Це безкоштовно і має безліч інших функціональних можливостей.
Також перегляньте це посилання для отримання додаткової інформації про використання інструменту inatop.
Ви можете використовувати сценарій нижче:
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