프로젝트에서 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
'공부 > 프로그래밍' 카테고리의 다른 글
[Spring] 환경에 따라 logback 설정파일 분리하기(springboot 아님) (0) | 2019.02.26 |
---|---|
[Retrofit2] Unable to create converter for interface 에러 (0) | 2019.02.21 |
[centos] dstat 로그 남기기(자원활용 점검) (0) | 2019.02.06 |
DBMS 선택시 서버자원 우선순위 (0) | 2019.01.28 |
[centos] ssh 암호없이 접속하기(ssh-copy-id) (0) | 2019.01.28 |
댓글