SQL服务器:数据库陷入“正在恢复”状态
-
22-08-2019 - |
题
我备份了一个数据库:
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中还原数据库向导的更多sucess。这样你就可以选择特定的文件位置,覆盖选项,以及带恢复选项。
其他提示
我有这种情况将数据库还原到使用Symantec的Backup Exec 11d的SQL Server 2005的标准版实例。还原作业完成后,数据库仍然处于“恢复”状态。我没有磁盘空间issues--数据库根本没来“还原”的状态了。
我跑了反对的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成功处理0页18.530秒 (0.000 MB /秒)。
这18秒后该数据库是可以再次使用。
我不得不使用SQL Management Studio中恢复类似的问题。我试图将数据库备份恢复到一个新的使用不同的名称。起初,这个失败和修复已成功完成新数据库的文件名之后 - 这个问题在任何情况下,我所描述的重新出现,即使我从第一次遇到这种权利。因此,恢复后,原始数据库仍然有(还原...)在其名称旁边。考虑到上述(Bhusan的),我试图在一侧的查询编辑器中运行以下论坛的答案:
RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"
,其固定的问题。我起初含有特殊字符的数据库名称,因为有麻烦。我解决了这个由各地加入双引号 - 单引号是行不通给人一种“附近有语法错误...”错误
这是最小的解决方案,我一直试图解决这个问题(在恢复状态卡住数据库),我希望它可以应用到更多的情况。
OK,我有类似的问题,正是因为它是在Pauk的情况下,通过运行的磁盘空间不足,同时恢复,因此造成了永久的恢复状态的服务器造成的。 如何结束而无需停止SQL Server服务的这种状态?
我已经找到了解决方案:)
Drop database *dbname*
WITH RECOVERY选项时使用的默认RESTORE DATABASE / RESTORE执行日志命令。如果你停留在“恢复”过程中,你可以通过执行带回数据库联机状态:
RESTORE DATABASE YourDB WITH RECOVERY
GO
如果有需要多个文件恢复,CLI命令需要带恢复并分别与恢复 - 仅在命令的最后一个文件应该恢复中带回数据库联机:
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锤约ApexSQL恢复。虚拟还原是如果你正在处理大量的备份很好的解决方案。恢复过程更快,还可以节省大量的空间,磁盘驱动器上。您可以一看信息图表这里对一些比较。
这可能是相当明显的,但它绊倒了我刚才:
如果你正在服用一尾日志备份,这个问题也可以通过具有该选项在SSMS检查还原向导引起 - “留在还原状态源数据库(带恢复)”
我想出为什么。
如果谁在发布的RESTORE DATABASE
命令断开连接客户端还原,还原会卡住。
这是奇怪的是,服务器,告诉客户端的连接来恢复数据库时,将无法完成恢复,除非客户端保持连接的全部时间。
这个确实有效:
我遇到过这样的情况:我的数据库显示正在恢复状态,但我无法运行任何查询,也无法连接我们的软件。
为了摆脱这种情况我所做的是:
停止 Windows 服务中的所有 SQL 相关服务。
我打开了 SQL 目录中 Ldf 和 Mdf 文件所在的 DATA 文件夹,通常如下所示:“C:\Program Files************\MSSQL\DATA
然后我复制了数据库的Ldf和Mdf文件:[数据库名称].mdf 和 [数据库名称]_log.ldf
我将这两个文件复制到另一个文件夹中。
然后我再次从 Windows 服务启动所有 SQL 相关服务(在步骤 1 中)。
使用正常登录启动我的 MS SQL Management studio。
右键单击罪魁祸首数据库并单击“删除”(完全删除该数据库)。
与该数据库相关的所有 LDF 和 MDF 文件均已从 DATA 文件夹中删除(在步骤 2 中提到)。
创建一个同名的新数据库(与我在步骤 6 中删除的数据库同名 - 罪魁祸首数据库)。
然后[数据库名称]->右键->任务->脱机。
然后,我将这两个文件(从步骤 3)复制回 DATA 文件夹(步骤 2)。
[数据库名称]->右键单击->任务->联机。
我有一个。在我的数据库名称,查询没有因为这个工作(说附近有语法错误“”),然后我意识到我需要一个支架的名称:
RESTORE DATABASE [My.DB.Name] WITH RECOVERY
在我的情况下,它足以下拉数据库强>将其挂在状态的 “恢复...”强>使用SQL命令
drop database <dbname>
在查询窗口中。
然后我上右键单击的数据库并选择的刷新强>其中除去在Management Studio的条目。后来我做了一个新的恢复后就正常了(注意,把它离线没有工作,SQL服务重新启动没有工作,重新启动服务器没有工作为好)。
我有这个问题时,我也是在事件日志中收到TCP错误...
删除数据库与SQL或右键单击它经理“删除” 并再次恢复。
我其实已经开始在默认情况下这样做。脚本中的DB下降,重新创建,然后还原。
默认情况下,每个 RESTORE DATABASE
附带 RECOVERY
设置。“NORECOVERY”选项基本上告诉 SQL Server 数据库正在等待更多恢复文件(可能是 差分法 文件和 日志 文件,并且可能包括尾日志备份文件(如果可能)。“RECOVERY”选项,完成所有事务并让数据库准备好执行事务。
所以:
- 如果您的数据库设置为 简单的 恢复模式,您只能执行 满的 恢复与
NORECOVERY
选项,当你有 差分法 备份。不 日志 允许备份 简单的 恢复模型数据库。 - 否则,如果您的数据库设置为 满的 或者 批量记录 恢复模型,您可以执行 满的 恢复然后
NORECOVERY
选项,然后执行 差分法 其次是NORECOVERY
, ,最后执行 日志 恢复与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
当然,您可以使用选项执行恢复 统计数据 = 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
希望这有帮助。
如果启用快照,删除卡住的数据库也可能会出现问题。对我来说这有效:
- 首先我跟随 蒂普·德拉卡布卢 步骤(阅读一些帖子)
- 运行命令:drop database [您的数据库],这将给您一个错误,告诉您快照数据库的名称
- 运行命令:删除数据库 [快照数据库],然后再次运行步骤 2 中的命令。
您是否尝试过运行只验证?只是为了确保它是一个完善的备份。
- 首先检查并运行SQL Agent Service。
使用以下 T-SQL:
从master.sys.sysaltfiles中选择filename,其中dbid = db_id('db_name');
连续使用T-SQL:
从disk ='db_path'恢复数据库,并重新启动,替换;
希望这有帮助!
所有带恢复选项的基础并没有为我工作。
什么做的是做从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
我有同样的问题...虽然我不知道为什么我的数据库遇到此问题作为我的车是不是全...这就像它被损坏或东西。我尝试了上述所有他们没有充分的工作,我特别想建议停止服务并删除MDF和LDF文件将工作...但它仍然冻结了关于恢复?
我最终通过删除文件,提到解决这一但不是试图恢复DB我又复制了新鲜的.mdf和.ldf文件,并使用前端侧安装向导安装这些安全。救济,它的工作!
这没完没了了新的文件复制,因为我使用虚拟机...所以拷贝和使用剪贴板像花了一个小时的本身,所以我只想建议将此作为最后的尝试粘贴。
我已经拿到了 MyDbName(还原...)的,因为SQL Express的情况下许可限制。
在日志文件中,我发现这一点:
CREATE DATABASE或ALTER DATABASE的失败,因为强>所得 累积的数据库大小将超过10240 MB的许可限制 每个数据库。
所以,如果你想恢复一个更大的数据库,您需要将您的SQL Express服务器切换到开发者版作为实例。
对我来说解决的是
- 停止实例
- 在数据文件夹中创建 .mdf 和 .ldf 文件的备份
- 重启实例
- 删除数据库卡住恢复
- 将 .mdf 和 .ldf 文件放回数据文件夹
- 将实例附加到 .mdf 和 .ldf 文件
RESTORE DATABASE {DatabaseName}
FROM DISK = '{databasename}.bak'
WITH REPLACE, RECOVERY