我受到了挑战,因为我们的客户在运行本应在线维护的过程中遇到了不同类型的错误。超时、扫描因数据移动而停止等错误。
我们的一些客户购买了 SQL Server 企业版,以便能够获得重建索引在线功能。
为了重现这些问题,我一直在一个大型数据库上测试 dbcc checkdb,重组和重建索引以及更新统计信息,同时我在一个几乎 1TB 的数据库上使用事务轰炸服务器。
我的第一个测试是使用 maxdop=1 的 checkdb,而 sqlServer 正在处理 124000 个小事务...我从我的应用程序收到超时设置为 5 分钟。研究检查数据库的工作方式,即创建快照,密集使用 tempdb 并创建 nolocks 来创建快照......那么如果我的一个小事务不锁定表,它怎么能被阻止呢?
我的第二个测试是在处理 124000 个事务时重新组织所有索引(也应该是在线的),这次我遇到了死锁......
我的第三个测试是在运行 124000 个事务时使用 maxdop=1 更新所有统计信息。在这种情况下收到的错误是:Could not continue scan with no lock due to data move
我在运行 124000 个事务时在线重建所有索引的第四次测试将很快运行,我将用结果更新我的帖子。
我在可以使用的地方使用的 maxdop=1 是为了消除资源争用。
我已经阅读了多篇文章,其中包括 Paul Randal 对重建索引的在线与离线的解释,并了解其中的区别......但正如我所说,我面临着解释为什么它不是真正在线的挑战,尽管微软声称它是在线的.
任何输入将不胜感激。
我错过了什么
这里有很多问题。不过,我有一种感觉,答案不会让你开心。
DBCC 校验数据库
我不知道我是否将
DBCC CHECKDB
“在线维护”与“在线维护”混为一谈,但它本质上肯定不是离线活动。话虽如此,它仍然可能是资源密集型的,这可能表现为应用程序“不工作”,尽管数据库在技术上仍然在线且可用。这并不表示任何阻塞,特别是因为除非您指定它应该
DBCC CHECKDB
不会导致阻塞。您应该仔细查看监控查询以了解超时的原因可能是什么 -老实说,这可能是很多事情。在线索引构建
是索引重组语句还是其他应用程序语句的死锁?我不记得曾经对我造成过这个问题的重组,但是死锁是生活中的一个事实,应用程序应该能够在遇到它们时优雅地重试。在线操作并不能保证您不会出现死锁。
大多数人将索引维护安排在夜间/周末,以帮助避免与锁定、阻塞和资源争用有关的相关问题。针对正常工作时间的工作负载进行测试必然会给您带来您所看到的问题。
更新统计
这个在你身上(或者更确切地说,应用程序):不要使用
NOLOCK
,你不会得到NOLOCK
相关的错误。同样,我不确定我是否建议在高容量期间更新繁忙系统上的所有统计信息,所以这似乎也是一个注定会出现问题的测试。技术定义
如果你读过这篇文章,那么你就会知道在线并不意味着没有锁。这个词的定义是高度上下文相关的。您可以将需要的任何人指向有关在线重建的文档:
结论
这就是说,无论维护操作是否能够“在线”,大多数人都不会在全部工作负载期间对其进行测试,也不期望它们在正常事务量期间能够正常工作。
大多数时候,即使在维护窗口期间,您也不需要同时重建/重组所有索引或更新所有统计信息。如果您有 VLDB,请将其拆分
DBCC CHECKDB
为不同的窗口(就像 Paul 已经很好地介绍了一样)。我会更多地关注这些事情将如何/何时实际运行。使用像Ola 的维护解决方案这样的东西,这样您就不会让 SQL Server 做更多的工作。
并让您的客户降低他们的期望!
也可以看看