본문 바로가기
공부/프로그래밍

[mysql] USER level Lock 설정을 했는데 해제가 안되는 경우.

by demonic_ 2019. 2. 15.
반응형

프로젝트에서 USER LOCK(get_lock) 을 사용하는데 서버에 문제가 생겨 잠시 버벅거리다가 다시 실행하려고 하니 해당 락이 계속 살아있는 경우가 있었다. 그래서 RELEASE_LOCK() 을 이용해 풀면 리턴값이 0으로 나오는데 다시 조회해보면 여전히 살아있다.


아래는 LOCK 관련 메서드를 정리한 것이다.


# LOCK 획득

- GET_LOCK(str, timeout)


# LOCK 사용중인지 확인

- IS_USED_LOCK(str)


# LOCK 해체

- RELEASE_LOCK(str)


LOCK 을 해제할때 show processlist; 를 이용해 State 가 'Waiting for table metadata lock' 상태의 것만 kill 하면 된다고 하는데, 실제로 그런 상태값이 있는건 없었다.


그래서 IS_USED_LOCK 을 사용해봤더니 불특정 숫자가 나왔는데, 이 숫자가 바로 session ID 이다.

* show processlist; 를 하면 나오는 ID 값


즉 Lock 을 획득한 세션이 해당 락을 해지하지 못하고 들고있던 샘이다. 

이미 Command가 Sleep 이기 때문에 Waiting for table... 이런 문구도 없었던 것.


* Sleep 세션이란?

mysql 서버와 연결 후 다음 query 수행까지 대기중인 상태의 세션을 의미


그래서 관련 세션을 죽이면 된다.

확인하는 방법은 다음 두가지 방법중 하나를 쓰면 된다.


show processlist; 


또는 root 계정일 경우


select id 

from information_schema.processlist 

where user='스키마 이름'

and command='Sleep'

order by id;


괜히 Sleep 상태가 아닌 실제 돌아야하는것도 종료하면 곤란해지니  where 절을 추가한다.


다음과 같이 하면 kill 명령어가 붙는채로 조회가 가능하다.


select concat('KILL ', id, ';')

from information_schema.processlist 

where user='스키마 이름'

and command='Sleep'

order by id;


내 경우 이렇게 조회한다음 나오는 리스트를 복사한다음 SQL창에 붙여넣기 하여 실행시켰다.



# 참고로 쓰고있는 Mysql 에 세션 자동정리를 확인하는 방법은 다음과 같다.


현재 살아있는 세션


select count(*) from information_schema.processlist;


interactive 세션을 정리하는 설정확인


show variables like 'interactive%';


non-interactive 세션을 정리하는 설정확인


show variables like 'wait_timeout';


대체로 세션이 정리되는 시간이 있기 때문에 시간이 지나면 자연스럽게 해결되는 경우가 이 설정과 연관있는것 같다.


끝.




참조페이지


MySQL의 User Level Lock를 활용한다면?

http://gywn.net/2013/12/mysql-user-level-lock/


sleep session 정리하기

https://sarc.io/index.php/mariadb/1154-sleep-session




반응형

댓글