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
'programing' 카테고리의 다른 글
Python에서 현재 사용자 이름을 얻을 수 있는 휴대용 방법이 있나요? (0) | 2022.09.15 |
---|---|
JavaScript 개체의 첫 번째 키 이름을 가져옵니다. (0) | 2022.09.15 |
이미지를 업로드하기 전에 미리 보기 (0) | 2022.09.15 |
Python은 문자열 'contains' 서브스트링 메서드를 가지고 있습니까? (0) | 2022.09.15 |
MinGW-w64 및 MSYS2 설치 방법 (0) | 2022.09.15 |