개발 이슈,해결법

[Mysql 8.0] Mysql Lock 확인

난쏘공돌이 2024. 8. 30. 16:46

간단한 글을 쓰는 것은 지양하려고 했는데, 다른 블로그 글 중에 잘 안맞는 것들이 있어서 조금 끄적거려본다.

알기로 5.6 버전과 8.0 버전은 시스템 쿼리의 형태가 조금 다른것으로 안다. (password 컬럼이 사라졌다거나..)

이 글은 8.0 기준으로 작성함을 알려드린다. 

Transaction Lock 확인

확인 자체는 아래 명령을 통해 진행하면 된다. 

SELECT * from information_schema.INNODB_TRX

다만 일을 하다보면 이 트랜잭션을 죽여도 되는가 혹은 이 트랜잭션이 어디서 발생했는가를 알아야 하는 경우가 존재한다.

SHOW ENGINE INNODB STATUS;

이때 이 명령을 통해 락이 어느시점에 어떤데이터에서 발생했는지를 보다 자세히 알 수 있게 해준다. 
무턱대고 트랜잭션을 죽일게 아니라 보고 죽여야 하지 않겠는가. 

Transaction Lock 해결

확인했다면 

빨간색을 주목하자.  저 부분이 문제가 되는 DB내의 process다. 우리는 저걸 죽여야 한다. 

맨 앞에있는 trx_id는 process가 아닌 트랜잭션 Id이기 때문에 다른 블로그들에 소개된 kill 명령으로는 저거 안죽는다. 

kill {trx_mysql_thread_id} ;  를 쿼리로 날려보자.
락되어있는 데이터가 풀렸을거다.

별개의 얘기로 현재 돌아가는 Process를 확인하려면

SHOW processlist ;

혹은

SELECT * from information_schema.PROCESSLIST;

사용해보자. 지금 물려있는 Process들을 확인가능하다.