AWS RDS SQL Server DeadLock 잡기

리미·2021년 1월 30일
0
post-thumbnail

회사에 Deadlock이 너무 많이 걸린다(거의 일주일에 2-3번정도)
신경을 안쓸래야 안쓸수가없어서 고쳐보도록해본다

빡친점 : AWS RDS는 master admin이고, 흔히 말하는 MSSQL의 sa(sysadmin)의 권한과는 아주 많은 차이가 있다. On-premiss에서는 되지만 AWS RDS에서는 permission error가 뜨면서 안돼는 점이 많다.
(azure에서도 특정 권한을 주면 된다는 것 같다 AWS에서 mssql을 운영할 생각은 하지말자)

AWS console에서 파라미터 변경

참고 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/rds-deadlock-event-notification/
우리가 첫번째로 할 일은 AWS 파라미터그룹을 수정하는 것이다.
기존에 사용하고 있던 파라미터 그룹이 default로 되어있는 경우 새로 파라미터 그룹을 생성해서 사용해야한다.

  1. RDS -> 해당 데이터베이스에서 옵션그룹이 몇 버전인지 확인하고 파라미터 그룹default로 되어있는지 확인한다.
  • 파라미터 그룹이 default가 아닌 경우, 바로 파라미터 그룹을 클릭해서 파라미터 그룹 페이지로 들어간다
  • 파라미터 그룹이 default인 경우 메뉴에 파라미터 그룹 > 파라미터 그룹 생성을 누르고 파라미터 옵션 패밀리에 확인한 옵션그룹(SQL Server Standard Edition일 경우 sqlserver-se-14.0)을 넣는다.
  1. 해당 파라미터 그룹 페이지에서 120412221 로 수정한다.
  2. 새로 생성한 경우, 해당 데이터베이스 수정에서 바꾸어주어야한다.
    나는 새로 생성해서 default 파라미터 그룹을 내가 생성한 파라미터 그룹으로 변경해주었는데, 재부팅없이 바로 반영되었다.(라이브 디비라 무섭..)

알람도 마찬가지로 참고 링크 따라서 CloudWatch로 걸면된다.

기다린다..deadlock

이제부터는 시간과의 싸움이다..
난 이미 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로만 바꿔주면된다.

DeadLock

결국 나의 경우는 SELECT 문과 UPDATE 문에서 conflict이 나는건데,
왜 SELECT에서 충돌이 나는 걸까했을때 isolation level을 보자(xml보면 나와있다)
isolation level에 관련된건 나중에 정리하도록하고,
결국 여기 isolation levelread commited로 되어있어, SELECT문과 UPDATE문에도 충돌이 난것이다.
결국 isonlation levelread uncommited로 바꾸면 충돌이 더이상 일어나지 않겠지만, 우리 서비스에서 과연 그렇게 해도 될지는 지금으로써는 가늠이 안가서 좀더 파악하고 결정하기로 하고,
일단 해당 SELECT 문에 with (nolock) 처리로 2주이상 지켜본 결과 더 이상 deadlock이 안나는 걸 확인했다.

참고 : https://docs.microsoft.com/ko-kr/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-2017

profile
Python이 하고싶은데 자꾸 Flutter 시켜서 빡쳐서 만든 블로그

0개의 댓글