SQL Server: La base de données est bloquée dans L'état de" restauration"

j'ai sauvegardé une base de données:

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

et ensuite essayé de le restaurer:

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

et maintenant la base de données est bloquée dans l'état de restauration.

certaines personnes ont théorisé que c'est parce qu'il n'y avait pas de fichier journal dans la sauvegarde, et il avait besoin d'être reporté en avant en utilisant:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

sauf que, bien sûr, ne répond pas:

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.

Et exactement ce que vous voulez dans une situation catastrophique est une restauration qui ne fonctionne pas.


La sauvegarde contient à la fois des données et des fichiers journaux:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATAMyDatabase.mdf
MyDatabase_log  C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATAMyDatabase_log.LDF
485
demandé sur Ed Schwehm 2009-02-06 19:21:45

20 réponses

vous devez utiliser l'option WITH RECOVERY , avec votre commande de base de données RESTORE , pour mettre votre base de données en ligne dans le cadre du processus de restauration.

ceci est bien sûr seulement si vous n'avez pas l'intention de restaurer des sauvegardes de journal de transaction, c'est-à-dire que vous souhaitez seulement restaurer une sauvegarde de base de données et être ensuite en mesure d'accéder à la base de données.

Votre commande devrait ressembler à ceci,

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

vous pouvez avoir plus de succès en utilisant l'assistant de restauration de base de données dans SQL Server Management Studio. De cette façon, vous pouvez sélectionner les emplacements de fichiers spécifiques, l'option overwrite, et l'option WITH Recovery. Parfois, le processus de restauration est resté bloqué juste à cause de la taille du fichier de la base de données. voir ici: https://madhivanan.wordpress.com/2016/09/06/issue-in-recovering-a-database-that-is-in-the-restoring-state-reference /

393
répondu John Sansom 2016-09-06 07:31:05

j'ai eu cette situation restaurer une base de données à une instance SQL Server Édition Standard 2005 en utilisant Symantec Backup Exec 11d. Une fois la tâche de restauration terminée, la base de données est demeurée dans un état de "restauration". Je n'avais aucun problème d'espace disque-- La base de données ne sortait tout simplement pas de l'état de "restauration".

j'ai lancé la requête suivante contre L'instance SQL Server et j'ai trouvé que la base de données est immédiatement devenue utilisable:

RESTORE DATABASE <database name> WITH RECOVERY
575
répondu Evan Anderson 2009-07-28 15:21:16

Voici comment vous le faites:

  1. Stop the service (MSSQLSERVER);
  2. renommer ou supprimer la base de données et les fichiers journaux (C:\Program fichiers\Microsoft SQL Server\MSSQL.1\MSSQL\Data...) ou où que vous ayez les fichiers;
  3. Start the service (MSSQLSERVER);
  4. supprimer la base de données avec problème;
  5. restaurer à nouveau la base de données.

bonne chance!

90
répondu Tipu Delacablu 2009-05-07 21:50:36

j'ai eu un incident similaire avec l'arrêt d'un serveur secondaire d'expédition de log. Après la commande pour supprimer le serveur de l'expédition de journal et a arrêté l'expédition de journal du serveur principal la base de données sur le serveur secondaire a été bloqué dans la restauration de l'état après la commande

RESTORE DATABASE <database name> WITH RECOVERY

the database articles:

restaurer la base de données traitée avec succès 0 pages en 18.530 secondes (0.000 MO/sec).

la base de données était de nouveau utilisable après ces 18 secondes.

78
répondu Hans 2014-05-19 19:11:44

j'ai eu un problème similaire avec la restauration en utilisant SQL Management Studio. J'ai essayé de restaurer une sauvegarde de la base de données à une autre avec un nom différent. Au début, cela a échoué et après avoir corrigé les noms de fichiers de la nouvelle base de données il a été effectué avec succès - dans tous les cas, le problème que je décris réapparaît même si j'ai eu ce droit dès la première fois. Ainsi, après la restauration, La base de données originale est restée avec un (Restoring...) en regard de son nom. Considérant les réponses du forum ci-dessus (Bhusan's) j'ai essayé d'exécuter dans l'éditeur de requête sur le côté le suivant:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

qui a fixé l'émission. J'avais des problèmes au début à cause du nom de la base de données qui contenait des caractères spéciaux. J'ai résolu cela en ajoutant des guillemets autour - des guillemets simples ne fonctionneraient pas en donnant une syntaxe "près incorrecte ..." erreur.

C'était la solution minimale que j'ai essayé de résoudre ce problème (base de données coincé dans la restauration de l'état) et je l'espère peut être appliqué à plus de cas.

56
répondu Demetris Leptos 2016-11-17 12:34:46

OK, j'ai un problème similaire et exactement comme il était dans le cas de Pauk, il a été causé par le serveur courant hors de l'espace disque pendant la restauration et a donc causé un État de restauration permanente. Comment mettre fin à cet état sans arrêter les services du serveur SQL?

j'ai trouvé une solution:)

Drop database *dbname*
30
répondu ErikE 2012-07-30 19:11:06

avec option de récupération est utilisé par défaut lorsque les commandes restaurer la base de données/restaurer le journal est exécuté. Si vous êtes bloqué dans le processus de "restauration" vous pouvez ramener une base de données à l'état en ligne en exécutant:

RESTORE DATABASE YourDB WITH RECOVERY
GO

S'il y a un besoin de restaurer plusieurs fichiers, les commandes CLI nécessitent respectivement avec NORECOVERY et avec RECOVERY - seul le dernier fichier en commande devrait avoir avec RECOVERY pour ramener la base de données en ligne:

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

vous pouvez utiliser SQL Server Management Studio wizard aussi:

enter image description here

il y a aussi le processus de restauration virtuel, mais vous devrez utiliser des solutions tierces. Habituellement, vous pouvez utiliser une sauvegarde de base de données en direct de la base de données en ligne. ApexSQL et Idera ont leurs propres solutions. Révision par le marteau SQL à propos de la restauration ApexSQL . La restauration virtuelle est une bonne solution si vous avez affaire à un grand nombre de sauvegardes. Processus de restauration est beaucoup plus rapide et peut également sauver beaucoup d'espace sur le lecteur de disque. Vous pouvez jeter un oeil sur infographique ici pour une comparaison.

26
répondu Marko Krstic 2014-01-17 17:24:33

c'est peut-être assez évident, mais ça m'a fait trébucher tout à l'heure:

si vous prenez une sauvegarde tail-log, ce problème peut aussi être causé par le fait que cette option est cochée dans L'assistant de restauration SSMS - "quitter la base de données source dans l'état de restauration (avec NORECOVERY) "

enter image description here

23
répondu TrailJon 2014-07-16 15:20:11

j'ai compris pourquoi.

si le client qui a émis la commande RESTORE DATABASE se déconnecte pendant la restauration, la restauration sera bloquée.

il est étrange que le serveur, lorsqu'on lui demande de restaurer une base de données par une connexion client, ne termine pas la restauration à moins que le client reste connecté tout le temps.

14
répondu Ian Boyd 2013-11-15 15:34:18

celui-ci a fonctionné:

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

j'ai eu une situation où ma base de données montrait un État de restauration et je ne pouvais pas exécuter de requêtes et ne pouvais pas me connecter avec notre logiciel.

ce que j'ai fait pour sortir de cette situation est:

  1. Arrêter tous les SQL liées services de windows services.

  2. j'ai ouvert le dossier de données où les fichiers Ldf et Mdf se trouvent dans le répertoire SQL, normalement son équivalent : "C:\Program dossiers***********\MSSQL\DATA

  3. puis j'ai copié les fichiers Ldf et Mdf de la base de données: [nom du db].mdf et [db]nom de _log.ldf

j'ai copié ces deux fichiers dans un autre dossier.

  1. puis j'ai redémarré tous les services liés à SQL (à l'étape 1) à partir des Services windows.

  2. a démarré mon studio de gestion MS SQL avec login normal.

  3. faites un clic droit sur la base de données culprit et cliquez sur Supprimer (pour supprimer la base de données).

  4. tous les fichiers LDF et MDF liés à cette base de données ont partie du dossier de données (mentionné à l'étape 2).

  5. a créé une nouvelle base de données avec le même nom (même nom que celui que j'ai supprimé à l'étape 6 - La base de données coupable).

  6. Puis [nom de base de données]->clic droit -> tâches -> déconnecter.

  7. J'ai ensuite copié les deux fichiers (à partir de l'étape 3) dans le dossier de données (Étape 2).

  8. [nom de la base de données]->clic droit -> tâches -> mettre en ligne.

9
répondu Ameen Abuhilal 2013-12-18 01:00:27

j'ai eu un . dans mon nom de base de données, et la requête n'a pas fonctionné à cause de cela (en disant la syntaxe incorrecte near '.') Puis j'ai réalisé que j'avais besoin d'un bracket pour le nom:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY
4
répondu Ashkan Sirous 2016-07-28 13:17:40

j'ai eu ce problème quand j'ai aussi reçu une erreur TCP dans le journal des événements...

laisser tomber la base de données avec sql ou clic droit sur elle dans le gestionnaire" supprimer" Et de nouveau la restauration.

j'ai commencé à le faire par défaut. Script de la chute de la base de données, recréer puis restaurer.

3
répondu ZeusT 2010-03-13 18:40:44

par défaut, chaque RESTORE DATABASE est fourni avec RECOVERY configuré. Les options 'NORECOVERY', essentiellement dit au serveur SQL que la base de données est en attente de restaurer plus de fichiers (pourrait être un DIFF fichier et LOG fichier et, pourrait inclure tail-log fichier de sauvegarde, si possible). Les options de 'récupération', terminer toutes les transactions et laisser la base de données prête à effectuer des transactions.

:

  1. si votre base de données est configurée avec simple modèle de récupération, vous ne pouvez effectuer un complet restauration avec NORECOVERY option, lorsque vous avez un DIFF sauvegarde. Pas de JOURNAL de sauvegarde sont autorisés dans SIMPLE modèle de récupération de base de données.
  2. Sinon, si votre base de données est configurée avec FULL ou en vrac-loggé modèle de récupération, vous pouvez effectuer un complet restaurer suivi de NORECOVERY option , puis effectuer un DIFF suivi de NORECOVERY , et, enfin, effectuer LOG restaurer avec RECOVERY option.

Remember, The LAST RESTORE QUERY MUST HAVE RECOVERY OPTION . Il pourrait être d'une manière explicite ou non. En termes de T-SQL, la situation:

  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

avec L'option Remplacer doit être utilisé avec prudence car il peut conduire à la perte de données

ou, si vous effectuez une sauvegarde complète et DIFF, vous pouvez utiliser ce

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

bien sûr, vous pouvez effectuer une restauration avec l'option STATS = 10 cela indique au serveur SQL de faire un rapport tous les 10% terminés.

si vous préférez, vous pouvez observer le processus ou restaurer dans la requête basée en temps réel. Comme suit:

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

Espérons que cette aide.

3
répondu BMDaemon 2017-04-11 19:48:25

il peut également y avoir un problème de suppression d'une base de données bloquée si snapshot est activé. Pour moi cela a fonctionné:

  1. j'ai d'Abord suivi Tipu Delacablu étapes (lu quelques posts)
  2. run command: drop database [your database], qui vous donnera une erreur vous indiquant le nom de la base de données snapshot
  3. exécute la commande: drop database [snapshot database], puis exécute à nouveau la commande à l'étape 2.
2
répondu Community 2017-05-23 11:55:10

dans mon cas, il suffisait de supprimer la base de données qui était suspendue dans l'état " restaurer..." avec la commande SQL

 drop database <dbname> 

dans une fenêtre de requête.

puis j'ai cliqué à droite sur bases de données et sélectionné rafraîchir qui a supprimé l'entrée dans Studio de gestion. Après j'ai fait une nouvelle restauration qui a bien fonctionné (notez que l'apporter offline n'a pas fonctionné, un redémarrage du service SQL n'a pas fonctionné, un redémarrage du serveur n'a pas fonctionné aussi bien).

2
répondu Matt 2018-07-18 15:36:12

avez-vous essayé D'exécuter un VERIFY seulement? Juste pour être sûr que c'est une sauvegarde sonore.

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

1
répondu Sam 2009-02-06 20:25:17
  1. vérifiez et exécutez le service D'Agent SQL en premier.
  2. utilisant le T-SQL suivant:

    sélectionner le nom du fichier À PARTIR du maître.sys.sysaltfiles Où dbid = DB_ID ('db_name');

  3. utilisant le T-SQL en continu:

    restaurer la base de données à partir du disque = 'DB_path' AVEC REDÉMARRER, REMPLACER;

Espérons que cette aide!

0
répondu Trung Nguyen 2013-05-14 08:04:32

toutes les options basées sur le rétablissement ne fonctionnaient pas pour moi.

ce qui a fait était de faire la restauration complète de Studio de gestion.

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
0
répondu earthling42 2015-03-26 09:31:01

j'ai eu le même problème... bien que je ne sais pas pourquoi ma base de données a éprouvé ce problème que mon lecteur n'était pas plein... Elle est comme elle est corrompue ou quelque chose. J'ai essayé tout ce qui précède aucun d'entre eux n'a pleinement fonctionné, j'ai surtout pensé que la suggestion d'arrêter le service et la suppression des fichiers mdf et ldf fonctionnerait... mais il a encore gelé sur la restauration?

j'ai fini par résoudre ce problème en supprimant les fichiers mentionnés mais au lieu d'essayer de restaurer la base de données à nouveau je copié sur frais .mdf et .les fichiers ldf et attachés en utilisant L'assistant de fixation frontal. De secours, il a travaillé!!

il a fallu une éternité pour copier sur les nouveaux fichiers que j'utilise une Machine virtuelle... donc copier et Coller en utilisant le presse-papiers a pris environ une heure elle-même donc je ne recommanderais cela qu'en dernier essai.

0
répondu Anthony Griggs 2015-09-18 21:07:07

j'ai le MyDbName (Restoring...) en raison de SQL Express licensed limit.

Dans le fichier journal, j'ai trouvé ceci:

créer base de données ou modifier base de données échoué parce que le résultat la taille cumulative de la base de données dépasserait votre limite autorisée de 10240 MB par base de données.

So si vous essayez de restaurer une base de données plus grande, vous devez passer votre SQL Express server à Developer edition par exemple.

0
répondu Dmitry Pavlov 2016-09-02 13:48:24