programing

get_lock에서 현재 잠금을 모두 표시합니다.

minecode 2022. 9. 15. 22:13
반응형

get_lock에서 현재 잠금을 모두 표시합니다.

기능을 사용하여 꺼낸 모든 현재 잠금을 선택/표시할 수 있는 방법이 있습니까?

주의:GET_LOCK자물쇠는 테이블 자물쇠와 다릅니다.예를 들어, 로 취득한 것과 같습니다.LOCK TABLES- 이러한 잠금을 확인하는 방법을 알고 싶은 독자는 "잠긴 테이블 검출(LOCK TABLE로 잠김)"을 참조하십시오.

MySQL 5.7 이후로는 이 기능이 가능하지만 먼저 이 기능을 활성화해야 합니다.mdl테이블 내의 기기.다음을 실행하여 일시적으로(서버가 다음에 재시작될 때까지) 이 작업을 수행할 수 있습니다.

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을 재부팅하여 Configuration 변경을 활성화해야 합니다).

그 후 꺼낸 잠금 장치mdl계측기가 활성화되었습니다.를 실행하여 확인할 수 있습니다.SELECT책상에 기대어문서에 언급된 바와 같이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컬럼에 접속 ID가 포함되어 있지 않습니다(와 같습니다).PROCESSLIST또는 에 의해 반환됨CONNECTION_ID())을 클릭합니다.MySQL 문서에서는 "스레드 ID"라는 용어가 "접속 ID"의 동의어로 사용되는 경우가 있지만, 지금은 그렇지 않습니다.잠금을 유지하는 접속의 접속 ID를 판별하는 경우(예를 들어 와의 접속을 끊는 경우)에는PROCESSLIST_ID에 대응하고 있다THREAD_ID테이블에서.예를 들어, 위에 있는 내 자물쇠를 잡고 있던 연결을 끊으려면...

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)

MySQL 5.7부터는 퍼포먼스 스키마에 의해 모든 메타데이터 잠금이 공개되며, 여기에는 다음과 같은 잠금이 포함됩니다.GET_LOCK()기능.

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

SHOW FULL PROCESSLIST;

저기 자물쇠가 보일거야

특정 이름 있는 잠금이 현재 유지되고 있는지 확인하는 경우 다음을 사용할 수 있습니다.

SELECT IS_USED_LOCK('foobar');

않으면 그 는 ""가 됩니다.그렇지 않으면 그 결과는 다음과 같습니다.NULL.

이 투고에서 인용한 레퍼런스:

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

잠금 이름을 알면 사용할 수 있는 방법을 다음과 같이 찾았습니다.

select IS_USED_LOCK('lockname');

하지만 모든 이름을 나열하는 방법에 대한 정보를 찾을 수 없었습니다.

또 다른 간단한 방법은 다음과 같습니다.

mysqladmin debug 

이것에 의해, 많은 정보(잠금 포함)가 에러 로그에 덤프 됩니다.

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

반응형