在 SQL Server 中查找新跟踪标志的方法

Eri*_*ing 39 sql-server trace-flags

那里有很多跟踪标志。有些有据可查,有些没有,还有一些在 2016 版本中找到了默认行为状态的方法。除了官方支持渠道、微软员工等,还有什么方法可以找到新的跟踪标志?

我已经在这里这里阅读了 Aaron Bertrand 最近的几篇文章,但没有发现任何关于新跟踪标志的信息。

我将 mssqlsystemresource 的数据和日志文件复制到一个新位置,并像常规数据库一样附加它以浏览系统表和视图,但没有立即发现任何内容。我考虑过列出已知跟踪标志的列表,并循环遍历不在该列表中的数字,以查看 DBCC TRACEON 允许哪些,但想先在这里提出问题。

假设启用它们的 DBCC 命令必须检查某些资源以确保跟踪标志有效,那么它会到达哪里?是否有包含列表的 .dll 或其他系统文件?

我知道这个问题撒了一个广泛的网络,但促使它阅读的原因是阅读了具有特定预期行为的 Trace Flag 以及 2016 年没有产生所描述效果的新功能。我最初的想法是,也许数字以某种方式转置了,比如 7129 变成了 7219。我希望得到一个范围内的有效跟踪标志列表,比如 7000-7999,以寻找排列。将它们全部作为 DBCC TRACEON 标志和启动参数进行测试,再加上针对功能行为测试结果,将会非常麻烦。

小智 42

除了询问或从帖子/幻灯片/等中获取它们之外,您无法找到列表。该列表仅存在于代码中,位于头文件中,其中有效跟踪标志编号映射到 C++ 代码中大枚举中的名称,然后在其余代码中使用这些名称。

正如 Aaron 所说,您可以启用任何跟踪标志编号,如果它没有做任何事情,或者您不使用跟踪标志相关的功能,您将不会注意到任何行为差异。

DBCC TRACEON 不检查任何内容 - 因为没有哪些数字有效或无效的运行时列表 - 它只是在为该连接/全局设置的标志的位图中启用该跟踪标志编号。

有效性检查的问题在于会暴露哪些跟踪标志是有效的,从而允许它们被发现。这样“有效列表”就被有效地混淆了,这正是 SQL 团队想要的。

关于 Kin 在 SQL Server 应该具有的评论中的建议select * from sys.available_trace_flags- 是和否。有许多跟踪标志对性能非常有害,仅用于在产品支持指导下调试问题时才需要,但 SQL Server 可以列出“安全”标志。

  • 一个小调整 - DBCC TRACEON 确实检查了一些东西。此要点显示了从 1 开始循环遍历跟踪标志的代码。 SQL Server 的所有当前版本都将在最大当前跟踪标志号处爆发并抛出错误:https://gist.github.com/BrentOzar/0e9692da8ceffeb2b4bdd064e36d3174 (2认同)

Pau*_*ite 42

有什么方法可以找到新的跟踪标志?

在大多数情况下,归结为有时间和情感资源来寻找它们。

当然,可以编写一个脚本来循环遍历可能的跟踪标志号并分析其影响,但这并不总是富有成效。造成这种情况的原因有很多,但常见的问题包括以下事实:某些跟踪标志仅在与其他跟踪标志组合使用时才有效,有些仅-T在启动时使用,或与 一起使用时DBCC TRACEON,有些仅与 一起使用OPTION (QUERYTRACEON)。有些需要未记录的命令或命令扩展,或者还需要启用特定功能。有些只有在您知道在哪里寻找这些效果时才会产生效果。等等等等......非常......等等。

也就是说,也许最有效的技术是通过附加调试器或其他分析工具逐步执行特定查询或命令,将所采用的路径与打开和关闭的跟踪标志进行比较。如果这听起来很耗时,那是因为它确实如此。

对我来说,某些事情必须非常有趣,或者与现实世界的问题相关,而没有更好的解决方案让我什至考虑进入它。如果您之前已经经历过此过程数百或数千次,它也很有用,以广泛了解您正在寻找的东西,哪个范围的跟踪标志最有可能有效,以及哪个部分的代码库将是有趣的。

在简单的情况下设置断点CSessionTraceFlags::CheckSessionTraceInternal并检查edx寄存器的值(以查看正在检查哪个跟踪标志)可能很有用,但有趣的情况通常并不简单 - 并且并非所有跟踪标志都在它们的位置检查影响所采用的代码路径。

在 SQL Server 2019 中,在sqllang!GetGlobalTraceFlagStore. 当这个非常短的函数返回时,调用者将把跟踪标志号放在寄存器edx中,然后调用sqllang!get_bit以检查是否设置了标志。

有一个相当小的官方跟踪标志列表。这些是经过全面测试的标志,并且(并将)得到 CSS 以及最终产品开发人员的支持。它们也是具有足够常见用例的标志,值得记录。

您发现的任何其他跟踪标志都是一种好奇心,它可能在各种情况下(不同的版本、SKU、安全设置、不同的功能……您能想到或想不到的任何其他东西)产生意想不到的影响。如果有的话,这些只会得到撰写有关它们的人的“支持”。

有几个非官方列表,我所知道的最好的一个是Aaron Morelli的 SQL Server 标志专题集合(目前在 v6,2016 年 4 月)。

尽管如此,Microsoft CSS 确实(最终)可以访问所有跟踪标志,因此即使它们不在官方列表中,他们也可以就您遇到的任何问题向您提供建议。当然,他们可能会选择什么都不说,而且可能会涉及费用;我真的不知道,我自己从来没有走那条路。


Kon*_*nov 14

我们在 github 上维护了一组跟踪标志(现在有599 个跟踪标志):

Microsoft SQL Server 跟踪标志

此外,Brent Ozar 在他的伟大文章Bad Idea Jeans: Find Undocumented Trace Flags和 Joe Obbish 在这篇很棒的文章A Method to Find Trace Flags 中描述了非常好的技术