In questo post vedremo come gestire un database in Recovery Pending.
Devi sapere che la modalità “Recovery Pending” o “Ripristino in sospeso” indica che il database non può avviare il processo di ripristino in caso di arresto anomalo del sistema.
Sommario
Cosa significa database in Recovery Pending?
La modalità “Recovery Pending” è stata aggiunta in SQL Server 2008, quindi prima era presente solo la modalità “Suspect”. In generale, quando un database è in modalità “sospetto” in SQL Server 2005 o versione precedente, significava che il database non poteva essere portato in linea e, pertanto, non era disponibile per le connessioni utente.
A partire da SQL Server 2008, abbiamo due modalità: “Sospetto” e “Ripristino in sospeso”. La modalità “Ripristino in sospeso” indica che il database non può avviare il processo di ripristino in caso di arresto anomalo del sistema. Ciò è dovuto al fatto che SQL Server non è in grado di accedere alla pagina di avvio nel file di dati primario (MDF) per determinare se è necessario un ripristino in caso di arresto anomalo del sistema ma non è stato possibile avviare il processo di ripristino (ad esempio, perché il file di registro delle transazioni è mancante o danneggiato).
La modalità “Sospetto” indica che il database ha avviato il processo di ripristino, ma non è stato completato. Ad esempio, ciò può verificarsi se il file di registro delle transazioni diventa inaccessibile durante un’operazione di rollback della transazione.
Sebbene sia importante capire la differenza tra le due modalità, di solito, i passaggi per risolvere il problema sono gli stessi. Per semplificare, elencherò qui le azioni da intraprendere in caso di database in Recovery Pending?
Cosa significa database in Recovery Pending?
Un database di Microsoft SQL Server si trova sempre in uno stato specifico dal sistema.
L’identificazione dello stato del database e del modo in cui un database può essere spostato tra questi diversi stati consente di risolvere i problemi del database.
Questi stati includono ONLINE, OFFLINE, RESTORING, RECOVERING, SUSPECT, EMERGENCY e Recovery Pending.
È possibile controllare rapidamente lo stato corrente di un database SQL che esegue la query riportata di seguito. Lo stato corrente di un database può essere verificato tramite state_desc.
SELECT name, state_desc from sys.databases
Cause dello stato di un database in Recovery Pending
Esistono molte ragioni per lo stato di un database in Recovery Pending. Puoi vederne alcuni qui sotto:
- SQL Server si è arrestato a causa di un errore hardware, di un’interruzione dell’alimentazione o di altri motivi. Quando un database non viene chiuso correttamente, una o più transazioni non soddisfatte erano attive durante l’arresto e il file di registro delle transazioni è stato eliminato.
- Spazio di archiviazione su disco o memoria insufficiente. In questi casi, il ripristino del database non può essere avviato.
- Danneggiamento dei file di registro. La migrazione dei file di registro su una nuova unità può talvolta causare il danneggiamento dei file di registro.
- Danneggiamento file MDF. Il file di database MDF viene danneggiato a causa di molti motivi come problemi del sottosistema del disco, problemi della piattaforma, guasto hardware, attacco di virus e così via.
Come risolvere ?
Innanzitutto, assicurarsi di disporre di backup adeguati del database in questione prima di avviare qualsiasi processo di ripristino.
Il punto migliore per avviare l’indagine è il log degli errori di SQL Server.
Metodo 1 – Imposta lo stato del database su ONLINE
Nei casi in cui il ripristino del database non può essere avviato a causa di spazio di archiviazione su disco insufficiente:
- Innanzitutto, aumenta lo spazio su disco.
- Impostare il database in modalità “Online”;
- Eseguire CheckDB (senza l’opzione Ripristina).
È inoltre possibile eseguire lo script seguente (sostituire la stringa DATABASENAME con il nome del database):
ALTER DATABASE ‘DATABASENAME’ SET ONLINE;
DBCC CHECKDB(‘DATABASENAME’) WITH NO_INFOMSGS;
Se il comando è stato completato senza preavviso, non è necessario ripristinare il database.
Metodo 2 – Ricostruzione dei file di registro (modalità di emergenza)
Nel caso in cui il log degli errori mostri che il database non è stato ripristinato correttamente a causa di un file di registro mancante del database che potrebbe essere eliminato, rinominato o danneggiato:
- Innanzitutto, metti il database in modalità di emergenza.
- Scollegare il database (metti in modalità OFFLINE);
- Allegalo di nuovo (portalo online).
Lo script seguente esegue tutti i passaggi precedenti (sostituire la stringa DATABASENAME con il nome del database):
ALTER DATABASE [DATABASENAME] SET EMERGENCY;
ALTER DATABASE [DATABASENAME] set multi_user;
EXEC sp_detach_db '[DATABASENAME]';
EXEC sp_attach_single_file_db @DBName = '[DATABASENAME]', @physname = N'MDF_FILE_FULL_PATCH';
Il sistema rimuoverà automaticamente i registri danneggiati e ne costruirà uno nuovo.
Metodo 3 – Avviare DBCC CheckDB con opzioni di riparazione
In alcuni casi è possibile risolvere errori di database utilizzando le opzioni Repair, ma solo come ultima risorsa.
Microsoft consiglia sempre un ripristino utente dall’ultimo backup valido noto come metodo principale per il ripristino da errori segnalati da DBCC CHECKDB.
DBCC CHECKDB con una qualsiasi delle opzioni REPAIR è completamente registrato e recuperabile. Quindi, seguire le best practice e utilizzare CHECKDB con qualsiasi opzione REPAIR all’interno di una transazione (eseguire BEGIN TRANSACTION prima di eseguire il comando). Pertanto, sarai in grado di ripristinare le operazioni di riparazione, se necessario.
Puoi seguire la guida su come utilizzare il DBCC CHECKDB al seguente link:
DBCC CHECKDB in SQL Server 2019. – Bartolomeo Alberico
Conclusione
Abbiamo visto insieme dei metodi su come risolvere lo stato di un database in Recovery Pending.
Da considerare anche che, a volte non è possibile risolvere l’errore Recovery Pending ed occorre necessariamente eseguire il restore del database.