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
以下是你如何做到这一点:
- 停止服务(MSSQLSERVER);
- 重命名或删除数据库和日志文件(C:\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data …)或任何你有文件;
- 启动服务(MSSQLSERVER);
- 删除有问题的数据库;
- 再次恢复数据库。
祝你好运!
我有一个类似的事件停止日志传送辅助服务器。 在从日志传送中删除服务器的命令并停止从主服务器传送日志之后,辅助服务器上的数据库在命令后处于恢复状态
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
命令的客户端在还原过程中断开连接,则还原将被卡住。
当服务器被告知通过客户端连接恢复数据库时,除非客户端始终保持连接状态,否则不能完成恢复。
这一个工作:
我有一个情况,我的数据库显示恢复状态,我不能运行任何查询,无法连接到我们的软件。
我做了什么来摆脱这种情况是:
-
停止所有与Windows服务相关的SQL服务。
-
我打开了Ldf和Mdf文件驻留在SQL目录中的DATA文件夹,通常是这样的:“C:\ Program Files *********** \ MSSQL \ DATA
-
然后我复制了数据库的Ldf和Mdf文件:[db name] .mdf和[db name] _log.ldf
我将这两个文件复制到另一个文件夹。
-
然后,我再次从Windows服务启动所有与SQL相关的服务(在步骤1中)。
-
用正常的login启动我的MS SQL Management Studio。
-
右键单击罪魁祸首数据库,并点击删除(根本删除数据库)。
-
所有与此数据库相关的LDF和MDF文件都从DATA文件夹中删除(在步骤2中提到)。
-
创build一个新的数据库具有相同的名称(我在步骤6中删除的同名 – 罪魁祸首数据库)。
-
然后[数据库名称] – >右键单击 – >任务 – >脱机。
-
然后,我将这两个文件(从步骤3)复制回DATA文件夹(步骤2)。
-
[数据库名称] – >右键单击 – >任务 – >联机。
我有这个问题,当我也收到事件日志中的TCP错误…
用sql删除数据库或在pipe理器“删除”右键单击它并重新恢复。
我实际上已经开始做这个默认。 脚本数据库放下,重新创build,然后恢复。
我曾有一个 。 在我的数据库名称,查询不起作用,因为(在'。'附近说错误的语法)然后我意识到,我需要一个括号为名称:
RESTORE DATABASE [My.DB.Name] WITH RECOVERY
如果启用了快照,则也可能会删除卡住的数据库。 对我来说,这工作:
- 首先我遵循Tipu Delacablu的步骤(阅读几个post)
- 运行命令:drop database [你的数据库],这会给你一个错误,告诉你快照数据库的名字
- 运行命令:drop database [snapshot database],然后再次在步骤2中运行该命令。
你有没有试过运行validation? 只是为了确保它是一个完善的备份。
默认情况下,每个RESTORE DATABASE
都带有RECOVERY
设置。 “NORECOVERY”选项基本上告诉SQL Server数据库正在等待更多恢复文件(可能是DIFF文件和LOG文件,如果可能,可能包括尾部日志备份文件)。 “RECOVERY”选项,完成所有事务并让数据库准备好执行事务。
所以:
- 如果您的数据库使用SIMPLE恢复模式进行设置,那么只有使用
NORECOVERY
选项执行完全恢复时,才能进行DIFF备份。 SIMPLE恢复模型数据库中不允许LOG备份。 - 否则,如果您的数据库设置为FULL或BULK-LOGGED恢复模式,则可以执行完全恢复,然后执行
NORECOVERY
选项,然后执行DIFF ,然后执行NORECOVERY
,最后使用RECOVERY
选项执行LOG恢复。
请记住, 最后的恢复查询必须具有RECOVERY
选项 。 这可能是一个明确的方式或不是。 在T-SQL中,情况是:
-
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
-
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
希望这个帮助。
- 先检查并运行SQL Agent Service。
-
使用以下T-SQL:
SELECT filename FROM master.sys.sysaltfiles WHERE dbid = DB_ID('db_name');
-
连续使用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服务器切换到开发版本 。