SQL Server:数据库处于“恢复”状态

我备份了一个数据库:

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

然后试图恢复它:

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

而现在数据库仍处于恢复状态。

有人认为,这是因为备份中没有日志文件,需要使用以下命令进行滚动:

 RESTORE DATABASE MyDatabase WITH RECOVERY 

除此之外,当然失败了:

 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. 

而在灾难性的情况下,你想要的是一个不可能的恢复。


备份包含数据和日志文件:

 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 

您需要使用WITH RECOVERY选项和数据库RESTORE命令将数据库联机作为还原过程的一部分。

这当然只有在你不打算恢复任何事务日志备份时,也就是说,你只希望恢复数据库备份,然后才能访问数据库。

你的命令应该是这样的,

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

在SQL Server Management Studio中使用还原数据库向导可能会获得更多成功。 这样,您可以select特定的文件位置,覆盖选项和WITH恢复选项。 有时候,恢复过程只是因为数据库文件的大小而停滞不前。 看到这里: https : //madhivanan.wordpress.com/2016/09/06/issue-in-recovering-a-database-that-is-in-the-restoring-state-reference/

我遇到过这种情况,使用Symantec Backup Exec 11d将数据库恢复到SQL Server 2005 Standard Edition实例。 还原作业完成后,数据库保持“恢复”状态。 我没有磁盘空间问题 – 数据库根本没有出现“恢复”状态。

我对SQL Server实例运行以下查询,发现数据库立即变为可用:

 RESTORE DATABASE <database name> WITH RECOVERY 

以下是你如何做到这一点:

  1. 停止服务(MSSQLSERVER);
  2. 重命名或删除数据库和日志文件(C:\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data …)或任何你有文件;
  3. 启动服务(MSSQLSERVER);
  4. 删除有问题的数据库;
  5. 再次恢复数据库。

祝你好运!

我有一个类似的事件停止日志传送辅助服务器。 在从日志传送中删除服务器的命令并停止从主服务器传送日志之后,辅助服务器上的数据库在命令后处于恢复状态

 RESTORE DATABASE <database name> WITH RECOVERY 

数据库消息:

RESTORE DATABASE在18.530秒(0.000 MB /秒)内成功处理0页。

数据库在18秒后再次可用。

我遇到了使用SQL Management Studio进行恢复的类似问题。 我试图将数据库的备份恢复到另一个名称不同的新数据库。 起初,这个失败了,在修复了新的数据库的文件名之后,它成功地执行了 – 无论如何,即使我第一次得到这个权利,我所描述的问题也会重演。 所以,在恢复之后,原始数据库的名字旁边还有一个(Restoring …)。 考虑到上面的论坛(Bhusan's)的答案,我尝试在查询编辑器中运行以下内容:

 RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]" 

解决了这个问题。 由于包含特殊字符的数据库名称,我起先遇到了麻烦。 我通过添加双引号来解决这个问题 – 单引号不起作用,给出“错误的语法附近…”错误。

这是我试图解决这个问题的最小的解决scheme(数据库处于恢复状态),我希望它可以应用到更多的案例。

好的,我有类似的问题,正如在Pauk情况下一样,这是由于服务器在恢复时磁盘空间不足而造成永久恢复状态。 如何结束此状态而不停止SQL Server服务?

我find了解决scheme:)

 Drop database *dbname* 

WITH RECOVERY选项在执行RESTORE DATABASE / RESTORE LOG命令时默认使用。 如果你被困在“恢复”过程中,你可以通过执行以下命令将数据库恢复到联机状态:

 RESTORE DATABASE YourDB WITH RECOVERY GO 

如果需要恢复多个文件,那么CLI命令分别需要WITH NORECOVERY和WITH RECOVERY – 只有命令中的最后一个文件应具有WITH RECOVERY才能使数据库联机:

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

您还可以使用SQL Server Management Studio向导:

在这里输入图像说明

也有虚拟的恢复过程,但你必须使用第三方解决scheme。 通常您可以使用数据库备份作为在线数据库。 ApexSQL和Idera有他们自己的解决scheme。 SQL Hammer 关于ApexSQL Restore的评论 。 如果您正在处理大量的备份,虚拟恢复是一个很好的解决scheme。 还原过程更快,也可以节省磁盘驱动器上的大量空间。 你可以看看这里的信息图表进行一些比较。

这可能是相当明显的,但是现在让我感到沮丧:

如果您正在执行尾部日志备份,则可能会由于在SSMS还原向导中选中此选项而导致此问题 – “使源数据库保持还原状态(WITH NORECOVERY)”

在这里输入图像说明

我明白了为什么。

如果发出RESTORE DATABASE命令的客户端在还原过程中断开连接,则还原将被卡住。

当服务器被告知通过客户端连接恢复数据库时,除非客户端始终保持连接状态,否则不能完成恢复。

这一个工作:

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

我有一个情况,我的数据库显示恢复状态,我不能运行任何查询,无法连接到我们的软件。

我做了什么来摆脱这种情况是:

  1. 停止所有与Windows服务相关的SQL服务。

  2. 我打开了Ldf和Mdf文件驻留在SQL目录中的DATA文件夹,通常是这样的:“C:\ Program Files *********** \ MSSQL \ DATA

  3. 然后我复制了数据库的Ldf和Mdf文件:[db name] .mdf和[db name] _log.ldf

我将这两个文件复制到另一个文件夹。

  1. 然后,我再次从Windows服务启动所有与SQL相关的服务(在步骤1中)。

  2. 用正常的login启动我的MS SQL Management Studio。

  3. 右键单击罪魁祸首数据库,并点击删除(根本删除数据库)。

  4. 所有与此数据库相关的LDF和MDF文件都从DATA文件夹中删除(在步骤2中提到)。

  5. 创build一个新的数据库具有相同的名称(我在步骤6中删除的同名 – 罪魁祸首数据库)。

  6. 然后[数据库名称] – >右键单击 – >任务 – >脱机。

  7. 然后,我将这两个文件(从步骤3)复制回DATA文件夹(步骤2)。

  8. [数据库名称] – >右键单击 – >任务 – >联机。

我有这个问题,当我也收到事件日志中的TCP错误…

用sql删除数据库或在pipe理器“删除”右键单击它并重新恢复。

我实际上已经开始做这个默认。 脚本数据库放下,重新创build,然后恢复。

我曾有一个 。 在我的数据库名称,查询不起作用,因为(在'。'附近说错误的语法)然后我意识到,我需要一个括号为名称:

 RESTORE DATABASE [My.DB.Name] WITH RECOVERY 

如果启用了快照,则也可能会删除卡住的数据库。 对我来说,这工作:

  1. 首先我遵循Tipu Delacablu的步骤(阅读几个post)
  2. 运行命令:drop database [你的数据库],这会给你一个错误,告诉你快照数据库的名字
  3. 运行命令:drop database [snapshot database],然后再次在步骤2中运行该命令。

你有没有试过运行validation? 只是为了确保它是一个完善的备份。

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

默认情况下,每个RESTORE DATABASE都带有RECOVERY设置。 “NORECOVERY”选项基本上告诉SQL Server数据库正在等待更多恢复文件(可能是DIFF文件和LOG文件,如果可能,可能包括尾部日志备份文件)。 “RECOVERY”选项,完成所有事务并让数据库准备好执行事务。

所以:

  1. 如果您的数据库使用SIMPLE恢复模式进行设置,那么只有使用NORECOVERY选项执行完全恢复时,才能进行DIFF备份。 SIMPLE恢复模型数据库中不允许LOG备份。
  2. 否则,如果您的数据库设置为FULLBULK-LOGGED恢复模式,则可以执行完全恢复,然后执行NORECOVERY选项,然后执行DIFF ,然后执行NORECOVERY ,最后使用RECOVERY选项执行LOG恢复。

请记住, 最后的恢复查询必须具有RECOVERY选项 。 这可能是一个明确的方式或不是。 在T-SQL中,情况是:

  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

WITH REPLACE选项必须谨慎使用,否则可能导致数据丢失

或者,如果您执行完整备份和差异备份,则可以使用此function

 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

当然,你可以用选项STATS = 10来执行恢复,告诉SQL Server每完成10%就报告一次。

如果您愿意,您可以观察过程或基于实时查询恢复。 如下:

 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 

希望这个帮助。

  1. 先检查并运行SQL Agent Service。
  2. 使用以下T-SQL:

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

  3. 连续使用T-SQL:

    RESTORE DATABASE FROM DISK ='DB_path'WITH RESTART,REPLACE;

希望这个帮助!

所有基于WITH RECOVERY的选项都不适用于我。

什么是从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 

我有同样的问题…虽然我不知道为什么我的数据库遇到这个问题,因为我的驱动器没有满…这就像它被损坏或什么的。 我尝试了上述所有都没有完全工作,我特别想到build议停止服务和删除mdf和ldf文件将工作…但它仍然冻结恢复?

我最终通过删除上述文件来解决这个问题,但不是试图再次恢复数据库,而是将其复制到新的.mdf和.ldf文件中,并使用“前端附件”向导进行附加。 救济,它的工作!

因为我正在使用虚拟机,因此我们花了不less时间复制新文件…因此,使用剪贴板进行复制和粘贴花费了一个小时,所以我只会推荐这个作为最后一次尝试。

由于SQL Express许可限制,我得到了MyDbName(恢复…)情况。

在日志文件中,我发现这个:

CREATE DATABASE或ALTER DATABASE 失败,因为生成的累积数据库大小将超过每个数据库10240 MB的许可限制

所以,如果你想恢复一个更大的数据库, 你需要将你的SQL Express服务器切换到开发版本