Як я можу показати блокування mysql?


45

Чи все-таки можна показати всі блоки, активні в базі даних mysql?


1
Ви можете запитувати таблиці INNODB_LOCK_WAITS та INNODB_LOCKS.

Відповіді:


40

Дивіться посилання Марко для таблиць InnoDB та застережень.

Для MyISAM не існує мертвого простого рішення "це запит образи". Ви завжди повинні починати зі списку процесів. Але обов'язково введіть повне ключове слово, щоб надруковані запити не були усічені:

SHOW FULL PROCESSLIST;

Це покаже вам список усіх поточних процесів, їх запит SQL та стан. Зараз зазвичай, якщо один запит призводить до блокування багатьох інших, то його слід легко визначити. Запрошені запити матимуть статус, Lockedі запит, який порушить, буде розроблений сам по собі, можливо, чекаючи чогось інтенсивного, наприклад, тимчасової таблиці.

Якщо це не очевидно, тоді вам доведеться використовувати свої повноваження щодо відрахування SQL, щоб визначити, який фрагмент образи SQL може бути причиною ваших негараздів.


21

Якщо ви використовуєте InnoDB і вам потрібно перевірити запущені запити, я рекомендую

show engine innodb status;

як згадується у посиланні Марко. Це дасть вам запит блокування, скільки рядків / таблиць заблоковано тощо.

Проблема з використанням SHOW PROCESSLISTполягає в тому, що ви не побачите блокування, якщо інші запити не стоять у черзі.


20

Спробуйте SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

Я думаю, що це найкращий спосіб негайно визначити блоки використання, особливо якщо у вас є кілька баз даних і сотні підключень.
nelaaro

7

Використовуючи цю команду

SHOW PROCESSLIST

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


7

Жодна з відповідей не може відображати всі заблоковані в даний час блоки.

Зробіть це, наприклад, у 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, і я не турбувався. Можливо, це могло б спрацювати.


6

AFAIK все ще немає рідного способу в MYSQL, але я використовую inatop . Це безкоштовно і має безліч інших функціональних можливостей.

Також перегляньте це посилання для отримання додаткової інформації про використання інструменту inatop.


4

Довідка взята з цієї посади.

Ви можете використовувати сценарій нижче:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.