회사에 Deadlock이 너무 많이 걸린다(거의 일주일에 2-3번정도)
신경을 안쓸래야 안쓸수가없어서 고쳐보도록해본다
빡친점 : AWS RDS는 master admin이고, 흔히 말하는 MSSQL의 sa(sysadmin)의 권한과는 아주 많은 차이가 있다. On-premiss에서는 되지만 AWS RDS에서는 permission error가 뜨면서 안돼는 점이 많다.
(azure에서도 특정 권한을 주면 된다는 것 같다AWS에서 mssql을 운영할 생각은 하지말자)
참고 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/rds-deadlock-event-notification/
우리가 첫번째로 할 일은 AWS 파라미터그룹을 수정하는 것이다.
기존에 사용하고 있던 파라미터 그룹이 default로 되어있는 경우 새로 파라미터 그룹을 생성해서 사용해야한다.
RDS -> 해당 데이터베이스
에서 옵션그룹이 몇 버전인지 확인하고 파라미터 그룹이 default로 되어있는지 확인한다.파라미터 그룹 > 파라미터 그룹 생성
을 누르고 파라미터 옵션 패밀리
에 확인한 옵션그룹(SQL Server Standard Edition일 경우 sqlserver-se-14.0)을 넣는다.값
을 1
로 수정한다.알람도 마찬가지로 참고 링크 따라서 CloudWatch로 걸면된다.
이제부터는 시간과의 싸움이다..
난 이미 deadlock 평일 오전 몇시쯤에 나오는지 파악이 된 상태라 그 시간이 될때까지 기다렸다.
deadlock이 나왔다는 알림이 오자마자 바로 가서 확인을 했다
sp_readerrorlog 0, 1
치니까 너무 길게 나와서 보기가 힘들었다
그래서 찾은 구문
WITH fxd
AS (SELECT CAST(fx.event_data AS XML) AS Event_Data
FROM sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL) AS fx )
SELECT dl.deadlockgraph
FROM
(
SELECT dl.query('.') AS deadlockgraph
FROM fxd
CROSS APPLY event_data.nodes('(/event/data/value/deadlock)') AS d(dl)
) AS dl
이걸돌리면 보기 편하게 xml로 나오는데 도형으로 보고싶으면 xml을 저장해서 확장자를 xdl로만 바꿔주면된다.
결국 나의 경우는 SELECT 문과 UPDATE 문에서 conflict이 나는건데,
왜 SELECT에서 충돌이 나는 걸까했을때 isolation level
을 보자(xml보면 나와있다)
isolation level
에 관련된건 나중에 정리하도록하고,
결국 여기 isolation level
이 read commited
로 되어있어, SELECT문과 UPDATE문에도 충돌이 난것이다.
결국 isonlation level
을 read uncommited
로 바꾸면 충돌이 더이상 일어나지 않겠지만, 우리 서비스에서 과연 그렇게 해도 될지는 지금으로써는 가늠이 안가서 좀더 파악하고 결정하기로 하고,
일단 해당 SELECT 문에 with (nolock)
처리로 2주이상 지켜본 결과 더 이상 deadlock이 안나는 걸 확인했다.