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 

È necessario utilizzare l’opzione WITH RECOVERY , con il comando RESTORE database, per portare il database online come parte del processo di ripristino.

Questo è ovviamente solo se non si intende ripristinare alcun backup del log delle transazioni, ovvero 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 

È ansible avere più successo utilizzando la procedura guidata di ripristino del database in SQL Server Management Studio. In questo modo è ansible 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/

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  WITH RECOVERY 

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!

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  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.

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.

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* 

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 ansible utilizzare la procedura guidata di SQL Server Management Studio:

inserisci la descrizione dell'immagine qui

C’è anche un processo di ripristino virtuale, ma dovrai usare soluzioni di terze parti. Di solito è ansible 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 a infografica qui per un confronto.

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)”

inserisci la descrizione dell'immagine qui

Ho capito perché.

Se il client che ha emesso il comando RESTORE DATABASE disconnette durante il ripristino, il ripristino verrà bloccato.

È strano che il server, quando viene detto di ripristinare un database tramite una connessione client, non finisca il ripristino a meno che il client non rimanga connesso per tutto il tempo.

questo ha funzionato:

http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

Avevo una situazione in cui il mio database mostrava lo stato di ripristino e non potevo eseguire alcuna query e non potevo connettermi con il nostro software.

Quello che ho fatto per uscire da questa situazione è:

  1. Arresta tutti i servizi relativi a SQL dai servizi di Windows.

  2. Ho aperto la cartella DATA in cui i file Ldf e Mdf risiedono nella directory SQL, normalmente è simile a “C: \ Programmi *********** \ MSSQL \ DATA

  3. Poi ho copiato entrambi i file Ldf e Mdf del database: [nome db] .mdf e [nome db] _log.ldf

Ho copiato entrambi questi file in un’altra cartella.

  1. Quindi ho avviato nuovamente tutti i servizi relativi a SQL (nel passaggio 1) dai servizi di Windows.

  2. Avviato il mio studio MS SQL Management con accesso normale.

  3. Fare clic con il tasto destro del mouse sul database colpevole e premere DELETE (per cancellare il database).

  4. Tutti i file LDF e MDF relativi a questo database sono passati dalla cartella DATA (menzionata nel passaggio 2).

  5. Creato un nuovo database con lo stesso nome (stesso nome di quello che ho cancellato al punto 6 – il database colpevole).

  6. Quindi [nome database] -> tasto destro -> attività -> Porta offline.

  7. Ho quindi copiato entrambi i file (dal passaggio 3) nella cartella DATA (passaggio 2).

  8. [nome database] -> tasto destro del mouse -> attività -> Porta in linea.

Avevo un . nel mio nome di database, e la query non ha funzionato a causa di quello (dicendo syntax errata vicino a ‘.’) Poi ho capito che ho bisogno di una parentesi per il nome:

 RESTORE DATABASE [My.DB.Name] WITH RECOVERY 

Ho avuto questo problema quando ho ricevuto anche un errore TCP nel registro eventi …

Rilascia il DB con sql o fai clic con il tasto destro del mouse su manager “delete” e ripristina di nuovo.

In realtà ho iniziato a farlo di default. Script il DB drop, ricrea e poi ripristina.

Può anche esserci un problema nella cancellazione di un database bloccato se lo snapshot è abilitato. Per me questo ha funzionato:

  1. Per prima cosa ho seguito i passi di Tipu Delacablu (leggi alcuni post in alto)
  2. Esegui comando: rilascia il database [il tuo database], che ti darà un errore che ti dice il nome del database dello snapshot
  3. eseguire il comando: rilascia database [database snapshot], quindi eseguire nuovamente il comando nel passaggio 2.

Per impostazione predefinita, ogni RESTORE DATABASE viene fornito con l’impostazione RECOVERY . Le opzioni “NORECOVERY”, in pratica, indicano a SQL Server che il database è in attesa di altri file di ripristino (potrebbe essere un file DIFF e un file LOG e, se ansible, includere il file di backup del log di coda). Le opzioni ‘RECUPERO’, completano tutte le transazioni e lasciano il database pronto per eseguire le transazioni.

Così:

  1. se il database è impostato con il modello di recupero SIMPLE , è ansible eseguire un ripristino COMPLETO con NORECOVERY opzione NORECOVERY , quando si dispone di un backup DIFF . Nessun backup LOG è consentito nel database del modello di recupero SIMPLE .
  2. Altrimenti, se il database è impostato con il modello di recupero FULL o BULK-LOGGED , è ansible eseguire un ripristino FULL seguito dall’opzione NORECOVERY , quindi eseguire un DIFF seguito da NORECOVERY e, infine, eseguire il ripristino LOG con l’opzione RECOVERY .

Ricorda, L’ULTIMA QUEST RESTORE DEVE AVERE OPZIONE DI RECOVERY . Potrebbe essere un modo esplicito o no. In therms di T-SQL, la situazione:

  1. USE [master] GO RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, RECOVERY -- This option could be omitted. GO

L’opzione WITH REPLACE deve essere utilizzata con caucanvas poiché può causare la perdita di dati

Oppure, se si esegue un backup FULL e DIFF, è ansible utilizzare questo

 USE [master] GO RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, NOUNLOAD,NORECOVERY GO RESTORE DATABASE Database_name FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, NOUNLOAD, RECOVERY GO 
  1. USE [master] GO -- Perform a Tail-Log backup, if possible. BACKUP LOG Database_name GO -- Restoring a FULL backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, NOUNLOAD,NORECOVERY GO -- Restore the last DIFF backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1, NORECOVERY,NOUNLOAD GO -- Restore a Log backup RESTORE LOG Database_name FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2, RECOVERY, NOUNLOAD GO

Naturalmente, è ansible eseguire un ripristino con l’opzione STATS = 10 che indica a SQL Server di segnalare ogni 10% completato.

Se preferisci, puoi osservare il processo o ripristinare in base alla query in tempo reale. Come segue:

 USE[master] GO SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE') GO 

Spero che questo aiuto.

Nel mio caso, è stato sufficiente eliminare il database che era sospeso nello stato “Ripristino …” con il comando SQL

  drop database  

in una finestra di query.

Quindi ho fatto clic con il pulsante destro del mouse su Database e selezionato Aggiorna, che ha rimosso la voce in Management Studio. Successivamente ho eseguito un nuovo ripristino che ha funzionato correttamente (si noti che l’implementazione offline non ha funzionato, un riavvio del servizio SQL non ha funzionato, un riavvio del server non ha funzionato altrettanto bene).

Hai provato a eseguire SOLO VERIFICA? Solo per assicurarsi che sia un backup sonoro.

http://msdn.microsoft.com/en-us/library/ms188902.aspx

  1. Verifica innanzitutto ed esegui il servizio SQL Agent.
  2. Utilizzando il seguente T-SQL:

    SELECT filename FROM master.sys.sysaltfiles WHERE dbid = DB_ID (‘db_name’);

  3. Usando continuamente T-SQL:

    RESTORE DATABASE FROM DISK = ‘DB_path’ CON RESTART, REPLACE;

Spero che questo aiuto!

Tutte le opzioni basate su RECOVERY non hanno funzionato per me.

Cosa è stato fatto per eseguire il ripristino completo da Management Studio.

 USE [master] RESTORE DATABASE Sales_SSD FROM DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' WITH FILE = 1, MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf', MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf', NOUNLOAD, REPLACE, STATS = 5 

Ho avuto lo stesso problema … anche se non so perché il mio database abbia riscontrato questo problema perché il mio disco non era pieno … È come se fosse danneggiato o qualcosa del genere. Ho provato tutto quanto sopra nessuno di loro ha funzionato, ho pensato soprattutto che il suggerimento di interrompere il servizio e cancellare i file mdf e ldf avrebbe funzionato … ma si è bloccato al momento del ripristino?

Ho finito per risolvere questo eliminando i file come accennato ma invece di provare a ripristinare il DB di nuovo ho copiato su nuovi file .mdf e .ldf e li ho collegati usando la procedura guidata di Front End Attachment. Sollievo, ha funzionato !!

Impiegava SEMPRE per copiare i nuovi file mentre sto usando una macchina virtuale … quindi copiare e incollare usando gli appunti richiedeva un’ora di per sé, quindi lo raccomanderei solo come ultimo tentativo.

Ho ottenuto il caso MyDbName (Ripristino …) a causa del limite di licenza di SQL Express.

Nel file di registro, ho trovato questo:

CREATE DATABASE o ALTER DATABASE non sono riusciti in quanto la dimensione del database cumulativo risultante supererebbe il limite concesso in licenza di 10240 MB per database.

Quindi, se stai cercando di ripristinare un database più grande, devi ad esempio cambiare il tuo server SQL Express in Developer Edition .