Condividi tramite


Risolvere i problemi relativi ai database di disponibilità Always On in stato di ripristino in sospeso o sospetto in SQL Server

Questo articolo descrive gli errori e le limitazioni di un database di disponibilità in Microsoft SQL Server in Recovery Pending uno stato o Suspect e come ripristinare la funzionalità completa del database in un gruppo di disponibilità.

Versione originale del prodotto: SQL Server 2012
Numero KB originale: 2857849

Riepilogo

Si supponga che un database di disponibilità definito in un gruppo di disponibilità Always On passi a uno Recovery Pending stato o Suspect in SQL Server. Se ciò si verifica nella replica primaria del gruppo di disponibilità, la disponibilità del database è interessata. In questo caso, non è possibile accedere al database tramite le applicazioni client. Inoltre, non è possibile eliminare o rimuovere il database dal gruppo di disponibilità.

Si supponga, ad esempio, che SQL Server sia in esecuzione e che un Recovery Pending database di disponibilità sia impostato sullo stato o Suspect . Quando si eseguono query sulle viste a gestione dinamica (DMV) nella replica primaria usando lo script SQL seguente, il database potrebbe essere segnalato in uno NOT_HEALTHY stato e RECOVERY_PENDING o in SUSPECT uno stato come indicato di seguito:

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)

Screenshot del risultato dell'esecuzione per lo script per controllare l'integrità e lo stato di sincronizzazione del database.

Inoltre, questo database può essere segnalato come in stato Non sincronizzato/Ripristino in sospeso o Sospetto in SQL Server Management Studio.

Screenshot del database che si trova nello stato Non sincronizzato/Ripristino in sospeso.

Quando il database è definito in un gruppo di disponibilità, non è possibile eliminare o ripristinare il database. Pertanto, è necessario eseguire passaggi specifici per ripristinare il database e restituirlo all'uso in ambito di produzione.

Ulteriori informazioni

Il contenuto seguente illustra gli errori e le limitazioni di un database di disponibilità che si trova in uno stato Di ripristino in sospeso in varie situazioni.

  • Lo stato del database impedisce il ripristino del database

    Si tenta di eseguire lo script SQL seguente per ripristinare il database con il RECOVERY parametro :

    RESTORE DATABASE <DatabaseName> WITH RECOVERY
    

    Quando si esegue questo script, viene visualizzato il messaggio di errore seguente perché il database è definito in un gruppo di disponibilità:

    Messaggio 3104, Livello 16, Stato 1, Riga 1
    RESTORE non può operare sul database <DatabaseName> perché è configurato per il mirroring del database o ha aggiunto un gruppo di disponibilità. Se si intende ripristinare il database, usare ALTER DATABASE per rimuovere il mirroring o rimuovere il database dal relativo gruppo di disponibilità.

    Messaggio 3013, livello 16, stato 1, riga 1
    RESTORE DATABASE termina in modo anomalo.

  • Lo stato del database impedisce l'eliminazione del database

    Si tenta di eseguire lo script SQL seguente per eliminare il database:

    DROP DATABASE <DatabaseName>
    

    Quando si esegue questo script, viene visualizzato il messaggio di errore seguente perché il database è definito in un gruppo di disponibilità:

    Messaggio 3752, livello 16, stato 1, riga 1
    Il database <DatabaseName> è attualmente aggiunto a un gruppo di disponibilità. Prima di eliminare il database, è necessario rimuoverlo dal gruppo di disponibilità.

  • Lo stato del database impedisce la rimozione del database dal gruppo di disponibilità

    Si tenta di eseguire lo script SQL seguente per rimuovere il database dal gruppo di disponibilità:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Quando si tenta di eseguire questo script, viene visualizzato il messaggio di errore seguente perché il database di disponibilità appartiene alla replica primaria:

    Messaggio 35240, Livello 16, Stato 14, Riga 1
    Database <DatabaseName> non può essere aggiunto al gruppo <di disponibilità AvailabilityGroupName> o non è stato unito. Questa operazione non è supportata nella replica primaria del gruppo di disponibilità.

    A causa di questo messaggio di errore, potrebbe essere necessario eseguire il failover del database. Dopo il failover del database, la replica proprietaria del database in sospeso di ripristino si trova nel ruolo secondario. In questo caso, si tenta di eseguire di nuovo lo script SQL seguente per rimuovere il database dal gruppo di disponibilità nella replica secondaria:

    ALTER DATABASE <DatabaseName> SET hadr OFF
    

    Tuttavia, non è comunque possibile rimuovere il database dal gruppo di disponibilità e viene visualizzato il messaggio di errore seguente perché il database è ancora nello stato Ripristino in sospeso:

    Messaggio 921, livello 16, stato 112, riga 1
    Database <DatabaseName> non è stato ancora recuperato. Attendere e riprovare.

Risoluzione quando il database si trova nel ruolo secondario

Per risolvere questo problema, eseguire le azioni generali seguenti:

  • Rimuovere dal gruppo di disponibilità la replica che ospita il database danneggiato quando il database si trova nel ruolo secondario.
  • Risolvere eventuali problemi che interessano il sistema e che potrebbero aver contribuito all'errore del database.
  • Ripristinare la replica nel gruppo di disponibilità.

Per eseguire queste azioni, connettersi alla nuova replica primaria e quindi eseguire lo ALTER AVAILABILITY GROUP script SQL per rimuovere la replica che ospita il database di disponibilità non riuscito. A tale scopo, eseguire la procedura seguente.

Questi passaggi presuppongono che la replica primaria ospiti prima il database danneggiato. Pertanto, un failover deve prima eseguire la transizione della replica che ospita il database danneggiato in un ruolo secondario.

  1. Connettersi al server che esegue SQL Server e che ospita la replica secondaria.

  2. Eseguire lo script SQL seguente:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
    
  3. Eseguire lo script SQL seguente per rimuovere la replica che ospita il database danneggiato dal gruppo di disponibilità:

    ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
    
  4. Risolvere eventuali problemi nel server che esegue SQL Server e che potrebbero contribuire all'errore del database.

  5. Aggiungere di nuovo la replica al gruppo di disponibilità.

Risoluzione quando la replica primaria è l'unica replica nel gruppo di disponibilità

Se la replica primaria ospita il database danneggiato ed è l'unica replica funzionante nel gruppo di disponibilità, è necessario eliminare il gruppo di disponibilità. Dopo l'eliminazione del gruppo di disponibilità, è possibile ripristinare il database da un backup o altre operazioni di ripristino di emergenza per ripristinare i database e riprendere la produzione.

Per eliminare il gruppo di disponibilità, usare lo script SQL seguente:

DROP AVAILABILITY GROUP <AvailabilityGroupName>

A questo punto, è possibile provare a recuperare il database problematico. In alternativa, è possibile ripristinare il database dall'ultima copia di backup valida nota.

Risoluzione quando si rilascia il gruppo di disponibilità

Quando si elimina un gruppo di disponibilità, la risorsa listener viene eliminata e interrompe la connettività dell'applicazione ai database di disponibilità.

Per ridurre al minimo il tempo di inattività dell'applicazione, usare uno dei metodi seguenti per sostenere la connettività dell'applicazione tramite il listener ed eliminare il gruppo di disponibilità:

Metodo 1: Associare il listener a un nuovo gruppo di disponibilità (ruolo) in Gestione cluster di failover

Questo metodo consente di mantenere il listener durante l'eliminazione e la ricreazione del gruppo di disponibilità.

  1. Nell'istanza di SQL Server a cui il listener del gruppo di disponibilità esistente indirizza le connessioni, creare un nuovo gruppo di disponibilità vuoto. Per semplificare questo processo, usare il comando Transact-SQL per creare un gruppo di disponibilità senza replica o database secondario:

    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. Avviare Gestione cluster di failover e quindi selezionare Ruoli nel riquadro sinistro. Nel riquadro in cui sono elencati i ruoli selezionare il gruppo di disponibilità originale.

  3. Nel riquadro centrale inferiore della scheda Risorse fare clic con il pulsante destro del mouse sulla risorsa del gruppo di disponibilità e quindi scegliere Proprietà. Selezionare la scheda Dipendenze , eliminare la dipendenza dal listener e quindi selezionare OK.

    Screenshot della scheda Dipendenze delle proprietà del gruppo di disponibilità.

  4. Nelle risorse fare clic con il pulsante destro del mouse sul listener, selezionare Altre azioni e quindi selezionare Assegna a un altro ruolo.

  5. Nella finestra di dialogo Assegna origine al ruolo selezionare il nuovo gruppo di disponibilità e quindi selezionare OK.

    Screenshot della finestra di dialogo Assegna origine al ruolo che mostra il nuovo gruppo di disponibilità aggiunto.

  6. Nel riquadro Ruoli selezionare il nuovo gruppo di disponibilità. Nel riquadro centrale inferiore, sotto la scheda Risorse , dovrebbe essere visualizzato il nuovo gruppo di disponibilità e la risorsa listener. Fare clic con il pulsante destro del mouse sulla nuova risorsa del gruppo di disponibilità e quindi scegliere Proprietà.

  7. Fare clic sulla scheda Dipendenze , selezionare la risorsa listener nella casella a discesa e quindi selezionare OK.

    Screenshot della scheda Dipendenze delle proprietà del gruppo di disponibilità.

  8. In SQL Server Management Studio usare Esplora oggetti per connettersi all'istanza di SQL Server che ospita la replica primaria del nuovo gruppo di disponibilità. Selezionare Disponibilità elevata Always On, fare clic sul nuovo gruppo di disponibilità e quindi selezionare Listener del gruppo di disponibilità. Dovresti trovare il listener.

  9. Fare clic con il pulsante destro del mouse sul listener, selezionare Proprietà, digitare il numero di porta appropriato per il listener e quindi scegliere OK.

    Screenshot delle proprietà del listener del gruppo di disponibilità, che mostra la configurazione del listener.

In questo modo, le applicazioni che usano il listener possono comunque usarlo per connettersi all'istanza di SQL Server che ospita i database di produzione senza interruzioni. Il gruppo di disponibilità originale può ora essere rimosso completamente e ricreato. In alternativa, è possibile aggiungere database e repliche al nuovo gruppo di disponibilità.

Se si ricrea il gruppo di disponibilità originale, è necessario riassegnare il listener al ruolo del gruppo di disponibilità, configurare la dipendenza tra la nuova risorsa del gruppo di disponibilità e il listener e quindi riassegnare la porta al listener. A tale scopo, effettuare i passaggi seguenti:

  1. Avviare Gestione cluster di failover e quindi selezionare Ruoli nel riquadro sinistro. Nel riquadro in cui sono elencati i ruoli fare clic sul nuovo gruppo di disponibilità che ospita il listener.
  2. Nel riquadro centrale inferiore sotto la scheda Risorse fare clic con il pulsante destro del mouse sul listener, selezionare Altre azioni e quindi selezionare Assegna a un altro ruolo. Nella finestra di dialogo scegliere il gruppo di disponibilità ricreato e quindi selezionare OK.
  3. Nel riquadro Ruoli fare clic sul gruppo di disponibilità ricreato. Nel riquadro centrale inferiore, nella scheda Risorse , dovrebbe essere visualizzato il gruppo di disponibilità ricreato e la risorsa listener. Fare clic con il pulsante destro del mouse sulla risorsa gruppo di disponibilità ricreata e quindi scegliere Proprietà.
  4. Selezionare la scheda Dipendenze , selezionare la risorsa listener nella casella a discesa e quindi selezionare OK.
  5. In SQL Server Management Studio usare Esplora oggetti per connettersi all'istanza di SQL Server che ospita la replica primaria del gruppo di disponibilità ricreato. Selezionare Disponibilità elevata Always On, fare clic sul nuovo gruppo di disponibilità e quindi selezionare Listener del gruppo di disponibilità. Dovresti trovare il listener.
  6. Fare clic con il pulsante destro del mouse sul listener, selezionare Proprietà, digitare il numero di porta appropriato per il listener e quindi scegliere OK.

Metodo 2: associare il listener a un'istanza del cluster di failover di SQL Server esistente (SQLFCI)

Se si ospita il gruppo di disponibilità in un'istanza del cluster di failover di SQL Server (SQLFCI), è possibile associare la risorsa cluster del listener al gruppo di risorse cluster SQLFCI durante l'eliminazione e quindi ricreare il gruppo di disponibilità.

  1. Avviare Gestione cluster di failover e quindi selezionare Ruoli nel riquadro sinistro.

  2. Nel riquadro in cui sono elencati i ruoli selezionare il gruppo di disponibilità originale.

  3. Nel riquadro centrale inferiore della scheda Risorse fare clic con il pulsante destro del mouse sulla risorsa del gruppo di disponibilità e quindi scegliere Proprietà.

  4. Selezionare la scheda Dipendenze , eliminare la dipendenza dal listener e quindi selezionare OK.

  5. Nel riquadro centrale inferiore sotto la scheda Risorse fare clic con il pulsante destro del mouse sul listener, selezionare Altre azioni e quindi selezionare Assegna a un altro ruolo.

  6. Nella finestra di dialogo Assegna risorsa al ruolo fare clic sull'istanza dell'istanza del cluster di failover di SQL Server e quindi selezionare OK.

    Screenshot della finestra di dialogo Assegna risorsa al ruolo.

  7. Nel riquadro Ruoli selezionare il gruppo SQLFCI. Nel riquadro centrale inferiore, sotto la scheda Risorse , dovrebbe essere visualizzata la nuova risorsa listener.

In questo modo, le applicazioni che usano il listener possono comunque usarlo per connettersi all'istanza di SQL Server che ospita i database di produzione senza interruzioni. Il gruppo di disponibilità originale può ora essere rimosso e ricreato. In alternativa, è possibile aggiungere database e repliche al nuovo gruppo di disponibilità.

Dopo aver ricreato il gruppo di disponibilità, riassegnare il listener al ruolo del gruppo di disponibilità. Configurare quindi la dipendenza tra la nuova risorsa del gruppo di disponibilità e il listener e riassegnare la porta al listener:

  1. Avviare Gestione cluster di failover e quindi selezionare Ruoli nel riquadro sinistro.
  2. Nel riquadro in cui sono elencati i ruoli fare clic sul ruolo SQLFCI originale.
  3. Nel riquadro centrale inferiore, nella scheda Risorse fare clic con il pulsante destro del mouse sul listener, selezionare Altre azioni e quindi selezionare Assegna a un altro ruolo.
  4. Nella finestra di dialogo fare clic sul gruppo di disponibilità ricreato e quindi selezionare OK.
  5. Nel riquadro Ruoli selezionare il nuovo gruppo di disponibilità.
  6. Nella scheda Risorse dovrebbe essere visualizzato il nuovo gruppo di disponibilità e la risorsa listener. Fare clic con il pulsante destro del mouse sulla nuova risorsa del gruppo di disponibilità e quindi scegliere Proprietà.
  7. Selezionare la scheda Dipendenze , selezionare la risorsa listener nella casella a discesa e quindi selezionare OK.
  8. In SQL Server Management Studio usare Esplora oggetti per connettersi all'istanza di SQL Server che ospita la replica primaria del nuovo gruppo di disponibilità.
  9. Selezionare Disponibilità elevata Always On, fare clic sul nuovo gruppo di disponibilità e quindi selezionare Listener del gruppo di disponibilità. Dovresti trovare il listener.
  10. Fare clic con il pulsante destro del mouse sul listener, selezionare Proprietà, digitare il numero di porta appropriato per il listener e quindi scegliere OK.

Metodo 3: Eliminare il gruppo di disponibilità e quindi ricreare il gruppo di disponibilità e il listener con lo stesso nome del listener

Questo metodo comporterà una piccola interruzione per le applicazioni attualmente connesse perché il gruppo di disponibilità e il listener vengono eliminati e quindi ricreati:

  1. Eliminare il gruppo di disponibilità.

    Note

    In questo modo verrà anche visualizzato il listener.

  2. Creare immediatamente un nuovo gruppo di disponibilità vuoto che include la definizione del listener nello stesso server che ospita i database di produzione.

    Si supponga, ad esempio, che il listener del gruppo di disponibilità sia aglisten. L'istruzione Transact-SQL seguente crea un gruppo di disponibilità senza database primario o secondario, ma crea anche un listener denominato aglisten. Le applicazioni possono usare questo listener per connettersi.

    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. Ripristinare il database danneggiato. Aggiungerlo quindi e la replica secondaria al gruppo di disponibilità.