ProgramingTip

get_lock의 모든 현재 잠금 표시

bestdevel 2020. 12. 27. 19:39
반응형

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_locksGET_LOCKOBJECT_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열은 발음합니다. 잠금을 보유하는 노래 연결 ID (에서 표시 PROCESSLIST되거나에서 반환 됨 CONNECTION_ID())를 포함합니다. 혼동, 용어 "스레드 ID는"때는 MySQL의 설명서에서 "연결 ID"의 동의어로 사용 이는없는 그 시대의 하나입니다. 잠금을 유지하는 연결 연결 ID 를 확인 비용 (예 :를 사용하여 해당 연결을 종료하기 위해 ) 다음 항목 에 해당하는을 찾아야합니다 . 에서 테이블. 예를 들어, 위의 자물쇠를 준비 연결을 끄려면 ...KILLPROCESSLIST_IDTHREAD_IDperformance_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

반응형