这是我在 Windows 错误日志中看到的内容:
SQL Server 检测到基于逻辑一致性的 I/O 错误:校验和不正确(预期:0x19fedd20;实际:0x19fed5e3)。它发生在读取文件“D:\mssql\local_repository_pbdiffimport.mdf”中偏移量为 0x00000000dc8000 的数据库 ID 6 中的页面 (1:1764) 期间。SQL Server 错误日志或系统事件日志中的其他消息可能会提供更多详细信息。这是一种严重的错误情况,会威胁数据库的完整性,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素导致;有关更多信息,请参阅 SQL Server 联机丛书。
我跑了
dbcc 检查数据库
它告诉我应该使用选项 REPAIR_ALLOW_DATA_LOSS 进行恢复,所以我最终运行
DBCC CHECKDB (my_db_name,REPAIR_ALLOW_DATA_LOSS) 不带任何信息
但这导致大约 2,000 行数据丢失。我恢复了备份,但现在我担心这种情况会再次发生,因为大约 2 周前我们在同一个数据库中已经遇到一致性问题,但后来它发生在索引中(重新创建索引解决了该问题)。
我们已经检查过这些磁盘 - RAID5 看起来不错,没有错误,并且所有磁盘检查实用程序均未发现任何硬件问题。
这可能是由操作系统(Windows Server 2003)或 MSSQL(MSSQL Server 2005)引起的吗?
答案1
一致性问题可能是由硬件或软件的任何因素造成的。查看 SQL 日志以调查可能导致问题的原因。
我的建议:
- 确保数据库选项 Page_Verify 设置为 CHECKSUM。这会在写入操作发生之前验证所有写入操作,这是 SQL Server 2005 上的默认设置。
- 每天备份或每天多次备份(根据需要)
- 设置维护计划以每天检查数据库的一致性
- 保持你的 Windows Server 和 Sql Server 更新补丁,第三方软件也一样。
- 读 ”有效数据库维护的重要技巧“因为它更详细地解释了我的大部分建议。
我强烈推荐这篇文章,因为它是为了帮助那些不知道如何管理数据库服务器的系统管理员而写的。
答案2
您的系统事件日志中可能报告了硬件事件,您应该对其进行调查。
运行 SQLIOSIM 以对磁盘施加压力 +24 小时。如果 SQLIOSIM 报告错误,您必须联系硬件供应商进行调查。它可能来自磁盘、RAID 阵列、驱动程序。操作系统和 SQL 是最不可能的罪魁祸首。
答案3
绝对不是 SQL Server 问题(嗯,可能性非常非常小)。也不太可能是操作系统问题 - 只是因为垃圾写入太明显了,无法作为错误存在很长时间。
这严重指向硬件。RAM(您使用 ECC 吗?)可能是罪魁祸首,其他类型的相关问题(RAID 控制器?光盘?)也可能是罪魁祸首。