SQL Server:数据库停留在“正在还原”状态


564

我备份了一个数据库:

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

3
我遇到了完全相同的问题,所有解决方案都失败了。有趣的是,我直接登录到SQL Server并DROP DATABASE db通过SSMS 发出了命令,该命令起作用了(之前我是从另一台计算机上使用SSMS发出命令的)。我猜想其他解决方案也会奏效。
Salman A

Answers:


437

您需要WITH RECOVERY在数据库RESTORE命令中使用该选项,以使数据库联机,这是还原过程的一部分。

当然,仅当您不打算还原任何事务日志备份(即,您只希望还原数据库备份然后能够访问数据库)时,这才是当然的。

您的命令应如下所示:

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

使用SQL Server Management Studio中的还原数据库向导,可能会有更多的成功。这样,您可以选择特定的文件位置,覆盖选项和WITH恢复选项。


3
在执行他正在执行的操作时,我从未使用过恢复语句。只要更换就足够了。
山姆

8
是的,我使用的是NORECOVERY,但是还原过程挂起。使用WITH RECOVERY,REPLACE不再使过程挂起
JuniorMayhé2009年

这解决了我的问题。在还原过程中,我们发生了SAN故障,这是一种快速,干净的解决方案。
注册用户,

今天,我在SQL Server 2005数据库中遇到了类似的问题。就我而言,我必须在WITH子句中添加“,RESTART”以解决该问题。它给我一个错误消息,指出先前的操作未成功。
XpiritO 2011年

3
@FistOfFury如果同一数据库上的先前还原操作处于挂起/休眠状态,则为是。简单地停止/取消正在进行的还原应该具有相同的效果。
John Sansom 2013年

692

我遇到这种情况,是使用Symantec Backup Exec 11d将数据库还原到SQL Server 2005 Standard Edition实例。还原作业完成后,数据库仍处于“正在还原”状态。我没有磁盘空间问题-数据库根本没有脱离“正在还原”状态。

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

RESTORE DATABASE <database name> WITH RECOVERY

4
我们有一个数据库在还原中停留了2个小时。我们从另一台计算机上针对主服务器运行了此命令,并立即修复了问题。谢谢!
皮特

11
+1,有个陷阱。运行此命令时,我收到一条错误消息,指出数据库已完全恢复。但是它仍然显示为“处于恢复中”状态。因此,我在Management Studio中右键单击它,然后单击“刷新”,它恢复了正常。
dario_ramos 2012年

2
我使用Mng Studio向导进行了还原,输入了新的数据库名称,但是错误地保留了与现有数据库相同的文件名。我收到错误消息“还原失败,但日志尾部成功”,并且附加到这些文件的数据库处于还原状态。此命令似乎已将数据库还原到其先前的状态。
克里斯(Chris)

3
这工作了。我试图将备份还原到侧数据库,但是由于某种原因,我的主数据库进入了还原状态。这实际上恢复了我的数据库。谢谢一群!
Aravindh 2014年

2
某些SSMS还原向导的默认设置将使源数据库处于还原状态,以便您可以继续还原各种备份或日志而无需担心用户,并且此命令是将数据库恢复正常后的正确方法。
蒂姆·莱纳

102

这是您的操作方式:

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

Tipu,谢谢。我有一个与原始发布者类似的问题,但是这是由于服务器在还原时磁盘空间不足而引起的,因此导致了永久的还原状态。
Pauk)

8
为什么不删除数据库呢?这样,您不必停止服务。
ErikE 2012年

8
@ErikE对我来说,SQL Server说它不能在还原过程中删除数据库,即使它并没有真正还原....
Erik Philips

@ErikPhilips在这种情况下,我想人们又回到了停止服务的状态。我不知道这是每次还是仅在卡住还原问题的某些情况下发生。
ErikE

5
就我而言,drop database <dbname>在查询窗口中使用SQL命令删除挂起状态为“正在还原...”的数据库就足够了。然后,我右键单击“ 数据库”,然后选择“ 刷新”,这将删除Management Studio中的条目。之后,我进行了一个新的还原,该还原工作正常(请注意,使它脱机不起作用,SQL服务的重新启动不起作用,服务器重新启动也不起作用)。
马特

84

我曾与停止日志传送辅助服务器发生类似事件。命令从日志传送中删除服务器并停止从主服务器传送日志后,命令后,辅助服务器上的数据库处于还原状态

RESTORE DATABASE <database name> WITH RECOVERY

数据库消息:

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

在那18秒之后,该数据库再次可用。


6
当您已经还原数据库但忘记了RECOVERY选项时特别有用...
JBickford 2011年

2
将数据库的备份还原到其他数据库名称后,我只需要将它保留为“正在还原”状态即可。谢谢你
肖恩

81

使用SQL Management Studio进行还原时,我遇到了类似的问题。我试图将数据库的备份还原到具有不同名称的新数据库。最初,这失败了,并且在修复了新数据库的文件名之后,它已成功执行-在任何情况下,即使我从第一次就知道了这一点,也会再次出现我所描述的问题。因此,还原后,原始数据库的名称旁边保留着(Restoring ...)。考虑到以上论坛(Bhusan的论坛)的答案,我尝试在以下一侧的查询编辑器中运行:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

解决了这个问题。起初我遇到麻烦,因为数据库名称包含特殊字符。我通过在周围加上双引号来解决此问题-单引号无法给出“ ...附近的语法不正确”的错误。

这是我尝试解决此问题(将数据库保留在还原状态)的最小解决方案,我希望它可以应用于更多情况。


2
完美工作-无需将它拆下来。3个80+ Gb Db需要一段时间!谢谢!
克里斯特

1
我几乎在生产环境上做到了。我首先在本地尝试过,最终遇到了同样的情况,并找到了您的评论。获得的经验教训:在重要情况下使用脚本并且不要信任SSMS。
Mariusz

1
将数据库的仅复制文件备份还原到新数据库时出现此问题。原始数据库显示错误。该解决方案有效,得到的响应是“ RESTORE DATABASE在0.263秒(0.000 MB /秒)内成功处理了0页”。,因此似乎SQL Server只是对数据库状态感到困惑。
R. Schreurs

1
为我工作,但仅当我删除双引号时才有效–我只是将[MY_DB_NAME]作为参数。
StackOverflowUser

34

好的,我有类似的问题,与Pauk情况完全相同,这是由于服务器在还原时磁盘空间不足而引起的,因此导致了永久的还原状态。如何在不停止SQL Server服务的情况下结束此状态?

我找到了解决方案:)

Drop database *dbname*

29

当执行RESTORE DATABASE / RESTORE LOG命令时,缺省情况下使用WITH RECOVERY选项。如果您陷入“还原”过程,则可以通过执行以下操作使数据库恢复在线状态:

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向导:

在此处输入图片说明

也有虚拟还原过程,但是您必须使用第三方解决方案。通常,您可以将数据库备份用作实时在线数据库。ApexSQL和Idera有自己的解决方案。SQL Hammer 对ApexSQL Restore的评论。如果要处理大量备份,则虚拟还原是一个很好的解决方案。还原过程要快得多,还可以节省磁盘驱动器上的大量空间。您可以在此处查看信息图表以进行比较。


23

这也许是很明显的,但它使我震惊了:

如果您要进行尾日志备份,也可能是由于在SSMS还原向导中选中了此选项引起的-“将源数据库置于还原状态(WITH NORECOVERY)”

在此处输入图片说明


7
如果您处于这种状态,那么最好的选择是:1.右键单击数据库,转到“任务”->“还原”->“事务日志” 2.查找用于备份“尾日志”的备份文件3.还原备份还原应该成功,并使数据库重新联机。
瑞安·格罗斯

16

我弄清楚了原因。

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

奇怪的是,当服务器通过客户端连接通知还原数据库时,除非客户端一直保持连接状态,否则服务器将无法完成还原。


10
所有SQL命令都要求客户端始终保持连接状态。
mrdenny

2
@mrdenny:我本来以为当客户端断开连接时更改会撤消。
伊恩·博伊德

我在使用Microsoft PPHP驱动程序运行此命令时遇到相同的问题。但是,当与Microsoft SQL Server Management Studio一起运行时,它可以正常工作。我想知道如何使我的php应用程序始终保持连接状态?
channa ly 2012年

也可能发生这种情况,在可能的连接断开后,DB卡在还原/单用户中。从新会话中杀死了所有其他SPID,但仍然卡住。能够删除数据库作为解决方案。
crokusek 2012年

10

这个工作了:

http://social.msdn.microsoft.com/Forums/zh-CN/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. 以正常登录身份启动了我的MS SQL Management Studio。

  3. 右键单击“罪魁祸首”数据库,然后单击“删除”(完全删除该数据库)。

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

  5. 创建了一个具有相同名称的新数据库(与我在第6步中删除的数据库相同的名称-罪魁祸首数据库)。

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

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

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


这也对我有用。在步骤10中,我选择覆盖现有文件。
Divi perdomo

8

我曾有一个 。在我的数据库名称中,并且由于该原因查询不起作用(说“。”附近的语法不正确),然后我意识到我需要为该名称加上括号:

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

5

就我而言,使用SQL命令删除处于“正在还原...”状态的数据库已足够

 drop database <dbname> 

在查询窗口中。

然后,我右键单击“ 数据库”,然后选择“ 刷新”,这将删除Management Studio中的条目。之后,我做了一个新的还原,该还原工作正常(请注意,使它脱机不起作用,SQL服务的重新启动不起作用,服务器重新启动也不起作用)。


3

我在事件日志中也收到TCP错误时遇到了这个问题...

使用sql删除数据库,或在管理器“删除”中右键单击它,然后再次还原。

默认情况下,我实际上已经开始执行此操作。编写数据库放置脚本,重新创建然后还原。


3

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

所以:

  1. 如果您的数据库是使用SIMPLE恢复模型设置的,则只有具有DIFF备份时,才可以使用选项执行FULL Restore 。没有LOG备份被允许在SIMPLE恢复模型的数据库。NORECOVERY
  2. 否则,如果你的数据库设置了FULL大容量日志恢复模式,您可以执行一个完整还原,然后NORECOVERY选项,然后执行DIFF其次NORECOVERY,和,最后,执行LOG与恢复RECOVERY选项。

请记住,最后的恢复查询必须有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选项,因为它可能导致数据丢失

或者,如果执行完全备份和不同备份,则可以使用此备份

   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

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

希望能有所帮助。


2

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

  1. 首先,我按照Tipu Delacablu的步骤进行操作(阅读了几篇文章)
  2. 运行命令:drop database [您的数据库],这将给您一个错误,告诉您快照数据库的名称
  3. 运行命令:删除数据库[快照数据库],然后再次运行步骤2中的命令。


1

由于SQL Express许可限制,我遇到了MyDbName(Restoring ...)案例。

在日志文件中,我发现了这一点:

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

因此,如果您尝试还原更大的数据库,则需要将您的SQL Express服务器切换到Developer Edition


那是TFS数据库,TFS客户端已经告诉我:数据库已满。
cskwg

1

在使用SQL Server Management Studio还原数据库时遇到了类似的问题,它陷入了还原模式。经过几个小时的问题跟踪,以下查询对我有用。以下查询将数据库从现有备份还原到以前的状态。我相信,要抓住的是将.mdf和.log文件放在同一目录中。

RESTORE DATABASE aqua_lc_availability
FROM DISK = 'path to .bak file'
WITH RECOVERY

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

    从master.sys.sysaltfiles中选择文件名dbid = DB_ID('db_name');

  3. 连续使用T-SQL:

    从DISK ='DB_path'还原数据库,并重新启动,替换;

希望有帮助!


0

所有基于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

0

我遇到了同样的问题...虽然我不知道为什么我的数据库由于驱动器未满而为什么会遇到此问题...这就像它已损坏或发生了什么。我尝试了以上所有方法,但它们都没有完全起作用,我特别认为停止服务并删除mdf和ldf文件的建议会起作用...但是在恢复时还是冻结了吗?

我最终通过删除文件来解决此问题,但是没有尝试再次还原数据库,而是复制了新的.mdf和.ldf文件,并使用“前端附件”向导附加了这些文件。救济,它的工作!

当我使用虚拟机时,花了永远的时间来复制新文件...因此,使用剪贴板进行复制和粘贴本身就花费了一个小时,因此,我只建议将其作为最后的尝试。


0

对我来说固定的是

  1. 停止实例
  2. 在数据文件夹中创建.mdf和.ldf文件的备份
  3. 重新启动实例
  4. 删除数据库卡死还原
  5. 将.mdf和.ldf文件放回数据文件夹
  6. 将实例附加到.mdf和.ldf文件

0
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY

请指出此答案与较旧的,公认的且高度评价的答案相比所提供的其他见解。这将有助于避免为了获得声誉而仅仅复制它的印象。此外,此处不提供纯代码答案(这是主要的可见差异),因为它们给人的错误印象是StackOverflow是免费的代码编写服务,
Yunnosch

我固定了格式,只是为了使与旧答案的相似性更加明显。但是,您可以在这里stackoverflow.com/editing-help中学习如何做,以防将来尝试做出更容易理解的答案。
Yunnosch

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.