2022年7月23日星期六

如何修复 SQL Server 数据库中的恢复挂起状态?

将 SQL Server 数据库置于恢复模式的原因

SQL 服务器恢复挂起可能是因为在解析数据库中的某些事务期间系统关闭不当。

当你的硬盘或 RAM 中没有足够的空间时,有时运行各种查询会导致 SQL 数据库恢复挂起状态。各种用户移动他们的日志文件,以便可以增加系统的吞吐量,但在传输 SQL 文件时,他们的数据被损坏,这迫使数据库处于恢复挂起状态。 

SQL Server 数据库状态定义

下表定义了数据库的状态。

状态 定义
ONLINE 可以对数据库进行访问。 即使可能尚未完成恢复的撤消阶段,主文件组仍处于在线状态。
OFFLINE 数据库无法使用。 数据库由于显式的用户操作而处于离线状态,并保持离线状态直至执行了其他的用户操作。 例如,可能会让数据库离线以便将文件移至新的磁盘。 然后,在完成移动操作后,使数据库恢复到在线状态。
RESTORING 正在还原主文件组的一个或多个文件,或正在脱机还原一个或多个辅助文件。 数据库不可用。
RECOVERING 正在恢复数据库。 恢复进程是一个暂时性状态,恢复成功后数据库将自动处于在线状态。 如果恢复失败,数据库将处于可疑状态。 数据库不可用。
RECOVERY PENDING SQL Server 在恢复期间遇到与资源相关的错误。 数据库未损坏,但是可能缺少文件,或系统资源限制可能导致无法启动数据库。 数据库不可用。 需要用户另外执行操作来解决问题,并让恢复进程完成。
SUSPECT 至少主文件组可疑或可能已损坏。 在 SQL Server 启动过程中,数据库无法恢复。 数据库不可用。 需要用户另外执行操作来解决问题。
EMERGENCY 用户更改了数据库,并将其状态设置为 EMERGENCY。 数据库处于单用户模式,可以修复或还原。 数据库标记为 READ_ONLY,禁用日志记录,并仅限 sysadmin 固定服务器角色的成员访问。 EMERGENCY 主要用于故障排除。 例如,可以将标记为“可疑”的数据库设置为 EMERGENCY 状态。 这样可以允许系统管理员对数据库进行只读访问。 只有 sysadmin 固定服务器角色的成员才可以将数据库设置为 EMERGENCY 状态。

你可以通过在 SQL 数据库上运行以下命令来自行检查处于恢复挂起状态的数据库。

使用SQL语句: SELECT name, state_desc FROM sys.databases 并执行可以查看 SQL 数据库恢复挂起状态;

SQL Server 数据库中的手动恢复挂起状态

我建议先复制备份好 SQL 数据库再进行操作,以免数据受到损坏而无法修复。 以下SQL语句中的 [DBName] 请修改为你要执行的数据库名称,例如:ALTER DATABASE [dbzyw] SET ONLINE;以下SQL语句中的 [mdf path] 请修改为数据库MDF文件的对应的文件路径。

解决方法一:

设置数据库处于单用户模式下,可以执行修复或还原操作。使用 Alter DB 和DBCC CHECKDB 命令修复 MS SQL 恢复挂起状态,如下所示:

ALTER DATABASE [DBName] SET EMERGENCY;     --设置数据库为EMERGENCY紧急状态

ALTER DATABASE [DBName] SET single_user;          --设置数据库为单用户模式

DBCC CHECKDB ([DBName], REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;  --用DBCC CHECKDB命令修复数据库

ALTER DATABASE [DBName] SET multi_user             --设置数据库为多用户模式
ALTER DATABASE [DBName] SET ONLINE;     --设置数据库为ONLINE在线状态

如果上面的SQL命令正常执行,那么恭喜您SQL Server 数据库中RECOVERY PENDING(恢复挂起)状态已经成功修复。

解决方法二:

将数据库设置为紧急状态,然后使数据库脱机并重新联机数据库来修复恢复挂起SQL server recovery Pending ​状态。可以使用SQL Server Management Studio管理工具来操作,具体方法是在工具的界面选择对应的数据库,然后在选中的数据库上面右键选择任务-->分离,然后确定。然后服务器数据库右键选择附加-->在弹出的界面选择添加,选择对应的数据库文件路径,然后确定。也可以用SQL命令实现,如下所示:

ALTER DATABASE [DBName] SET EMERGENCY;     --设置数据库为EMERGENCY紧急状态

ALTER DATABASE [DBName] SET single_user;          --设置数据库为单用户模式

EXEC sp_detach_db [DBName];                                  --分离数据库   

EXEC sp_attach_single_file_db @DBName = [DBName], @physname = N'[mdf path]'   --附加数据库

友情提示:

资料无价,操作需谨慎,在执行修复操作前一定要提前备份好数据库。本站对您的数据库损坏不承担任何责任。

留下您的评论