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_TYPE
of '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
'Programing' 카테고리의 다른 글
파이썬의 for 루프 (0) | 2020.12.27 |
---|---|
R 패키지 및 종속성의 오프라인 설치 (0) | 2020.12.26 |
Xcode 6에서 iOS 8 확장이있는 보관 앱 중 경고 (0) | 2020.12.26 |
맞춤형 Linux GUI : 어디에서 시작할까요? (0) | 2020.12.26 |
절대 위치 및 오버플로 : 숨김 (0) | 2020.12.26 |