Programing

get_lock의 모든 현재 잠금 표시

lottogame 2020. 12. 26. 09:28
반응형

get_lock의 모든 현재 잠금 표시


GET_LOCK기능을 사용하여 가져온 모든 현재 잠금을 선택 / 표시하는 방법이 있습니까?

참고 GET_LOCK잠금으로 얻은 그와 같은 테이블 잠금 다르다 LOCK TABLES- 참조하는 방법을 알고 자하는 독자 잠금 읽어야 감지 테이블을 잠금 (LOCK 표에 의해 잠겨)


MySQL 5.7부터 성능 스키마는 GET_LOCK()함수 와 관련된 잠금을 포함하여 모든 메타 데이터 잠금을 노출합니다 .

참조 http://dev.mysql.com/doc/refman/5.7/en/metadata-locks-table.html를


SHOW FULL PROCESSLIST;

거기에 자물쇠가 보일 것입니다.


MySQL 5.7부터는 가능하지만 먼저 테이블 에서 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을 다시 시작해야합니다.)

잠금 당신이 꺼내 mdl 활성화 된 계기가를 실행하여 볼 수 있습니다 SELECT에 대해 performance_schema.metadata_locks테이블. 문서에서 언급했듯이 GET_LOCK잠금에는 OBJECT_TYPEof '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열은 그렇지 않습니다. 잠금을 보유하는 스레드 연결 ID (에서 표시 PROCESSLIST되거나에서 반환 됨 CONNECTION_ID())를 포함합니다. 혼란스럽게도 "스레드 ID"라는 용어는 MySQL 문서에서 "연결 ID"의 동의어로 사용되는 경우가 있지만 이는 그러한 경우 아닙니다 . 잠금을 유지하는 연결 연결 ID 를 확인하려면 (예 :를 사용하여 해당 연결을 끊으 려면) 해당 연결 ID 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)

특정 명명 된 잠금이 현재 보유 되어 있는지 확인 하려면 IS_USED_LOCK다음을 사용할 수 있습니다 .

SELECT IS_USED_LOCK('foobar');

일부 연결에 잠금이 유지되면 해당 연결의 ID가 반환됩니다. 그렇지 않으면 결과는 NULL입니다.


자물쇠의 이름을 알고 있으면 다음과 같은 방법으로 사용할 수 있습니다.

select IS_USED_LOCK('lockname');

그러나 모든 이름을 나열하는 방법에 대한 정보를 찾지 못했습니다.


또 다른 쉬운 방법은 다음을 사용하는 것입니다.

mysqladmin debug 

이렇게하면 많은 정보 (잠금 포함)가 오류 로그에 덤프됩니다.


이 게시물에서 가져온 참조 :

이 스크립트를 사용하여 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

참조 URL : https://stackoverflow.com/questions/11034504/show-all-current-locks-from-get-lock

반응형