Tag Archives: sql server 2012

Повреждение данных в SQL Server 2012 и 2014 при перестроении индексов в режиме online

Всегда, когда заходит речь о причинах повреждения данных в SQL Server, я называю программные ошибки в операционной системе и самом продукте. К счастью, это крайне редкий случай, но всем людям свойственно ошибаться, а SQL Server тоже пишут люди. Один их таких случаев произошел совсем недавно и затрагивает новые версии продуктов: SQL Server 2012 и 2014. Если кратко, то при онлайн перестроении индексов в вышеуказанных продуктов может возникнуть повреждение индексов или потеря данных, если при этом параллельно выполняются запросы на изменение большого количества строк и в определенном порядке возникает ошибка взаимоблокировки и фатальная ошибка, такая как «lock timeout». Проблема довольно серьезная, поэтому стоит обратить на нее очень пристальное внимание и установить вышедшие обновления. Дополнительно описание и ссылку на скачивание исправлений можно получить по нижеуказанной ссылке. Исправление доступно только для SQL Server 2012 SP1 и SP2, а также SQL Server 2014. Для SQL Server 2012 RTM его нет и не предвидится. FIX: Data corruption occurs in clustered index when you run online index rebuild in SQL Server 2012 or SQL Server 2014 Стоит обратить особое внимание на то, что недавно вышедший SP2 для SQL Server 2012 не содержит указанного исправления. Поэтому, если вы придерживаетесь политики ставить только сервис паки и игнорируете кумулятивные обновления или установку отдельных исправлений, то у вас могут возникнуть большие проблемы. На мой взгляд, ситуация, когда организации переходят на новые версии продукта тогда, когда становится доступен только первый или второй сервис пак не оправдана. Да, я согласен с тем, что не стоит бросаться сломя голову и обновлять ваш сервер, как только вышла новая версия продукта, но и ждать так долго тоже не имеет смысла. Сейчас мир меняется очень быстро, и релиз циклы начинают уменьшаться, что мы все отчетливо можем наблюдать эту тенденцию на примере версий 2012 и 2014. Второй сервис пак для SQL Server 2012 вышел уже после официального выхода SQL Server 2014, а третий, я боюсь, уже не будет выпущен. Но немного вернемся к основной проблеме. Как проверить, что на ваш SQL Server установлены все необходимые исправления? Для этого выполните команду select @@version на вашем сервере и результат сверьте с нижеприведенной таблицей:

SQL Server 2012 RTM Для указанной версии обновлений недоступно. Рекомендуется установить первый или второй сервис пак, а потом исправление KB #2969896.
SQL Server 2012 SP1 В случае, если версия ниже 11.0.3437, то установите исправление KB #2969896.
SQL Server 2012 SP2 В случае, если версия ниже 11.0.5522, то установите исправление KB #2969896.
SQL Server 2014 RTM В случае, если версия ниже 12.0.2370, то установите исправление KB #2969896или второй накопительный пакет исправлений KB # 2967546.

В случае, если вы по каким-то причинам сейчас не можете установить обновления, например, вам необходимо провести полный цикл его тестирования внутри компании, то можно временно использовать следующие обходные пути:

  • Вы можете временно отключить перестроение индексов совсем.
  • Вы можете установить опцию max degree of parallelism на уровне сервера в значение 1, но учтите, что это может негативно сказаться на производительности остальных запросов.
  • Вы можете добавить опцию WITH (MAXDOP = 1) ко всем командам перестроения индексов. В случае, если вы используете стандартные Maintenance Plans, то в них нет возможности указать, что перестроение индексов необходимо делать в однопоточном режиме. Если вы используете какие-либо еще утилиты для перестроения индексов, то уточняйте возможность перестроения в однопоточном режиме в их документации.

Что нового в SQL Server 2012 SP1

Сегодня компания Microsoft на основном докладе конференции PASS анонсировала первый пакет обновления для SQL Server 2012 (Service Pack 1). Он уже доступен для скачивания по указанной ссылке. Я постараюсь кратко описать, что же нового в нем появилось и показать пару примеров.

Межкластерная миграция для AlwaysOn Availability Groups

В SQL Server 2012 SP1 появляется возможность миграции одной или нескольких AlwaysOn Availability Groups на новый экземпляр кластера Windows Server Failover Clustering (WSFC). Это значительно облегчит обновление существующего кластера на Windows Server 2012 благодаря уменьшению времени простоя.

Selective XML Index

Появляется новый тип индексов, так называемый Selective XML Index. Он позволяет индексировать не все содержимое столбца типа XML, а только необходимые его части, что уменьшает размер XML индексов и положительно сказывается на скорости запросов. Я думаю, что до конца этой недели опубликую отдельную статью, посвященную этой функции.

DBCC SHOW_STATISTICS работает с правами SELECT

В предыдущих версиях SQL Server необходимо было обладать правами администратора или владельца объекта, чтобы просматривать результаты с помощью DBCC SHOW_STATISTICS. Данное ограничение очень сильно влияло, если мы использовали распределенные запросы, т.к. пользователи не имеют административных прав на удаленные объекты. Соответственно отсутствие информации о статистиках на удаленных объектах приводит к построению оптимизатором менее оптимальных планов запросов. В SQL Server 2012 SP1 теперь достаточно прав SELECT на таблицу целиком или на отдельные столбцы, чтобы посмотреть статистики для них. Для тех, кто использует распределенные запросы и может столкнуться с какими-либо проблемами введен флаг трассировки (trace flag) 9485, чтобы вернуть поведение новой функциональности до увроня SQL Server 2012 RTM. Хочу привести сразу пример результатов. Слева план запроса, который использует в качестве удаленного источника SQL Server 2012 RTM, а справа SQL Server 2012 SP1. Как мы видим – статистка начала использоваться.

Новая функция для просмотра статистики

Новая динамическая функция sys.dm_db_stats_properties возвращает информацию о статистиках для указанной таблицы или индексированного представления. Вы можете использовать эту функцию для просмотра тако информации как время последнего обновления статистики, количество строк, которое было использовано для построения статистики, а также количество изменений произошедших в столбце, что раньше было доступно только через недокументированные системные таблицы. Кстати, функция стала также доступна и в SQL Server 2008 R2 SP2. Привожу пример результатов работы данной функции:

Полная версия SQL Server Management Studio в редакциях Express

Теперь с редакциями Express поставляется полнофункциональная версия SQL Server Management Studio.

Поддержка SQL Server Management Objects для управления Resource Governor

В SQL Server 2012 SP1, SQL Server Management Objects обновлены и поддерживают синтаксис команды CREATE RESOURCE POOL (Transact-SQL):

  • CAP_CPU_PERCENT
  • AFFINITY SCHEDULER
  • AFFINITY NUMANODE

Следующие объекты SMO можно использовать для ограничения использования CPUи привязки ресурсных пулов к scheduler’ам и NUMA нодам:

Также появилось несколько улучшений в инструментах бизнес анализа, но так как я к бизнес анализу имею достаточно поверхностное отношение, то не буду о них рассказывать. Я думаю, вы при желании без труда найдете о них информацию. Как мы видим SQL Server 2012 SP1 это не просто пакет обновлений и исправлений, он вносит новый достаточно интересный функционал в существующую платформу.