SQL 服务器检查数据库 IO 请求超过 15 秒警告

SQL Server Check DB IO requests taking longer than 15 seconds warning

我在 SQL 服务器上执行 CHECKDB 时遇到一些问题。我正在 运行宁 SQL Server 2008 SP4 和 SQL Server 2014 SP2 CU4。 SQL Server 2008 实例使用 SAN 存储,SQL Server 2014 实例仅使用本地存储。

在 CHECKDB 运行ning 期间,我在错误日志中收到如下消息:

SQL Server has encountered 61 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file ...

我知道我的磁盘(本地和 SAN)在吞吐量方面不是最佳的,但不幸的是,这是我在不久的将来必须坚持的设置。此外,吞吐量足以满足我的日常工作量,但 CHECKDB 的时间 运行 事情往往会失控,磁盘会被生成的流量淹没。

CHECKDB 由 Ola Hallengren 的备份解决方案使用

等命令调用

DBCC CHECKDB ([mydb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY

错误日志中的IO警告主要针对tempdb和少数用户数据库文件。

Tempdb 根据 Brent Ozar 的设置清单进行配置:8 个数据文件,每个预生成为相同大小,禁用自动增长。事务日志文件驻留在不同的卷上。到目前为止,我没有使用任何跟踪标志,如 1117 和 1118。

有趣的是,在我最大的数据库在几天内从 100GB 增长到 200GB 之后,我在 SQL 2014 实例上收到了 IO 警告(由于数据被迁移到数据库中......通常的增长率要低得多)。

SQL 2014 上的 IO 警告与 Nagios 监控中的超时一起出现。 这是来自 Nagios 的磁盘吞吐量的屏幕截图:时间 CHECKDB 运行s 总吞吐量(读取和写入)与一段时间内的最大值相同:

这是 physical_only checkdb 上磁盘吞吐量的统计数据:

有趣的是,IO 警告现在已经消失了。此外,Nagios 检查没有进一步的超时。

有什么我可以做的来摆脱警告和 IO overkill 的情况,比如

2014 实例刚得到一个由两个 sata 磁盘组成的本地 RAID 驱动器(由于 blade 服务器),该驱动器为 windows 分区,并具有单独的数据、日志和临时数据库分区。 我知道这违反了对 tempdb、windows、数据和日志使用不同磁盘的最佳实践配置。但不幸的是,目前还没有办法实施这样的解决方案。我可以使用 SAN 进行切换,但不幸的是,这在大多数情况下甚至更慢(配置不当...过时的技术...等)。

您认为 "man get a better IO subsystem and shut up" 是完全可以接受的,但正如我所写,这在短期内是不可能的。因此,能够以另一种方式解决问题将大有帮助。正如我所说,对于我的常规工作负载,当前的 IO 子系统(无论它看起来多么老套)已经完全足够了。

如果您每天和每周(周末 - 非高峰时间)检查一致性,我建议您使用带 physical_only 选项的 DBCC CHECKDB 执行正常的 DBCC CHECKDB,备份应包括 "checksum"选项太。