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
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 /
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
Voici comment vous le faites:
- Stop the service (MSSQLSERVER);
- 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;
- Start the service (MSSQLSERVER);
- supprimer la base de données avec problème;
- restaurer à nouveau la base de données.
bonne chance!
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.
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.
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*
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:
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.
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) "
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.
celui-ci a fonctionné:
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:
-
Arrêter tous les SQL liées services de windows services.
-
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
-
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.
-
puis j'ai redémarré tous les services liés à SQL (à l'étape 1) à partir des Services windows.
-
a démarré mon studio de gestion MS SQL avec login normal.
-
faites un clic droit sur la base de données culprit et cliquez sur Supprimer (pour supprimer la base de données).
-
tous les fichiers LDF et MDF liés à cette base de données ont partie du dossier de données (mentionné à l'étape 2).
-
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).
-
Puis [nom de base de données]->clic droit -> tâches -> déconnecter.
-
J'ai ensuite copié les deux fichiers (à partir de l'étape 3) dans le dossier de données (Étape 2).
-
[nom de la base de données]->clic droit -> tâches -> mettre en ligne.
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
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.
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.
:
- 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. - 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 deNORECOVERY
, et, enfin, effectuer LOG restaurer avecRECOVERY
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:
-
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
-
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.
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é:
- j'ai d'Abord suivi Tipu Delacablu étapes (lu quelques posts)
- run command: drop database [your database], qui vous donnera une erreur vous indiquant le nom de la base de données snapshot
- exécute la commande: drop database [snapshot database], puis exécute à nouveau la commande à l'étape 2.
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).
avez-vous essayé D'exécuter un VERIFY seulement? Juste pour être sûr que c'est une sauvegarde sonore.
- vérifiez et exécutez le service D'Agent SQL en premier.
-
utilisant le T-SQL suivant:
sélectionner le nom du fichier À PARTIR du maître.sys.sysaltfiles Où dbid = DB_ID ('db_name');
-
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!
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
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.
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.