다음을 통해 공유


SQL Server 복구 보류 중 또는 의심 상태의 Always On 가용성 데이터베이스 문제 해결

이 문서에서는 또는 Suspect 상태에 있는 Microsoft SQL Server 가용성 데이터베이스의 Recovery Pending 오류 및 제한 사항과 가용성 그룹의 전체 기능으로 데이터베이스를 복원하는 방법을 설명합니다.

원래 제품 버전: SQL Server 2012
원래 KB 번호: 2857849

요약

Always On 가용성 그룹에 정의된 가용성 데이터베이스가 SQL Server 또는 Suspect 상태로 전환된다고 가정합니다Recovery Pending. 가용성 그룹의 기본 복제본(replica) 이 문제가 발생하면 데이터베이스 가용성이 영향을 받습니다. 이 경우 클라이언트 애플리케이션을 통해 데이터베이스에 액세스할 수 없습니다. 또한 가용성 그룹에서 데이터베이스를 삭제하거나 제거할 수 없습니다.

예를 들어 SQL Server 실행 중이고 가용성 데이터베이스가 또는 Suspect 상태로 설정되어 있다고 Recovery Pending 가정합니다. 다음 SQL 스크립트를 사용하여 기본 복제본(replica) DMV(동적 관리 뷰)를 쿼리하는 경우 데이터베이스는 다음과 같이 및 RECOVERY_PENDING 상태 또는 SUSPECT 상태로 보고 NOT_HEALTHY 될 수 있습니다.

SELECT
    dc.database_name,
    d.synchronization_health_desc,
    d.synchronization_state_desc,
    d.database_state_desc
FROM
    sys.dm_hadr_database_replica_states d
    JOIN sys.availability_databases_cluster dc ON d.group_database_id = dc.group_database_id
    AND d.is_local = 1
database_name          synchronization_health_desc     synchronization_state_desc   database_state_desc
-------------------- ------------------------------ ------------------------------ ---------------------
<DatabaseName>                         NOT_HEALTHY              NOT SYNCHRONIZING      RECOVERY_PENDING
(1 row(s) affected)

데이터베이스 상태 및 동기화 상태를 검사 스크립트에 대한 실행 결과의 스크린샷.

또한 이 데이터베이스는 SQL Server Management Studio 동기화 안 됨/복구 보류 중 또는 용의자 상태인 것으로 보고될 수 있습니다.

동기화되지 않음/복구 보류 중 상태인 데이터베이스의 스크린샷.

데이터베이스가 가용성 그룹에 정의되면 데이터베이스를 삭제하거나 복원할 수 없습니다. 따라서 데이터베이스를 복구하고 프로덕션 용도로 되돌리려면 특정 단계를 수행해야 합니다.

추가 정보

다음 콘텐츠에서는 다양한 상황에서 복구 보류 중 상태인 가용성 데이터베이스의 오류 및 제한 사항에 대해 설명합니다.

  • 데이터베이스 상태 데이터베이스 복원을 방지합니다.

    다음 SQL 스크립트를 실행하여 매개 변수가 있는 데이터베이스를 RECOVERY 복원하려고 합니다.

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    이 스크립트를 실행하면 데이터베이스가 가용성 그룹에 정의되어 있으므로 다음 오류 메시지가 표시됩니다.

    Msg 3104, Level 16, State 1, Line 1
    RESTORE는 데이터베이스 <미러링을 위해 구성되었거나 가용성 그룹에 조인되었기 때문에 DatabaseName> 데이터베이스에서 작동할 수 없습니다. 데이터베이스를 복원하려는 경우 ALTER DATABASE를 사용하여 미러링을 제거하거나 가용성 그룹에서 데이터베이스를 제거합니다.

    Msg 3013, Level 16, State 1, Line 1
    RESTORE DATABASE가 비정상적으로 종료됩니다.

  • 데이터베이스 상태 데이터베이스 삭제 방지

    다음 SQL 스크립트를 실행하여 데이터베이스를 삭제하려고 합니다.

    DROP DATABASE <DatabaseName>
    

    이 스크립트를 실행하면 데이터베이스가 가용성 그룹에 정의되어 있으므로 다음 오류 메시지가 표시됩니다.

    Msg 3752, Level 16, State 1, Line 1
    DatabaseName> 데이터베이스<는 현재 가용성 그룹에 조인되어 있습니다. 데이터베이스를 삭제하려면 가용성 그룹에서 제거해야 합니다.

  • 데이터베이스 상태 가용성 그룹에서 데이터베이스를 제거하는 것을 방지합니다.

    다음 SQL 스크립트를 실행하여 가용성 그룹에서 데이터베이스를 제거하려고 합니다.

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    이 스크립트를 실행하려고 하면 가용성 데이터베이스가 기본 복제본(replica) 속하기 때문에 다음 오류 메시지가 표시됩니다.

    Msg 35240, Level 16, State 14, Line 1
    가용성 그룹 <AvailabilityGroupName에서 Database <DatabaseName>>을 조인하거나 조인할 수 없습니다. 이 작업은 가용성 그룹의 기본 복제본(replica) 지원되지 않습니다.

    이 오류 메시지로 인해 데이터베이스를 장애 조치(failover)해야 할 수 있습니다. 데이터베이스가 장애 조치(failover)된 후 복구 보류 중인 데이터베이스를 소유하는 복제본(replica) 보조 역할에 있습니다. 이 경우 다음 SQL 스크립트를 다시 실행하여 보조 복제본(replica) 가용성 그룹에서 데이터베이스를 제거합니다.

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    그러나 여전히 가용성 그룹에서 데이터베이스를 제거할 수 없으며 데이터베이스가 복구 보류 중 상태이므로 다음 오류 메시지가 표시됩니다.

    Msg 921, Level 16, State 112, Line 1
    DatabaseName <> 은 아직 복구되지 않았습니다. 기다렸다가 다시 시도하십시오.

데이터베이스가 보조 역할에 있을 때 해결

이 문제를 resolve 하려면 다음 일반적인 작업을 수행합니다.

  • 데이터베이스가 보조 역할에 있을 때 손상된 데이터베이스를 호스팅하는 복제본(replica) 가용성 그룹에서 제거합니다.
  • 시스템에 영향을 미치고 데이터베이스 오류에 영향을 주었을 수 있는 문제를 해결합니다.
  • 복제본(replica) 가용성 그룹으로 복원합니다.

이러한 작업을 수행하려면 새 주 복제본(replica) 연결한 다음 SQL 스크립트를 ALTER AVAILABILITY GROUP 실행하여 실패한 가용성 데이터베이스를 호스팅하는 복제본(replica) 제거합니다. 이를 위해 다음 작업을 수행하십시오.

이러한 단계에서는 주 복제본(replica) 먼저 손상된 데이터베이스를 호스트한다고 가정합니다. 따라서 손상된 데이터베이스를 호스트하는 복제본(replica) 보조 역할로 전환하려면 먼저 장애 조치(failover)가 발생해야 합니다.

  1. SQL Server 실행 중이고 보조 복제본(replica) 호스팅하는 서버에 연결합니다.

  2. 다음 SQL 스크립트를 실행합니다.

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
    
  3. 다음 SQL 스크립트를 실행하여 가용성 그룹에서 손상된 데이터베이스를 호스팅하는 복제본(replica) 제거합니다.

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
    
  4. SQL Server 실행 중인 서버에서 데이터베이스 오류에 영향을 미칠 수 있는 문제를 해결합니다.

  5. 복제본(replica) 가용성 그룹에 다시 추가합니다.

주 복제본(replica) 가용성 그룹의 유일한 복제본(replica) 경우 해결 방법

주 복제본(replica) 손상된 데이터베이스를 호스트하고 가용성 그룹에서 유일하게 작동하는 복제본(replica) 경우 가용성 그룹을 삭제해야 합니다. 가용성 그룹을 삭제한 후에는 백업에서 데이터베이스를 복구하거나 다른 긴급 복구 작업을 적용하여 데이터베이스를 복원하고 프로덕션을 다시 시작할 수 있습니다.

가용성 그룹을 삭제하려면 다음 SQL 스크립트를 사용합니다.

DROP AVAILABILITY GROUP <AvailabilityGroupName>

이 시점에서 문제가 있는 데이터베이스를 복구할 수 있습니다. 또는 마지막으로 잘 알려진 백업 복사본에서 데이터베이스를 복원할 수 있습니다.

가용성 그룹을 삭제할 때 해결 방법

가용성 그룹을 삭제하면 수신기 리소스도 삭제되고 가용성 데이터베이스에 대한 애플리케이션 연결이 중단됩니다.

애플리케이션 가동 중지 시간을 최소화하려면 다음 방법 중 하나를 사용하여 수신기를 통해 애플리케이션 연결을 유지하고 가용성 그룹을 삭제합니다.

방법 1: 장애 조치(failover) 클러스터 관리자에서 수신기를 새 가용성 그룹(역할)과 연결

이 메서드를 사용하면 가용성 그룹을 삭제하고 다시 만드는 동안 수신기를 유지 관리할 수 있습니다.

  1. 기존 가용성 그룹 수신기가 연결을 지시하는 SQL Server instance 빈 새 가용성 그룹을 만듭니다. 이 프로세스를 간소화하려면 Transact-SQL 명령을 사용하여 보조 복제본(replica) 또는 데이터베이스가 없는 가용성 그룹을 만듭니다.

    USE master
    GO
    CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
        ENDPOINT_URL = 'tcp://sqlnode1:5022',
        AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
        FAILOVER_MODE = MANUAL
    )
    
  2. 장애 조치(failover) 클러스터 관리자를 시작한 다음, 왼쪽 창에서 역할을 선택합니다. 역할을 나열하는 창에서 원래 가용성 그룹을 선택합니다.

  3. 리소스 탭 아래의 아래쪽 가운데 창에서 가용성 그룹 리소스를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다. 종속성 탭을 선택하고 수신기에 대한 종속성을 삭제한 다음 확인을 선택합니다.

    가용성 그룹 속성 종속성 탭의 스크린샷

  4. 리소스 아래에서 수신기를 마우스 오른쪽 단추로 클릭하고 추가 작업을 선택한 다음 , 다른 역할에 할당을 선택합니다.

  5. 역할에 원본 할당 대화 상자에서 새 가용성 그룹을 선택한 다음 확인을 선택합니다.

    추가된 새 가용성 그룹을 보여 주는 역할에 원본 할당 대화 상자의 스크린샷

  6. 역할 창에서 새 가용성 그룹을 선택합니다. 아래쪽 가운데 창의 리소스 탭 아래에 새 가용성 그룹 및 수신기 리소스가 표시됩니다. 새 가용성 그룹 리소스를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다.

  7. 종속성 탭을 클릭하고 드롭다운 상자에서 수신기 리소스를 선택한 다음 확인을 선택합니다.

    새 가용성 그룹 속성 종속성 탭의 스크린샷

  8. SQL Server Management Studio 개체 탐색기 사용하여 새 가용성 그룹의 기본 복제본(replica) 호스트하는 SQL Server instance 연결합니다. 고가용성 Always On 선택하고 새 가용성 그룹을 클릭한 다음 가용성 그룹 수신기를 선택합니다. 수신기를 찾아야 합니다.

  9. 수신기를 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 수신기에 적절한 포트 번호를 입력한 다음 확인을 선택합니다.

    수신기 구성을 보여 주는 가용성 그룹 수신기 속성의 스크린샷

이렇게 하면 수신기를 사용하는 애플리케이션에서 이 기능을 사용하여 중단 없이 프로덕션 데이터베이스를 호스팅하는 SQL Server instance 연결할 수 있습니다. 이제 원래 가용성 그룹을 완전히 제거하고 다시 만들 수 있습니다. 또는 데이터베이스 및 복제본을 새 가용성 그룹에 추가할 수 있습니다.

원래 가용성 그룹을 다시 만드는 경우 수신기를 가용성 그룹 역할에 다시 할당하고, 새 가용성 그룹 리소스와 수신기 간의 종속성을 설정한 다음, 수신기에 포트를 다시 할당해야 합니다. 이렇게 하려면 다음과 같이 하십시오.

  1. 장애 조치(failover) 클러스터 관리자를 시작한 다음, 왼쪽 창에서 역할을 선택합니다. 역할을 나열하는 창에서 수신기를 호스트하는 새 가용성 그룹을 클릭합니다.
  2. 리소스 탭 아래의 아래쪽 가운데 창에서 수신기를 마우스 오른쪽 단추로 클릭하고 추가 작업을 선택한 다음, 다른 역할에 할당을 선택합니다. 대화 상자에서 다시 만든 가용성 그룹을 선택한 다음 확인을 선택합니다.
  3. 역할 창에서 다시 만든 가용성 그룹을 클릭합니다. 아래쪽 가운데 창의 리소스 탭 아래에 다시 만든 가용성 그룹 및 수신기 리소스가 표시됩니다. 다시 만든 가용성 그룹 리소스를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다.
  4. 종속성 탭을 선택하고 드롭다운 상자에서 수신기 리소스를 선택한 다음 확인을 선택합니다.
  5. SQL Server Management Studio 개체 탐색기 사용하여 다시 만든 가용성 그룹의 기본 복제본(replica) 호스트하는 SQL Server instance 연결합니다. 고가용성 Always On 선택하고 새 가용성 그룹을 클릭한 다음 가용성 그룹 수신기를 선택합니다. 수신기를 찾아야 합니다.
  6. 수신기를 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 수신기에 적절한 포트 번호를 입력한 다음 확인을 선택합니다.

방법 2: 수신기를 기존 SQL Server SQLFCI(장애 조치(failover) 클러스터형 인스턴스)와 연결

SQL Server SQLFCI(장애 조치(failover) 클러스터형 인스턴스)에서 가용성 그룹을 호스팅하는 경우 가용성 그룹을 삭제한 다음 다시 만드는 동안 수신기 클러스터형 리소스를 SQLFCI 클러스터형 리소스 그룹과 연결할 수 있습니다.

  1. 장애 조치(failover) 클러스터 관리자를 시작한 다음, 왼쪽 창에서 역할을 선택합니다.

  2. 역할을 나열하는 창에서 원래 가용성 그룹을 선택합니다.

  3. 리소스 탭 아래의 가운데 아래 창에서 가용성 그룹 리소스를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다.

  4. 종속성 탭을 선택하고 수신기에 대한 종속성을 삭제한 다음 확인을 선택합니다.

  5. 리소스 탭 아래의 아래쪽 가운데 창에서 수신기를 마우스 오른쪽 단추로 클릭하고 추가 작업을 선택한 다음, 다른 역할에 할당을 선택합니다.

  6. 역할에 리소스 할당 대화 상자에서 SQL Server FCI instance 클릭한 다음 확인을 선택합니다.

    역할에 리소스 할당 대화 상자의 스크린샷

  7. 역할 창에서 SQLFCI 그룹을 선택합니다. 아래쪽 가운데 창의 리소스 탭 아래에 새 수신기 리소스가 표시됩니다.

이렇게 하면 수신기를 사용하는 애플리케이션이 중단 없이 프로덕션 데이터베이스를 호스트하는 SQL Server instance 연결할 수 있습니다. 이제 원래 가용성 그룹을 제거하고 다시 만들 수 있습니다. 또는 데이터베이스 및 복제본을 새 가용성 그룹에 추가할 수 있습니다.

가용성 그룹을 다시 만든 후 수신기를 가용성 그룹 역할에 다시 할당합니다. 그런 다음, 새 가용성 그룹 리소스와 수신기 간의 종속성을 설정하고 수신기에 포트를 다시 할당합니다.

  1. 장애 조치(failover) 클러스터 관리자를 시작한 다음, 왼쪽 창에서 역할을 선택합니다.
  2. 역할을 나열하는 창에서 원래 SQLFCI 역할을 클릭합니다.
  3. 가운데 아래 창의 리소스 탭에서 수신기를 마우스 오른쪽 단추로 클릭하고 추가 작업을 선택한 다음 , 다른 역할에 할당을 선택합니다.
  4. 대화 상자에서 다시 만든 가용성 그룹을 클릭한 다음 확인을 선택합니다.
  5. 역할 창에서 새 가용성 그룹을 선택합니다.
  6. 리소스 탭 아래에 새 가용성 그룹 및 수신기 리소스가 표시됩니다. 새 가용성 그룹 리소스를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다.
  7. 종속성 탭을 선택하고 드롭다운 상자에서 수신기 리소스를 선택한 다음 확인을 선택합니다.
  8. SQL Server Management Studio 개체 탐색기 사용하여 새 가용성 그룹의 기본 복제본(replica) 호스트하는 SQL Server instance 연결합니다.
  9. 고가용성 Always On 선택하고 새 가용성 그룹을 클릭한 다음 가용성 그룹 수신기를 선택합니다. 수신기를 찾아야 합니다.
  10. 수신기를 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 수신기에 적절한 포트 번호를 입력한 다음 확인을 선택합니다.

방법 3: 가용성 그룹을 삭제한 다음, 동일한 수신기 이름으로 가용성 그룹 및 수신기를 다시 만듭니다.

이 메서드는 가용성 그룹 및 수신기가 삭제된 후 다시 만들어지므로 현재 연결된 애플리케이션에 대해 작은 중단이 발생합니다.

  1. 가용성 그룹을 삭제합니다.

    참고

    그러면 수신기도 삭제됩니다.

  2. 프로덕션 데이터베이스를 호스트하는 동일한 서버에 수신기 정의를 포함하는 비어 있는 새 가용성 그룹을 즉시 만듭니다.

    예를 들어 가용성 그룹 수신기가 aglisten이라고 가정합니다. 다음 Transact-SQL 문은 주 데이터베이스 또는 보조 데이터베이스가 없는 가용성 그룹을 만들지만 aglisten이라는 수신기도 만듭니다. 애플리케이션은 이 수신기를 사용하여 연결할 수 있습니다.

    USE master
    GO
        CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH (
            ENDPOINT_URL = 'tcp://sqlnode1:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL
        ) LISTENER 'aglisten' (
            WITH IP ((N'11.0.0.25', N'255.0.0.0')),
            PORT = 1433
        )
    GO
    
  3. 손상된 데이터베이스를 복구합니다. 그런 다음, 해당 항목과 보조 복제본(replica) 가용성 그룹에 다시 추가합니다.