[MySQL] - deadlock 현상

이상목·2023년 10월 12일
0

MySQL

목록 보기
1/2
post-thumbnail

업무 중 웹 화면에서 계속 무한 로딩이 걸려 원인을 찾아보니 deadlock이 발생했다..
이로 인해 서비스중인 서버를 급하게 살리려면 서버를 재가동 해야했기에 deadlock에 대해 알아보면서
해결방법을 찾아보도록 해요 !

데드락이란 ?

  • 데드락이란 일반적으로 교착 상태를 뜻하는 것으로,
    동일한 자원을 공유하고 있는 2개 이상의 작업이 자신들의 작업을 진행하기 위해 사용해야 하는 리소스를
    서로 미리 선점함으로써 상대방의 자원에 접근하는 것을 방해해 교착 상태에 빠진 것을 의미합니다.
  • 이와 같이 서로 리소스를 차지하기 위해 교착 상태에 빠진 경우 데이터베이스는 둘 중 하나의 트랜잭션을 롤백하여 교착 상태를 해소합니다.



deadlock 확인하기

  • MySql DB에서 innodb를 활용하여 deadlock을 확인할 수 있다.
  • innodb는 트랜잭션 실행 시 데드락 현상이 발생하면 그것을 감지하고, 앞서 설명한 것처럼 하나의 트랜잭션을 롤백하여 데드락을 해소하고 그 정보를 로그로 남겨서 알려준다.
show engine innodb status
  • 이와 같은 구문을 통해 innodb의 정보를 확인할 수 있다. 다만, 가장 최신의 정보만 남기 때문에 데드락 발생 이력을 조회한다기보다는
    마지막 발생한 데드락을 확인하는 용도로 사용할 수 있다.

innodb의 상세정보에는 다음과 같은 정보를 확인할 수 있다.

1. [SEMAPHORES]

 - wait 발생 여부와 spin wait 및 spin round의 발생 여부 등 여러 가지 정보를 보여준다.
 <img src="https://velog.velcdn.com/images/sangmoki/post/7775e328-827d-4d35-9127-196c5ef08717/image.png">

2. [LATEST FOREIGN KEY ERROR]

 - 마지막 발생한 참조키 에러 발생 내역을 확인할 수 있다.
 <img src="https://velog.velcdn.com/images/sangmoki/post/5052f5ab-71d9-411a-9f56-46fe30be3a9d/image.png">

3. [LATEST DETECTED DEADLOCK]

 - 마지막에 발생한 데드락 내역 확인
 <img src="https://velog.velcdn.com/images/sangmoki/post/6801a4ad-f604-4b8f-a38e-2874d28100ba/image.png">

4. [TRANSACTIONS]

- 현재 실행 중인 트랜잭션의 trx id(트랜잭션의 현재 id)
- 각각의 트랜잭션에 따라 증가해 counting 된다.
- 이 정보를 통해 현재 트랜잭션들이 어떠한 상태에서 동작중인 지를 확인할 수 있다.

5. [FILE I/O]

- 여기서 말하는 thread는 isnert buffer thread, log thread, read thread, write thread)들이 동작하는 상태를 보여준다. #### 6. [INSERT BUFFER AND ADAPTIVE HASH INDEX] - 이 정보는 insert buffer와 adaptive hash의 상태를 보여준다. #### 7. [BUFFER POOL AND MEMORY] - 이 정보는 innodb buffer pool의 사용 상태와 memory 사용 상태를 보여준다. innodb 레벨에서 pending된 read의 수와 write의 수를 알 수 있고, 몇 개의 페이지가 읽히고 쓰였는지를 확인할 수 있다. 그 외의 정보들도 확인할 수 있다. #### 8. [LOGS] - 이 정보는 innodb의 log subsystem에 대한 정보를 제공한다. - 현재 사용하는 로그의 sequence number를 확인할 수 있고 flush된 로그 번호도 확인할 수 있다.




데드락이 어디에서 발생했는지 확인하기

  • LATEST DETECTED DEADLOCK
    - transaction : 트랜잭션에 대한 정보를 보여준다.
    - wating for this lock to be granted : 트랜잭션이 실행하기 위해 lock을 걸어야 하는 데이터에 대한 정보, 즉 row에 대한 정보를 보여준다.
    - holds the lock(s) : 현재 잡고 있는 lock에 대한 정보를 보여준다.

  • 정리하자면
- 발생 시간
- (1)번 트랜잭션 정보
- (1)번 트랜잭션이 사용하기 위해 기다리고 있는 row에 대한 정보
- (2)번 트랜잭션 정보
- (2)번 트랜잭션이 현재 잡고 있는 row에 대한 정보
- (2)번 트랜잭션이 사용하기 위해 기다리고 있는 row에 대한 정보

이를 통해 어디서 deadlock이 발생했고 내부 정보에 대한 내용을 간략하게 정리해보았습니다.
감사합니다.





레퍼런스
https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=52944

https://chrisjune-13837.medium.com/db-lock-%EB%9D%BD%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-d908296d0279

https://velog.io/@ljm0726/Deadlock

https://velog.io/@conatuseus/OS-Deadlock

profile
기록은 기억을 지배한다.

0개의 댓글