Ещё в первых статьях блога я написал подробное описание «фантомных» записей (ghost records) и процесса их очистки — см. статью «Подробно об очистке фантомных строк». На занятии возник вопрос, который стоит разобрать отдельно: возникают ли «фантомные» записи в кучах (heap)? Ответ — нет, не при обычной работе.
MS SQL Server дело тонкое...
17.10.25
16.10.25
DBCC CHECKDB: проверка целостности крупных баз данных SQL Server
DBCC CHECKDB
— одна из важнейших команд в наборе инструментов администратора SQL Server. Она проверяет логическую и физическую целостность всех объектов базы данных, помогая выявлять повреждения на ранней стадии — до того, как они превратятся в кошмар восстановления.
В современных версиях, таких как SQL Server 2022, проверки «чистоты данных» (data purity) по умолчанию встроены в движок, CHECKDB может выполняться параллельно, использовать снимки (снапшоты) и даже запускаться на репликах. Тем не менее запустить эту команду на крупных базах данных в рамках коротких «окон» обслуживания бывает непросто.
В этом материале разобрано, когда и как эффективно запускать CHECKDB, как использовать подходящие параметры и как грамотно планировать его выполнение как для ежедневной эксплуатации, так и для готовности к аварийному восстановлению.
Способы объединения значений в символьные строки + что привнёс SQL Server 2025
Недавно я искал тему для новой заметки и перечитал «Новые возможности SQL Server 2025 (предварительная версия)». Нашёл вот это:
|| (String concatenation) Concatenate expressions with expression || expression.
Мой интерес, мягко говоря, проснулся. Использование +
для сцепления строк всегда имело свои проблемы, и, как бы мне ни нравилась функция CONCAT
, она немного тяжеловесна по сравнению с полноценным оператором.
Существует также функция
CONCAT_WS
, которая добавляет разделитель в результат, но я не буду о ней говорить в этой статье.
Я пойду к новой возможности «обходными путями», но если хотите пропустить, просто переходите к разделу, где она разобрана.
15.10.25
Исследуем fn_dblog(): недокументированная функция SQL Server для чтения журнала транзакций
SQL Server ведёт детальную запись каждого изменения в журнале транзакций. Обычно вы взаимодействуете с ним косвенно — через резервные копии, репликацию или восстановление. Но существует скрытая, недокументированная функция fn_dblog()
, которая позволяет напрямую запрашивать активный журнал транзакций.
Эта функция может помочь вам:
- Расследовать удаления и изменения данных.
- Отслеживать активность DDL и DML.
- Устранять проблемы вроде случайной потери данных.
- Анализировать поведение репликации и восстановления.
Поскольку функция недокументирована, Microsoft её официально не поддерживает и она может измениться без предупреждения. Тем не менее, для администраторов БД и специалистов по расследованию инцидентов это мощный инструмент.
14.10.25
Структура каталога FILESTREAM
После того как я написал FILESTREAM Whitepaper для Microsoft, мне стали часто задавать вопросы о структуре контейнера данных FILESTREAM. Контейнер данных FILESTREAM — это технический термин для структуры каталогов NTFS, где хранятся все данные FILESTREAM.
Заблуждения вокруг мгновенной инициализации файлов
Каждый раз, когда я веду курс, меня удивляет, сколько администраторов баз данных не знают о мгновенной инициализации файлов (instant file initialization). Не желая повторять публикации, уже написанные другими, кратко: эта возможность позволяет создавать или увеличивать файл «мгновенно», без заполнения нового пространства в файле нулями. Это особенно полезно в сценариях аварийного восстановления, когда перед восстановлением базы данные файлы могут понадобиться впервые — с включённой мгновенной инициализацией исключается лишняя задержка. Подробности см. в записи Кимберли «Instant Initialization – What, Why and How?».
А теперь — к причине появления это статьи: хочу развеять несколько заблуждений, которые продолжаю слышать.
13.10.25
Как Storage Engine находит столбцы переменной длины?
Этот вопрос прозвучал на одном из моих недавних занятий: если массив смещений столбцов переменной длины в записи хранит только смещения, то как механизм хранения находит конкретный столбец переменной длины?
Сомнение возникает потому, что в самой записи нет пометки, какой столбец переменной длины где расположен — как это работает? Ответ состоит из двух частей: это и NULL‑битовая карта (null bitmap) в записи, и метаданные таблицы/индекса, хранящиеся в системных таблицах. Все столбцы переменной длины имеют фиксированную «позицию» внутри переменной части записи в том случае, если их значение не равно NULL. Давайте покажу, что это значит.
Почему буферный пул содержит так много «грязных» страниц tempdb?
Грег задал вопрос по поводу скрипта для анализа содержимого буферного пула (передаю по смыслу): почему на загруженных промышленных системах в буферном пуле оказывается столь высокая доля «грязных» страниц tempdb?
Ответ связан с возможностью восстановления базы tempdb. Одна из причин существования контрольной точки (checkpoint) — ограничить длительность фазы «redo» при восстановлении после сбоя: это этап, когда записи журнала заново «прокручиваются» на находящихся на дисках страницах, для которых модифицированный образ страницы так и не был записан на диск после фиксации транзакций. Для этого в базах данных выполняются автоматические контрольные точки.
Однако tempdb после сбоя не восстанавливается — он заново создаётся. Это означает, что время восстановления tempdb не является проблемой, а значит, нет и необходимости в автоматических контрольных точках. Иными словами, для tempdb срабатывает лишь один триггер автоматической контрольной точки: когда его файл журнала заполняется примерно на 70%.
По этой причине на загруженных системах пользовательские базы будут проходить контрольные точки гораздо чаще, чем tempdb. А на системе, где tempdb тоже используется активно, в буферном пуле в любой момент времени будет заметно больше «грязных» страниц именно из tempdb.
11.10.25
Что находится в буферном пуле?
Это короткая статья, навеянная вопросом из письма (спасибо, Маркос!), и заодно отличный повод показать DMV, о котором я давно хотел написать. А ещё сейчас в Редмонде ужасная погода, так что на улицу не выйти — блогинг послужит стратегией уклонения от работы этим днём :-).
(В пересказе) вопрос таков: Контрольная точка — это процесс, который записывает все «грязные» страницы на диск и работает в разрезе базы данных. Но если кеш данных может хранить страницу из любой базы, как же контрольная точка понимает, какие страницы проверять на «грязность»? Она просматривает буферный пул в поисках страниц конкретной базы X и обрабатывает только их? Или кеш данных как‑то разделён по базам? Хотелось бы лучше понимать, как это устроено «под капотом».
10.10.25
Контроль состояния распределённой группы доступности: T-SQL и Zabbix
После создания распределённой группы доступности по шагам из моей статьи «SQL Server 2022: Распределённая группа доступности без кластера», как проверить, что синхронизация между дата-центрами в порядке?
В SQL Server Management Studio, если щёлкнуть правой кнопкой по распределённой группе доступности, вы заметите, что нет панели мониторинга, подтверждающей корректную синхронизацию данных между дата-центрами:
Даже если проверять панели первичного и вторичного дата-центров по отдельности, вы не увидите, есть ли проблема «между ними».
Повреждения баз данных SQL Server: обнаружение, причины и некоторые подробности о DBCC CHECKDB
Повреждение базы данных в SQL Server бывает редко, но почти всегда имеет серьёзные последствия. Когда оно возникает, под угрозой оказываются требования ACID — фундамент транзакционной целостности — и это может привести к простоям, потере данных и операционным рискам. В этой статье рассматриваются:
- распространённые причины повреждений;
- как «под капотом» работает DBCC CHECKDB;
- рекомендации по настройке производительности при запуске CHECKDB;
- типовые сообщения об ошибках и их смысл;
- лучшие практики предотвращения и восстановления.
Повреждение страницы заголовка файла
Итак, что такое страница заголовка файла? В каждом файле данных самая первая страница 8КБ (то есть страница 0 в файле) отведена для хранения всех метаданных об этом файле. Как и для загрузочной страницы, вы можете посмотреть её содержимое с помощью DBCC PAGE — команда интерпретирует все поля, — либо воспользоваться командой DBCC FILEHEADER, которая делает это ещё удобнее. Эта команда недокументирована и не поддерживается (точно так же, как DBCC DBINFO для просмотра загрузочной страницы базы), но о ней уже писали и говорили в интернете, так что её существование не секрет.