DBCC CheckDB 操作系统返回错误 21(设备尚未准备好。)

DBCC CheckDB 操作系统返回错误 21(设备尚未准备好。)

在文件“E:\SQL Database\S*****d\NewAdvWorks.mdf”中偏移量 0x0000000001c000 处读取时,操作系统向 SQL Server 返回错误 21(设备尚未就绪)。SQL Server 错误日志和系统事件日志中的其他消息可能会提供更多详细信息。这是一个严重的系统级错误情况,会威胁数据库完整性,必须立即更正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素导致;有关更多信息,请参阅 SQL Server 联机丛书。

答案1

对我有用的是:

alter database [database_name] set offline

...等待几秒钟...

alter database [database_name] set online 

这比重新启动 SQL Server 更好,因为重新启动 SQL Server 会使所有数据库脱机(而不仅仅是无法访问的数据库)。

答案2

我今天遇到了同样的错误。重新启动 SQL Server 服务即可解决该问题。

SQL Server 错误日志和 Windows 事件日志显示相同的错误:

在文件“blah.mdf”中偏移量 0x00000000026000 处读取时,操作系统向 SQL Server 返回错误 21(设备尚未就绪)。SQL Server 错误日志和系统事件日志中的其他消息可能会提供更多详细信息。这是一个严重的系统级错误情况,会威胁数据库完整性,必须立即更正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素导致;有关更多信息,请参阅 SQL Server 联机丛书。

和:

错误:823,严重性:24,状态:2

在阅读了 Robert van den Berg 的回答后,如果您有其他需要保持在线的数据库,我会尝试先将数据库脱机,然后再联机。

答案3

首先读取错误消息中指示的日志。

然后尝试重置服务器,然后DBCC CheckDB再次运行。

答案4

就我而言,我可以使用

exec sp_detach_db [dbName];

其次是

exec sp_attach_db [dbName] , @filename1 = N'U:\mdf\dbName.mdf' , @filename2 = N'G:\ldf\dbName_log.ldf';

针对 SQL 2017 下的 30 个数据库。尽管“分离”过程引发了错误,但 SQL 确实分离了数据库。

我在开始分离之前使用过它 select db_name(database_id), * from sys.master_files ,因此我可以编写附加过程脚本,因为我有 30 个处于这种状态的数据库。

我找到了我的情况中的催化剂。前一天晚上我“扩展”了两个卷。磁盘管理报告说它当时无法扩展该卷。我决定等待维护窗口再试一次,目前还没有出现任何错误。

五小时后,使用 VSS 的备份开始。我确信失败的“扩展卷”和 VSS 快照的组合使卷处于异常状态。

相关内容