Cosa fare quando con un database in modalità Suspect? In questo post illustreremo una soluzione ripristinare il database MS SQL contrassegnato come sospetto.
Per risolvere il problema del database sospetto di SQL Server utilizzeremo in comandi Transact-SQL (T-SQL) in SQL Server Management Studio (SSMS) che ho avuto modo di testare ed utilizzare in un installazione SQL Server.
Occorre tenere in considerazione che quando si ha che fare con un database in modalità suspect hai poche possibilità di risoluzione in quanto il db è quasi sicuramente corrotto.
Con i comandi che vedremo avrai comunque la possibilità di sbloccare il database e recuperare i dati dalle tabelle che non sono corrotte.
Sommario
Le cause del problema
Cerchiamo di capire prima di tutto quali sono le cause del problema. Un database sospetto è un database ritenuto compromesso da SQL Server che, per ragioni di sicurezza, imposta il flag “sospetto” ed impedisce l’accesso ai dati. Le possibili cause sono:
- I file fisici sul file system risultano corrotti, i motivi potrebbero essere di natura software (virus) o hardware (hard disk danneggiato).
- Spazio libero su disco insufficiente.
- Memoria RAM insufficiente.
- I file fisici sul file system risultano aperti da un altro software quindi con accesso negato.
- Uno spegnimento inaspettato del computer o l’arresto inaspettato dei servizi di SQL Server.
- Il sistema non riesce ad aprire il dispositivo in cui risiedono i dati o il file di registro del server SQL.
- Il server SQL si arresta in modo anomalo o si riavvia nel mezzo di una transazione, risultando in un file di registro delle transazioni corrotto o inaccessibile.
- SQL Server tenta di aprire un database e il file appartenente a quel database è già aperto dal software antivirus installato sul sistema.
- SQL non può completare un’operazione di rollback o rollforward.
- I file di database sono conservati dal sistema operativo, dal software di backup di terze parti, ecc.
Nel mio caso specifico il problema è stato causato da un riavvio anomalo del server.
Database in modalità Suspect: come risolvere
NOTA: è possibile provare a ripristinare il database in modalità sospetta da un backup noto. Se il backup non è disponibile, procedere con i passaggi seguenti.
Per risolvere il problema è necessario affidarci a SQL Server Management Studio, che ci fornisce l’unica via d’accesso per i database suspect. Una volta effettuato il login iniziamo a scrivere le prime query di diagnostica (al posto di DBNAME utilizzeremo il nome del nostro database suspect):
- Il primo tentativo (quasi sempre inutile) è quello di togliere il flag di sospetto al database.
exec sp_resetstatus DBNAME
- Il passo successivo è impostare il database in emergenza. In questa modalità i dati del database torneranno ad essere accessibili (se non corrotti).
alter database DBNAME set emergency
Tramite il comando DBCC è possibile effettuare un check degli oggetti del database. Lanciare i comandi sotto indicati uno alla volta in modo da analizzare sempre l’output restituito.
dbcc checkdb('DBNAME')
alter database DBNAME set SINGLE_USER with ROLLBACK IMMEDIATE
dbcc checkdb('DBNAME',REPAIR_ALLOW_DATA_LOSS)
alter database DBNAME set MULTI_USER
Consiglio, dopo aver eseguito il comando dbcc checkdb(‘DBNAME’,REPAIR_ALLOW_DATA_LOSS) di rilanciare di nuovo il comando dbcc checkdb(‘DBNAME’) potrebbe essere necessario lanciare anche il comando Repair Rebuild.
- Dopo aver sbloccato il db eseguire un aggiornamento dell’istanza Sql Server per verificare che il db è tornato nello stato online.
Altre operazioni sul database
Aver sbloccato il database in modalità suspect non indica che il db non sia corrotto quindi adoperati a eseguire controlli approfonditi in modo da circoscrivere le tabelle corrotte.
A questo punto se sono state scoperte le cause possiamo procedere con l’operazione di ripristino:
- Creiamo un database d’appoggio
- Nel menu contestuale del database selezioniamo la voce Task quindi Export Data.
- Copiamo tutti i dati nel database d’appoggio
- Durante questa procedura alcune tabelle saranno impossibili da copiare
- Ripetere il passaggio di Export Data escludendo le tabelle inaccessibili quindi procedere finchè l’export non viene fatto con successo.
- Rinominare il database originale con un nuovo nome (ad esempio DBNAME_OLD)
- Rinominare il database d’appoggio con il nome originale
- Copiare eventuali utenti o elementi che non sono stati importati dall’operazione di Export Data.
Adesso siamo nella condizione di avere un database funzionante che però non possiede le tabelle danneggiate. Possiamo quindi procedere con due possibili soluzioni:
- PERDITA DEI DATI
- Nel caso in cui i dati contenuti nelle tabelle non siano vitali è sufficiente ricreare la tabella ed eventualmente popolarla a mano (ad esempio: tabelle di configurazione).
- RIPRISTINO DEI DATI
- Nel caso in cui i dati contenuti nelle tabelle siano vitali è necessario creare un altro database d’appoggio quindi effettuare il restore dell’ultimo backup effettuato quindi copiare il contenuto delle tabelle ripristinate nelle tabelle del nostro nuovo database. In questo caso avremo uno storico dei dati ripristinato senza i dati persi dal problema.
Conclusione
Abbiamo visto come sbloccare un database in modalità suspect. Se riscontri problemi scrivimi nei commenti