개발하면서 부딪혔던 문제들/DB

[DB][Mariadb] Lock 문제를 해결해보자

desmort68 2018. 7. 26. 16:31

주제: Waiting for table metadata lock


DB와 프로그램을 연결하는데 query문을 날렸는데도 프로그램이 멈춰있다는 건 DB 처리에 문제가 생겼다고 판단하는게 좋을 것 같다.

DB에서 문제점을 살펴보니 다음과 같았다.


Command에 있는 Sleep이 신경쓰인다.

난 Sleep하라는 명령을 보낸 적이 없을텐데?

아래 개발자 네트워크에 들어가보면 댓글 중 다음과 같은 사실을 알 수 있다.


sleep 상태 : 클라이언트에서 연결을 하고 연결을 종료 하지 않았거나, 느린 쿼리가 실행되어 역시 연결 종료를 하지 못했을 경우에 발생하는 것입니다.

http://www.mysqlkorea.com/gnuboard4/bbs/board.php?bo_table=community_04&wr_id=705


따라서 저건 별 문제가 되지 않는다.

문제는 현재 State에 Waiting for table metadata lock이 문제다.

이건 왜 일어났을까?


show engine innodb status

라고 하면 db status가 쭉 나온다


참고: https://blog.pythian.com/deal-metadata-lock/


위에 문제가 되지 않는다는 발언은 정정해야겠다

Sleep이 문제의 단서가 되었다.

다시 말해, 예외 처리가 제대로 되어있지 않은 경우 프로그램이 불완전하게 종료된다. 그러면 db와 연결이 끊어지지 않게 되고 연결된 쪽에서

권한을 가진 문제가 발생한다. 일반적인 상황이면 큰 문제가 되지 않으나 metadata에 접근하는 경우 다음과 같은 문제가 발생하게 된다.

이 때 해결책은 불완전한 연결을 끊어주어 transaction의 무결성을 지켜줘야 한다.

불완전하게 종료된 연결이 계속된 상황에서는 commit이나 rollback 둘 다 먹히지 않는다.


그러므로 지금 생각하는 교훈은 다음과 같다. (추후에 공부하면서 바뀔 수 있으니 절대적인 생각은 아니다)


DB와 연결하는 프로그램의 경우 예외 처리 때 가능하면 DB 접속 종료를 기본으로 해두자