Методы поиска новых флагов трассировки в SQL Server

38

Там много трассирующих флагов. Некоторые из них хорошо документированы, некоторые нет, а другие нашли свой способ поведения по умолчанию в выпуске 2016 года. Помимо официальных каналов поддержки, сотрудников Microsoft и т. Д., Как найти новые флаги трассировки?

Я прочитал пару недавних постов Аарона Бертрана здесь и здесь , но ничего не заметил о новых флагах трассировки.

Я скопировал данные и файл журнала mssqlsystemresource в новое место и прикрепил его как обычную базу данных для просмотра системных таблиц и представлений, но сразу ничего не обнаружил. Я подумал о том, чтобы взять список известных флагов трассировки и перебрать числа, которых нет в этом списке, чтобы посмотреть, какие из них разрешит DBCC TRACEON, но сначала хотел задать вопрос здесь.

Предполагая, что команда DBCC, чтобы включить их, должна проверить с некоторым ресурсом, чтобы удостовериться, что Флаг Трассировки действителен, куда он обращается? Есть ли .dll или какой-то другой системный файл, который содержит список?

Я знаю, что вопрос затрагивает широкую сеть, но то, что подстегнуло это, это чтение о флаге трассировки с определенным предполагаемым поведением наряду с новой функцией в 2016 году, которая не имела описанного эффекта. Первоначально я думал, что, возможно, числа были каким-то образом транспонированы, например, 7129 становится 7219. Я надеялся получить список допустимых флагов трассировки в диапазоне, скажем, 7000-7999, для поиска перестановок. Тестирование их всех, как флагов DBCC TRACEON, так и параметров запуска, было бы довольно неприятно, в сочетании с тестированием результатов по поведению функции.

Эрик Дарлинг
источник

Ответы:

42

Вы ничего не можете сделать, чтобы найти список, кроме как спросить или забрать их из записей / слайдов / и т.д. Список существует только в коде, в заголовочном файле, где действительные номера флагов трассировки сопоставляются с именами в большом перечислении в коде C ++, а затем имена используются в остальной части кода.

Как сказал Аарон, вы можете включить любой номер флага трассировки, и если он ничего не делает или вы не используете функциональность, к которой относится флаг трассировки, вы не заметите никакой разницы в поведении.

DBCC TRACEON ничего не проверяет - так как нет списка времени выполнения, какие числа являются действительными или нет - он просто включает этот номер флага трассировки в битовой карте того, какие флаги установлены для этого соединения / глобально.

Проблема с проверкой достоверности состоит в том, что она показывает, какие флаги трассировки являются действительными, и позволяет их обнаруживать. Таким образом, «действительный список» эффективно запутывается, чего и хочет команда SQL.

Относительно предложения Кина в комментарии, что SQL Server должен иметь select * from sys.available_trace_flags- да и нет. Существует много флагов трассировки, которые сильно влияют на производительность и необходимы только для устранения неполадок под руководством службы поддержки, но SQL Server может перечислить «безопасные» флаги.

Пол С. Рэндал
источник
2
Один незначительный трюк - DBCC TRACEON действительно что-то проверяет. В этом гистограмме показан код, который перебирает флаги трассировки, начиная с 1. Все текущие версии SQL Server будут работать с ошибкой при максимальном текущем номере флага трассировки: gist.github.com/BrentOzar/0e9692da8ceffeb2b4bdd064e36d3174
Brent Ozar
41

Как найти новые флаги трассировки?

По большей части, это сводится к тому, чтобы тратить время и эмоциональные ресурсы на их поиск.

Конечно, можно написать скрипт для циклического прохождения возможных номеров флагов трассировки и анализа эффектов, но это не всегда плодотворно. Для этого есть много причин, но к общим разочарованиям относится тот факт, что некоторые флаги трассировки эффективны только в сочетании с другими, некоторые работают только -Tпри запуске или при использовании DBCC TRACEONтолько с некоторыми OPTION (QUERYTRACEON). Некоторые требуют недокументированных команд, или расширений команд, или для включения определенной функции. Некоторые из них производят эффекты, только если вы знаете, где искать эти эффекты. И так далее , и ... очень много ... так далее.

Тем не менее, возможно, наиболее эффективным методом является пошаговое выполнение конкретного запроса или команды с подключенным отладчиком или другим инструментом профилирования, сравнивая пути, взятые с включенным и выключенным флагом (ами) трассировки. Если это звучит много времени, это потому, что это так.

Для меня что-то должно быть потенциально очень интересным или иметь отношение к реальной проблеме без лучшего решения для меня, чтобы даже подумать о том, чтобы войти в него. Также полезно, если вы проходили этот процесс сотни или тысячи раз прежде, чтобы получить общее представление о том, что вы ищете, какой диапазон флагов трассировки наиболее вероятен и какая часть кодовой базы будет интересно.

Установка точки останова CSessionTraceFlags::CheckSessionTraceInternalи проверка значения edxрегистра (чтобы увидеть, какой флаг трассировки проверяется) могут быть полезны в простых случаях, но интересные случаи не всегда просты - и не все флаги трассировки проверяются в точке, где они влияют на путь к коду

Существует довольно небольшой список официальных флагов трассировки . Это флаги, которые были полностью протестированы и поддерживаются (и будут поддерживаться) CSS и, в конечном счете, разработчиками продукта. Это также флаги с достаточно распространенным сценарием использования, который стоит документировать.

Любой другой найденный вами флаг трассировки - это любопытство, которое может иметь неожиданные последствия в различных ситуациях (разные сборки, SKU, настройки безопасности, разные функции ... все, что вы можете или не можете придумать). Они будут «поддерживаться» только тем, кто писал о них, если вообще будет.

Есть несколько неофициальных списков, лучший из известных мне - «Актуальная коллекция флагов SQL Server » Аарона Морелли (в настоящее время на v6, апрель 2016 г.).

Все это говорит о том, что Microsoft CSS (в конечном итоге) имеет доступ ко всем флагам трассировки, поэтому они могут проконсультировать вас по любому, с чем вы столкнетесь, даже если их нет в официальном списке. Конечно, они могут предпочесть ничего не говорить, и, возможно, за это будет взиматься плата; Я действительно не знаю, никогда не проходил этот путь сам.

Пол Уайт говорит, что GoFundMonica
источник
14

Мы поддерживаем коллекцию флагов трассировки на github (теперь 599 флагов трассировки):

Флаги трассировки Microsoft SQL Server

Кроме того, очень хорошая техника описана Брентом Озаром в его замечательной статье « Плохая идея джинсов: поиск недокументированных трассирующих флагов» и Джо Оббиша в этой замечательной статье «Метод поиска трассирующих флагов».

Константин Таранов
источник