Programing

어떤 트랜잭션이 "테이블 메타 데이터 잠금 대기 중"상태를 유발하는지 어떻게 알 수 있습니까?

lottogame 2020. 9. 13. 11:38
반응형

어떤 트랜잭션이 "테이블 메타 데이터 잠금 대기 중"상태를 유발하는지 어떻게 알 수 있습니까?


테이블에서 일부 DDL을 수행하려고 SHOW PROCESSLIST하는데 "Waiting for table metadata lock"메시지가 나타납니다.

아직 마감되지 않은 거래를 어떻게 알 수 있습니까?

MySQL v5.5.24를 사용하고 있습니다.


SHOW ENGINE INNODB STATUS \G

섹션 찾기-

TRANSACTIONS

INFORMATION_SCHEMA 테이블을 사용할 수 있습니다 .

유용한 쿼리

트랜잭션이 대기중인 모든 잠금을 확인하려면 다음을 수행하십시오.

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

차단 트랜잭션 목록 :

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

또는

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

수직 테이블에 대한 잠금 목록 :

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

잠금을 기다리는 트랜잭션 목록 :

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

참조 - MySQL의 문제 해결 : 무엇을 어떻게하면 쿼리 작동하지 않는다 , 6 장 - 페이지 96.


테이블을 잠그는 프로세스를 찾을 수 없다면 (이미 죽었 기 때문에) 여전히 이렇게 정리중인 스레드 일 수 있습니다.

섹션 TRANSACTION

show engine innodb status;

끝에

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

Clear transaction deadlock 의 주석에서 언급했듯이

트랜잭션 스레드를 직접 종료 할 수 있습니다.

 KILL 5208136;

나를 위해 일했습니다.


mysql 5.7은 performance_schema.metadata_locks테이블을 통해 메타 데이터 잠금 정보를 노출 합니다.

여기에 문서화


Datagrip과 비슷한 문제가 있었지만 이러한 솔루션 중 어느 것도 작동하지 않았습니다.

Datagrip Client를 다시 시작하면 더 이상 문제가되지 않았으며 테이블을 다시 삭제할 수있었습니다.

참고 URL : https://stackoverflow.com/questions/13148630/how-do-i-find-which-transaction-is-causing-a-waiting-for-table-metadata-lock-s

반응형