티스토리 뷰

DB

[DB] MS SQL에서 (In Recovery) 상태

해구름 2017. 11. 14. 22:34
반응형

오류: MS SQL에서 (In Recovery)상태가 나타나며 DB 작업을 할 수 없는 상태가 될 경우가 있습니다.

원인: Transaction 또는 Rollback 작업 중에 DBMS가 중단된 경우 (시스템 또는 OS종료 등)

대처:

  1. 복구가 끝날 때까지 기다리는 방법 외엔 없습니다. DB를 재시작해도 다시 (In Recovery) 상태에 빠집니다.
  2. 만약 장기간 기다려도 해결되지 않을 경우 백업을 통해 복구를 진행하셔야 합니다.
  3. 다음과 같은 코드를 통해 복구시간이 얼마나 소요될 지 예측할 수 있습니다.
    -- MS SQL 2008 이하
    DECLARE @DBName VARCHAR(64) = '대상DB명'
    DECLARE @ErrorLog AS TABLE([LogDate] CHAR(24), [ProcessInfo] VARCHAR(64), [TEXT] VARCHAR(MAX))
    
    INSERT INTO @ErrorLog
    EXEC sys.xp_readerrorlog 0, 1, 'Recovery of database', @DBName
     
    SELECT TOP 5
         [LogDate]
        ,SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) AS PercentComplete
        ,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 AS MinutesRemaining
        ,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 AS HoursRemaining
        ,[TEXT]
     
    FROM @ErrorLog ORDER BY [LogDate] DESC
    
    -- MS SQL 2012부터 
    DECLARE @DBName VARCHAR(64) = '대상DB명'
    DECLARE @ErrorLog AS TABLE([LogDate] CHAR(24), [ProcessInfo] VARCHAR(64), [TEXT] VARCHAR(MAX))
     
    INSERT INTO @ErrorLog
    EXEC master..sp_readerrorlog 0, 1, 'Recovery of database', @DBName
     
    SELECT TOP 5
         [LogDate]
        ,SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) AS PercentComplete
        ,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 AS MinutesRemaining
        ,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 AS HoursRemaining
        ,[TEXT]
     
    FROM @ErrorLog ORDER BY [LogDate] DESC


댓글