공부, 기록

[AWS RDS SQL Server] 백업 로그 관련 데드락 본문

공부/DATABASE

[AWS RDS SQL Server] 백업 로그 관련 데드락

무는빼주세요 2024. 1. 24. 09:55

백업 시간대에 모니터링에 데드락이 확인되어 errorlog 등을 확인하였다.

 

ERRORLOG 내용

 

NODE 1

PROCESS ID process1b33f7be8c8 (이하 프로세스 A)

DELETE FROM msdb.dbo.backupset
  WHERE backup_set_id IN (SELECT backup_set_id
                          FROM @backup_set_id     
     frame procname=adhoc line=12 stmtstart=714 stmtend=832 sqlhandle=0x0200000077cf362f18334db4e5df45ed12b88dd5ec463b020000000000000000000000000000000000000000
unknown     
    inputbuf
DECLARE @num_days_to_retain INT
DECLARE @earliest_retain_datetime DATETIME
SET @num_days_to_retain = CAST('3' AS INT)
IF @num_days_to_retain < 1 BEGIN
    RAISERROR('NumDaysToRetain is %d but must be at least 1', 16, 0, @num_days_to_retain) WITH LOG
END
SET @earliest_retain_datetime = DATEADD(day, 0 - @num_days_to_retain, SYSUTCDATETIME())
exec msdb..sp_delete_backuphistory @earliest_retain_datetime    

 

NODE 2

PROCESS ID process1b33f61fc28 (이하 프로세스 B)

BACKUP LOG @database_name TO VIRTUAL_DEVICE = @vdi_device_name WITH buffercount = 6, maxtransfersize = 1048576, INIT, RETAINDAYS = 36, NOSKIP, NOFORMAT, CHECKSUM, STATS = 10, DESCRIPTION = '9d6a1181-a144-4edc-bdde-a12a3f842f63', COMPRESSION;     

 

RESOURCE-LIST-LOG

  resource-list
   objectlock lockPartition=0 objid=1755153298 subresource=FULL dbid=4 objectname=msdb.dbo.backupfile id=lock1c172fcdc00 mode=X associatedObjectId=1755153298
    owner-list
     owner id=process1b33f7be8c8 mode=X
    waiter-list
     waiter id=process1b33f61fc28 mode=IX requestType=wait
   pagelock fileid=1 pageid=12445 dbid=4 subresource=FULL objectname=msdb.dbo.backupset id=lock1bf64659300 mode=IX associatedObjectId=72057594048020480
    owner-list
     owner id=process1b33f61fc28 mode=IX
    waiter-list
     waiter id=process1b33f7be8c8 mode=U requestType=wait

 

프로세스 A에서 backupfile 테이블에 X락 backupset 테이블에 U락

프로세스 B에서 backupfile 테이블에 IX 락 backupset 에 IX락

 

-->  sp_delete_backuphistory  SP 내에 backupset , backupfile  테이블에 DELETE 구문이 있음

백업 데이터 삭제(20:16:04)와 로그 백업(20:16:03)이 동시에 발생하면서 생긴 현상으로 보임.

--> backupset  테이블에 해당 시점 데이터 누락 확인 2023-09-05 20:16에 DB 백업 로그 내역이 없음
--> 실제 로그백업 파일은 존재.

즉 VICTIM이었던 BACKUP LOG에서 실제 로그 백업 후 데이터 입력이 데드락으로 실패한 것으로 보이며 내부적으로 백업 로그 삭제하는 작업과 데드락이 발생한 것으로 판단됨.

결론 : 실제 백업으로 인한 데드락이 아닌 백업 내역 관리 테이블에서 발생한 데드락으로 확인