Domanda SQL Server: database bloccato nello stato "Ripristino"


Ho eseguito il backup di un database:

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

E poi ho provato a ripristinarlo:

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

E ora il database è bloccato nello stato di ripristino.

Alcune persone hanno teorizzato che è perché non c'era nessun file di registro nel backup, e aveva bisogno di essere inoltrato usando:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Tranne che, ovviamente, fallisce:

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

Ed esattamente quello che vuoi in una situazione catastrofica è un ripristino che non funzionerà.


Il backup contiene sia un file di dati che un file di registro:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF

475
2018-02-06 16:21


origine


risposte:


Devi usare il WITH RECOVERY opzione, con il tuo database RESTORE comando, per portare il tuo database online come parte del processo di ripristino.

Questo è ovviamente solo se non si intende ripristinare i backup del log delle transazioni, cioè si desidera solo ripristinare un backup del database e quindi poter accedere al database.

Il tuo comando dovrebbe assomigliare a questo,

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

È possibile avere più successo utilizzando la procedura guidata di ripristino del database in SQL Server Management Studio. In questo modo è possibile selezionare i percorsi dei file specifici, l'opzione di sovrascrittura e l'opzione di ripristino WITH. A volte, il processo di ripristino è bloccato solo a causa delle dimensioni del file di database. Vedere qui: https://madhivanan.wordpress.com/2016/09/06/issue-in-recovering-a-database-that-is-in-the-restoring-state-reference/ 


383
2018-02-06 16:39



Ho avuto questa situazione ripristinando un database a un'istanza di SQL Server 2005 Standard Edition utilizzando Symantec Backup Exec 11d. Al termine del processo di ripristino, il database è rimasto in uno stato "Ripristino". Non avevo problemi di spazio su disco, il database semplicemente non usciva dallo stato "Ripristino".

Ho eseguito la seguente query sull'istanza di SQL Server e ho scoperto che il database diventava immediatamente utilizzabile:

RESTORE DATABASE <database name> WITH RECOVERY

564
2017-07-28 15:21



Ecco come lo fai:

  1. Arresta il servizio (MSSQLSERVER);
  2. Rinominare o eliminare i file di database e di registro (C: \ Programmi \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...) o ovunque siano presenti i file;
  3. Avvia il servizio (MSSQLSERVER);
  4. Elimina il database con problemi;
  5. Ripristinare nuovamente il database.

In bocca al lupo!


89
2018-05-07 21:50



Ho avuto un incidente simile con l'arresto di un server secondario di log shipping. Dopo il comando per rimuovere il server dalla distribuzione dei log e interrotto la distribuzione dei log dal server primario, il database sul server secondario è rimasto bloccato nel ripristino dello stato dopo il comando

RESTORE DATABASE <database name> WITH RECOVERY

I messaggi del database:

RESTORE DATABASE ha elaborato correttamente 0 pagine in 18.530 secondi   (0.000 MB / sec).

Il database era nuovamente utilizzabile dopo quei 18 secondi.


77
2018-01-11 13:51



Ho avuto un problema simile con il ripristino utilizzando SQL Management Studio. Ho provato a ripristinare un backup del database con uno nuovo con un nome diverso. All'inizio questo ha fallito e, dopo aver corretto i nomi dei nuovi file del database, è stato eseguito con successo - in ogni caso il problema che sto descrivendo si ripresenta anche se ho capito bene dalla prima volta. Quindi, dopo il ripristino, il database originale è rimasto con un (Ripristino ...) accanto al suo nome. Considerando le risposte del forum sopra (Bhusan's) ho provato a eseguire l'editor di query sul lato seguente:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

che ha risolto il problema. Inizialmente avevo problemi a causa del nome del database che conteneva caratteri speciali. Ho risolto questo problema aggiungendo virgolette doppie: le virgolette singole non funzionavano dando un errore "Sintassi errata vicino a ...".

Questa è stata la soluzione minima che ho provato a risolvere questo problema (database bloccato nel ripristino stato) e spero che possa essere applicato a più casi.


55
2017-09-05 11:25



OK, ho un problema simile ed esattamente come nel caso di Pauk, è stato causato dal fatto che il server ha esaurito lo spazio su disco durante il ripristino e quindi ha causato uno stato di ripristino permanente. Come terminare questo stato senza arrestare i servizi di SQL Server?

Ho trovato una soluzione :)

Drop database *dbname*

28
2018-06-26 10:11



L'opzione WITH RECOVERY viene utilizzata di default quando vengono eseguiti i comandi RESTORE DATABASE / RESTORE LOG. Se sei bloccato nel processo di "ripristino" puoi riportare un database allo stato online eseguendo:

RESTORE DATABASE YourDB WITH RECOVERY
GO

Se è necessario ripristinare più file, i comandi CLI richiedono rispettivamente CON NORECOVERY e RECOVERY - solo l'ultimo file in comando deve avere WITH RECOVERY per riportare il database online:

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

È anche possibile utilizzare la procedura guidata di SQL Server Management Studio:

enter image description here

C'è anche un processo di ripristino virtuale, ma dovrai usare soluzioni di terze parti. Di solito è possibile utilizzare un backup del database come database online live. ApexSQL e Idera hanno le proprie soluzioni. Recensione di SQL Hammer su ApexSQL Restore. Il ripristino virtuale è una buona soluzione se hai a che fare con un numero elevato di backup. Il processo di ripristino è molto più veloce e può anche risparmiare molto spazio sull'unità disco. Puoi dare un'occhiata Infografica qui per un confronto.


26
2018-01-17 17:24



Questo potrebbe essere abbastanza ovvio, ma mi ha fatto inciampare proprio ora:

Se si sta eseguendo un backup del log di coda, questo problema può essere causato anche dall'avere selezionato questa opzione nella procedura guidata di ripristino SSMS: "Lasciare il database di origine nello stato di ripristino (WITH NORECOVERY)"

enter image description here


22
2017-07-16 15:20