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

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

<p>см. ссылку марко для таблиц innodb и предостережений.</p><p>для myisam не существует простого решения "это оскорбительный запрос". вы должны всегда начинать с списка процессов. но обязательно включите полное ключевое слово, чтобы печатные запросы не усекались:</p><pre><code>show full processlist; </code></pre><p>это покажет вам список всех текущих процессов, их sql-запросов и состояния. теперь обычно, если один запрос вызывает блокировку многих других, его будет легко идентифицировать. у затронутых запросов будет состояние <code>locked</code>, а вызывающий беспокойство запрос будет сам по себе, возможно, ожидая чего-то интенсивного, например временной таблицы.</p><p>если это неочевидно, вам придется использовать свои способности к выводу sql, чтобы определить, какой кусок нарушающего sql может быть причиной ваших проблем.</p>

<p>если вы используете innodb и вам нужно проверить запущенные запросы, я рекомендую</p><p><code>show engine innodb status;</code></p><p>как упомянуто в ссылке марко. это даст вам запрос блокировки, сколько строк/таблиц заблокировано им и т.д. смотрите в разделе сделки.</p><p>проблема с использованием <code>show processlist</code> означает, что вы не увидите блокировки, если другие запросы не будут поставлены в очередь.</p>

<p>пытаться <a href="https://dev.mysql.com/doc/refman/5.7/en/show-open-tables.html"><code>show open tables</code></a> :</p><pre><code>show open tables where in\_use > 0 ; </code></pre>

<p>ни один из ответов не может показать все блокировки, которые в данный момент удерживаются.</p><p>сделайте это, например в mysql в терминале.</p><pre><code>start transaction; update sometable set name="foobar" where id=1234; -- but no rollback or commit - just let it sit there </code></pre><p>понятно, что транзакция выше удерживает блокировку, потому что транзакция все еще активна. но сейчас не выполняется никаких запросов, и никто нигде не ждет блокировки (пока, по крайней мере).</p><p><code>information\_schema.innodb\_locks</code> пусто, что имеет смысл, учитывая <a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-table.html">документация</a> , потому что есть только одна транзакция, и в настоящее время никто не ожидает каких-либо блокировок. также <code>innodb\_locks</code> все равно не рекомендуется.</p><p><code>show engine innodb status</code> бесполезен: <code>sometable</code> вообще не упоминается</p><p><code>show full processlist</code> пусто, потому что преступник сейчас не выполняет запрос.</p><p>ты можешь использовать <code>information\_schema.innodb\_trx</code>, <code>performance\_schema.events\_statements\_history</code> а также <code>performance\_schema.threads</code> для извлечения запросов, которые любые активные транзакции выполняли в прошлом, как описано в <a href="https://stackoverflow.com/questions/53549264/how-to-troubleshoot-mysql-error-1205-hy000-lock-wait-timeout-exceeded-try-r/53549265#53549265">мой другой ответ</a> , но я не нашел способа увидеть, что <code>sometable</code> заблокировано в вышеуказанный сценарий.</p><p>предложения в других ответах пока не помогут, по крайней мере.</p><p>отказ от ответственности: у меня не установлен innotop, и я не стал беспокоиться. возможно, что <em> может </em> работать.</p>

<p>используя эту команду</p><pre><code>show processlist </code></pre><p>покажет все процессы, запущенные в данный момент, включая процесс, получивший блокировку для таблиц.</p>

<p>afaik, в mysql до сих пор нет собственного пути, но я использую <a href="http://www.xaprb.com/blog/2006/07/02/innotop-mysql-innodb-monitor">innotop</a> . это бесплатно и имеет много других функций.</p><p>также смотрите <a href="http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks">эта ссылка</a> для получения дополнительной информации об использовании инструмента innotop.</p>

<p><strong> <a href="http://www.dbrnd.com/2016/02/mysql-script-to-identify-the-locks-and-blocking-transactions/">ссылка взята из этого поста.</a> </strong></p><p>вы можете использовать ниже скрипт:</p><pre><code>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 </code></pre>