过去几周运行良好的 MS SQL Server 数据库突然出现以下错误:
System.Data.SqlClient.SqlException:警告:致命错误 823 发生在约会时间
记录错误和时间,并联系系统管理员。
这个错误是什么意思?我该怎么办?
我试过
DBCC CHECKDB('mydatabase')
但我只收到更多错误消息。
提前致谢!
答案1
正如 Splattne 所说,823 表示存在 I/O 子系统问题。823 消息就是我所说的“硬 I/O 错误”。SQL Server 要求操作系统读取页面,但它拒绝了 - 这意味着 I/O 子系统无法读取相关页面。
CHECKDB 输出意味着它无法创建用于获取数据库事务一致的时间点视图的内部数据库快照。造成这种情况的原因有很多:
- 存储数据库数据文件的卷上可能没有任何可用空间
- SQL 服务帐户可能没有在包含数据库数据文件的目录中创建文件的权限
如果上述情况均不属实,您可以创建自己的数据库快照并在其上运行 DBCC CHECKDB。如果您有数据库快照,请运行以下命令:
DBCC CHECKDB (yourdbname) WITH NO_INFOMSGS, ALL_ERRORMSGS
如果您发布结果,我会为您解释(我为 SQL 2005 编写了 DBCC CHECKDB)
无论结果如何,您要么从备份中恢复,要么将数据提取到新数据库,要么运行修复。每种方法都涉及不同程度的停机时间和数据丢失。您还必须进行一些根本原因分析,以找出导致损坏的原因。
顺便问一下 - 您是否启用了页面校验和?您是否查看过 SQL 错误日志或 Windows 应用程序事件日志,查找 I/O 子系统是否有损坏或出现故障的迹象?
希望这可以帮助。
答案2
哎哟!致命错误 823 表示存在物理磁盘错误。具体来说,SQL Server 请求的页面无法读取。这是一个非常严重的错误,表明该数据库或整个服务器存在重大问题。我希望你有数据库的备份。
我会检查该服务器、系统和应用程序上的事件日志。查看是否存在任何与磁盘相关的错误。数据库上的 CHECKDB 详细信息是什么?
DBCC CheckDB('< Database name >) WITH NO_INFOMSGS.
答案3
我遇到了同样的错误,但这是由于权限造成的。一旦我授予驱动器(即 Windows 驱动器)上的所有权限,它就可以正常工作而没有任何错误。