Question SQL Server: base de données bloquée dans l'état "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é qu’il n’y avait pas de fichier journal dans la sauvegarde et qu’il devait être transféré en utilisant:

RESTORE DATABASE MyDatabase
WITH RECOVERY 

Sauf que, bien sûr, échoue:

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, c'est une restauration qui ne fonctionnera pas.


La sauvegarde contient à la fois un fichier de données et un fichier journal:

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

476
2018-02-06 16:21


origine


Réponses:


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

Ceci est bien sûr uniquement si vous n'avez pas l'intention de restaurer les sauvegardes du journal des transactions, c'est-à-dire que vous souhaitez uniquement restaurer une sauvegarde de base de données et pouvoir ensuite 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 de remplacement et l'option WITH Recovery. Parfois, le processus de restauration s'est arrêté juste à cause de la taille du fichier de base de données. vois ici: 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



Cette situation a permis de restaurer une base de données sur une instance de SQL Server 2005 Standard Edition à l'aide de Symantec Backup Exec 11d. Une fois le travail de restauration terminé, la base de données est restée dans un état "Restauration". Je n'avais aucun problème d'espace disque - la base de données ne sortait tout simplement pas de l'état "Restauration".

J'ai exécuté la requête suivante sur l'instance SQL Server et constaté que la base de données devenait immédiatement utilisable:

RESTORE DATABASE <database name> WITH RECOVERY

564
2017-07-28 15:21



Voici comment vous le faites:

  1. Arrêtez le service (MSSQLSERVER);
  2. Renommez ou supprimez les fichiers Base de données et Log (C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ...) ou partout où vous avez les fichiers;
  3. Démarrer le service (MSSQLSERVER);
  4. Supprimer la base de données avec le problème;
  5. Restaurez la base de données à nouveau.

Bonne chance!


89
2018-05-07 21:50



J'ai eu un incident similaire avec l'arrêt d'un serveur secondaire d'expédition de journaux. Après la commande de suppression du serveur de l'envoi de journaux et d'arrêt de l'envoi des journaux du serveur principal, la base de données du serveur secondaire est restée bloquée dans l'état de restauration après la commande.

RESTORE DATABASE <database name> WITH RECOVERY

Les messages de la base de données:

RESTORE DATABASE a traité avec succès 0 pages en 18.530 secondes   (0,000 Mo / sec).

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


77
2018-01-11 13:51



J'ai eu un problème similaire avec la restauration à l'aide de SQL Management Studio. J'ai essayé de restaurer une sauvegarde de la base de données sur une nouvelle avec un nom différent. Au début, cela a échoué et après avoir réparé les noms de fichiers de la nouvelle base de données, il a été exécuté avec succès - en tout cas, le problème que je décris a réapparu même si je l'ai compris dès la première fois. Ainsi, après la restauration, la base de données d'origine est restée avec un (Restauration ...) à côté de son nom. Compte tenu des réponses du forum ci-dessus (Bhusan's), j'ai essayé de courir dans l'éditeur de requêtes ci-dessous:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

qui a réglé le problème. 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 ceci en ajoutant des guillemets doubles - les guillemets simples ne fonctionneraient pas en donnant une erreur "Syntaxe incorrecte près ...".

C'était la solution minimale que j'ai essayé de résoudre ce problème (base de données bloquée en état de restauration) et j'espère que cela pourra s'appliquer à plus de cas.


55
2017-09-05 11:25



OK, j'ai un problème similaire et exactement comme dans le cas de Pauk, il a été causé par un manque d’espace disque du serveur lors de la restauration, ce qui a provoqué un état de restauration permanent. Comment mettre fin à cet état sans arrêter les services SQL Server?

J'ai trouvé une solution :)

Drop database *dbname*

28
2018-06-26 10:11



L'option WITH RECOVERY est utilisée par défaut lorsque les commandes RESTORE DATABASE / RESTORE LOG sont exécutées. 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 est nécessaire de restaurer plusieurs fichiers, les commandes CLI nécessitent respectivement WITH NORECOVERY et WITH RECOVERY - seul le dernier fichier de la commande doit avoir WITH 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 également utiliser l'assistant SQL Server Management Studio:

enter image description here

Il existe également un processus de restauration virtuelle, mais vous devrez utiliser des solutions tierces. Habituellement, vous pouvez utiliser une sauvegarde de base de données comme base de données en ligne en direct. ApexSQL et Idera ont leurs propres solutions. Examen par SQL Hammer à propos de ApexSQL Restore. La restauration virtuelle est une bonne solution si vous faites face à un grand nombre de sauvegardes. Le processus de restauration est beaucoup plus rapide et peut également économiser beaucoup d'espace sur le lecteur de disque. Vous pouvez jeter un oeil sur infographique ici pour une comparaison.


26
2018-01-17 17:24



Cela peut sembler évident, mais ça m'a fait perdre tout à l'heure:

Si vous effectuez une sauvegarde de journal de queue, ce problème peut également être causé par le fait que cette option soit cochée dans l'assistant de restauration SSMS - "Laisser la base de données source à l'état de restauration (WITH NORECOVERY)"

enter image description here


22
2017-07-16 15:20



J'ai compris pourquoi.

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

Il est étrange que le serveur, lorsqu'il est invité à 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
2018-02-11 19:04