Показать все текущие блокировки от get_lock

Есть ли способ выбрать / показать все текущие блокировки, которые были сняты, используяGET_LOCK function?

Обратите внимание, чтоGET_LOCK замки отличаются от настольных замков, как те, которые приобретены сLOCK TABLES - читатели, которые хотят знать, как увидетьthose замки должны читатьОбнаружение заблокированных таблиц (заблокировано LOCK TABLE)

Ответы на вопрос(7)

SHOW FULL PROCESSLIST;

 06 окт. 2014 г., 12:50
Пожалуйста, обновите свой ответ о том, как увидеть блокировки с помощью этой команды. Насколько я могу судить, будут показаны только текущие команды, а не таблицы, на которые влияют блокировки.
 09 янв. 2017 г., 11:40
На самом деле это позволяет увидеть, какие запросы ожидают из-за заблокированной таблицы. Так что в некоторых ситуациях это можно использовать для отладки и просмотра, где находится блокировка / проблема.
 28 сент. 2016 г., 14:32
@ooxi вState будет какwaiting for table metadata lock для MyISAM; блокировки на уровне строк для InnoDB проверяются с помощьюShow Engine InnoDB Status
 24 янв. 2013 г., 01:43
OP запрашивает блокировки приложений, и это не показывает их.
 08 авг. 2018 г., 13:42
Please vote this answer down or as NAA.

particular именная блокировка в настоящее время удерживается, вы можете использоватьIS_USED_LOCK:

SELECT IS_USED_LOCK('foobar');

Если какое-либо соединение удерживает блокировку, идентификатор этого соединени будет возвращен; в противном случае результатNULL.

который можно использовать, если вы ЗНАЕТЕ имя блокировки

select IS_USED_LOCK('lockname');

Однако я не нашел никакой информации о том, как перечислить все имена.

 22 февр. 2017 г., 01:41
После смены больше не говорите, что говорите сейчас. Вы свободны создать свой собственный ответ.
 25 февр. 2017 г., 13:23
Done (неохотно).
 14 сент. 2016 г., 22:05
Это полезно, поскольку его можно использовать для получения мета-информации о том, кто имеет блокировку, и при необходимости убить запрос.
 22 февр. 2017 г., 00:48
@arheops - любая причина, по которой вы решили откатить добавленную мной ссылку на документацию и информацию о том, чтоIS_USED_LOCK возвращается? Мне кажется, что этот ответ менее полезен без этой информации; по-вашему, мне нужно в Google найти имя функции, найти документы и прочитать в документах, что она возвращает, чтобы иметь возможность использовать этот ответ, а не информацию, находящуюся передо мной.

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

Вы также можете использовать этот скрипт, чтобы найти блокировку в MySQL.

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
 21 февр. 2017 г., 00:03
-1; это механизм поискаtable замки, неnamed блокирует, и, следовательно, не имеет отношения к вопросу, плюс он использует устаревшую таблицу - если вы запускаете это в недавнем выпуске MySQL и запускаетеSHOW WARNINGS после этого вы увидите'INFORMATION_SCHEMA.INNODB_LOCK_WAITS' is deprecated and will be removed in a future release.

Другой простой способ - использовать:

mysqladmin debug 

Это сбрасывает много информации (включая блокировки) в журнал ошибок.

 21 февр. 2017 г., 00:01
-1; Я только что протестировал на MySQL 5.7, сняв именованную блокировку в одном терминале, а затем вызвавmysqladmin От другого. Информация, помещенная в мой журнал ошибок, не содержала никаких ссылок на снятую блокировку.

схема производительности предоставляет все блокировки метаданных, включая блокировки, связанные сGET_LOCK() функция.

Увидетьhttp://dev.mysql.com/doc/refman/5.7/en/metadata-locks-table.html

 21 февр. 2017 г., 01:04
Это указало мне в правильном направлении, но святая корова взяла меняlot работы, чтобы выяснить, как заставить эту таблицу действительно содержать что-либо или понять ее содержимое, как только я это сделал. Чтобы спасти других от такой же борьбы, яwritten up my findings в моем собственном ответе здесь.
 26 дек. 2016 г., 07:40
Это правильный ответ на вопрос. Возможность не существует в версиях до 5.7.
 22 авг. 2018 г., 14:54
IIRC отключениеperformance_schema это лучшая практика для производственных баз данных. В любом случае, не уверен, как блокировки соотносятся со статистикой производительности ... Более поздние версии mariadb справляются с этим немного более разумно:mariadb.com/kb/en/library/…

mdl инструмент вperformance_schema.setup_instruments Таблица. Вы можете сделать это временно (до следующего перезапуска сервера), выполнив:

UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';

Или навсегда, добавив следующее заклинание к[mysqld] раздел вашегоmy.cnf файл (или любые другие файлы конфигурации, которые MySQL читает из вашей установки):

[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'

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

Замки вынимаешьafter mdl инструмент был включен, можно увидеть, запустивSELECT противperformance_schema.metadata_locks Таблица. Как отмечено в документах,GET_LOCK замки имеютOBJECT_TYPE из'USER LEVEL LOCK'Таким образом, мы можем отфильтровать наш запрос к ним с помощьюWHERE пункт:

mysql> SELECT GET_LOCK('foobarbaz', -1);
+---------------------------+
| GET_LOCK('foobarbaz', -1) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM performance_schema.metadata_locks 
    -> WHERE OBJECT_TYPE='USER LEVEL LOCK'
    -> \G
*************************** 1. row ***************************
          OBJECT_TYPE: USER LEVEL LOCK
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: foobarbaz
OBJECT_INSTANCE_BEGIN: 139872119610944
            LOCK_TYPE: EXCLUSIVE
        LOCK_DURATION: EXPLICIT
          LOCK_STATUS: GRANTED
               SOURCE: item_func.cc:5482
      OWNER_THREAD_ID: 35
       OWNER_EVENT_ID: 3
1 row in set (0.00 sec)

mysql> 

Значения столбцов в этом результате в основном адекватно документированы вhttps://dev.mysql.com/doc/refman/en/metadata-locks-table.htmlНо стоит отметить одну путаницу:OWNER_THREAD_ID колонка делаетnot содержатьconnection ID (как будет показано вPROCESSLIST или возвращаетсяCONNECTION_ID()) нити, которая удерживает блокировку. Смущает термин «идентификатор потока» иногда используется как синоним «идентификатора соединения»; в документации MySQL, но этоnot один из тех времен. Если вы хотите определитьconnection Идентификатор соединения, которое содержит блокировку (например, чтобы уничтожить это соединение сKILL) вам нужно найтиPROCESSLIST_ID что соответствуетTHREAD_ID вperformance_schema.threads Таблица. Например, чтобы убить соединение, которое удерживало мой замок выше ...

mysql> SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks
    -> WHERE OBJECT_TYPE='USER LEVEL LOCK'
    -> AND OBJECT_NAME='foobarbaz';
+-----------------+
| OWNER_THREAD_ID |
+-----------------+
|              35 |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT PROCESSLIST_ID FROM performance_schema.threads
    -> WHERE THREAD_ID=35;
+----------------+
| PROCESSLIST_ID |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

mysql> KILL 10;
Query OK, 0 rows affected (0.00 sec)
 21 февр. 2017 г., 01:18
+1. Хорошая рецензия, здесь все правильно. Что касается THREAD_ID и PROCESSLIST_ID, то это действительно область, вызывающая путаницу, которая имеет исторические корни с SHOW PROCESSLIST.

Ваш ответ на вопрос