mysql 레퍼런스를 보다보면 SHOW PROCESSLIST 에 대한것이 있는데 일명 디비 먹통이 났을 때 프로세스 리스트를 보고 대처를 해보자.
쿼리가 블럭이나 슬립이 되면, 그 뒤에 들어오는 쿼리가 반영안되고 동일하게 블락 상태로 멈추게 되는 현상이 자주 발생하는데 이 같은 경우는 레코드수가 많거나 쿼리가 무거울 경우로 볼 수 있다. 로쿼리를 분석해서 지연시간으로 쿼리를 분석할 필요가 있지만 그 전에 현재 구동중인 디비를 어떻든 정상상태로 만들어야 한다.
어떤 쿼리냐에 따라 대처가 달라질 수 있겠지만..
테이블 스키마를 수정하던가 디비 유형이 바뀌던가의 경우에서 섣불리 리부팅을 하기엔 문제가 될 수 있고,
리스타트/리부팅 후 정상적으로 올라오더라도 대기상태의 쿼리가 다시 실행되므로 문제해결은 되지 않는 경우가 많다.
본인의 경우 회원에게 무료쿠폰을 발행하는 형태를 개발한 후 이미 발행 완료한 쿠폰에 대한 처리를 하지 않아 축적된 테이블 레코드가 5천만건에 육박하는 문제가 발생하였고 삭제 쿼리나 추가적인 인덱스 작업이 실행되지 않는 현상이 있었다.
이 같은 문제가 발생하면 일전에 포스팅한
http://blog.naver.com/suri7242/220746838759
와 같이 범위를 적용해서 데이터를 줄이던가 해야하는데 이 작업을 하기 위해서 현재의 멈춰있는 쿼리를 어떻게든 해결해야 한다.
이럴 때 사용할 수 있는 것이 PROCESSLIST.
# mysql -u root
# show processlist;
또는,
# SHOW FULL PROCESSLIST\G
또는,
# SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST order by 1 desc;
결과를 보면 (이미지 샘플은 구글)
현재 대기중이거나 실행되고 있는 쿼리를 볼 수 있다.
이렇게 올라온 쿼리를 보고 블락된 쿼리를 하나씩 제거할 수 있다.
ID별로
# kill 11868;
이제 mysql이 정상적으로 돌아왔으니 쿼리를 분석하고 재구성하면 된다.
참고 - http://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
'DB > mysql' 카테고리의 다른 글
foreach 사용 예시 (0) | 2023.01.26 |
---|---|
master slave 연동 확인하기 (0) | 2022.11.01 |
대용량csv을 Mysql에 import시키기 (0) | 2022.10.26 |
[mysql] too many connections (0) | 2022.09.14 |
두개의 테이블 조인하여 업데이트 (0) | 2022.07.27 |