Исправление: Низкая производительность или взаимоблокировки при восстановлении базы данных и выполнять инструкции, в то же время в SQL Server 2012

Переводы статьи Переводы статьи
Код статьи: 2725950 - Vizualiza?i produsele pentru care se aplic? acest articol.
Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2012 как один загружаемый файл. Так как исправления являются накопительными, каждый новый выпуск содержит все исправления и исправить все исправления, входившие в состав предыдущих 2012 SQL Server выпуска.
Развернуть все | Свернуть все

В этой статье

Проблема

Сценарий 1

Рассмотрим следующий сценарий:
  • Восстановление базы данных в Microsoft SQL Server 2012.
  • До завершения операции восстановления базы данных другой процесс ссылается на представление каталога sys.database_recovery_status и требует блокировки на той же базе данных. Например выполнение следующей инструкции SELECT :

    SELECT * FROM sys.database_recovery_status
В этом случае снижение производительности происходит ожидает процесс для инструкции SELECT , пока завершится процесс восстановления базы данных.

Сценарий 2

Рассмотрим следующий сценарий:
  • Восстановление базы данных в SQL Server 2012.
  • До завершения операции восстановления базы данных, выполните следующую инструкцию:

    IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id= DataBaseID AND database_guid IS NOT NULL)
    Примечание В DataBaseID Представляет идентификатор базы данных, на котором выполняется операция восстановления базы данных.
В этом случае Взаимоблокировка возникает в процессе восстановления базы данных. Этой взаимоблокировки вызывает сбой процесса восстановления базы данных.

Причина

Два сценария, которые описаны в разделе «Проблема» вызываются одной причины.

В разделе «Scenario1» эта проблема возникает, так как процесс восстановления базы данных требует монопольной блокировки базы данных. При выполнении оператора, описанное в этом разделе, требуется разделяемую блокировку на той же базе данных. Таким образом общая блокировка ожидает монопольную блокировку до снятия монопольной блокировки.

В разделе «Вариант 2» при выполнении оператора, описанное в этом разделе разделяемую блокировку является обязательным, как в той же базе данных, так и в таблице sys.sysdbreg . Последний этап процесса восстановления базы данных процесс требуется блокировка обновления в таблице sys.sysdbreg . Тем не менее общая блокировка не удаляется из базы данных. Таким образом взаимоблокировки в таблице sys.sysdbreg , и процесс восстановления базы данных определяется как жертвы.

Решение

Накопительное обновление информации

Накопительный пакет обновления 1 для SQL Server 2012 Пакет обновления 1

Исправление этой проблемы сначала было выпущено в накопительное обновление 1. Дополнительные сведения о том, как получить этот накопительный пакет обновления для SQL Server 2012 Пакет обновления 1 щелкните следующий номер статьи базы знаний Майкрософт:
2765331 Накопительный пакет обновления 1 для SQL Server 2012 Пакет обновления 1
Примечание Поскольку построения являются накопительными, каждый новый выпуск исправление содержит все исправления и выпуска исправления исправления, входившие в состав предыдущих 2012 SQL Server. Мы рекомендуем рассмотреть применение последний выпуск исправления, содержащего это исправление. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
2772858 2012 SQL Server формирует, вышедшие после выпуска SQL Server 2012 Пакет обновления 1

Накопительный пакет обновления 3 для SQL Server 2012

Исправление этой уязвимости первого выпуска накопительного обновления 3. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2012 щелкните следующий номер статьи базы знаний Майкрософт:
2723749 Накопительного обновления 3 для SQL Server 2012
Примечание Поскольку построения являются накопительными, каждый новый выпуск исправление содержит все исправления и выпуска исправления исправления, входившие в состав предыдущих 2012 SQL Server. Мы рекомендуем рассмотреть применение последний выпуск исправления, содержащего это исправление. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
2692828 2012 SQL Server формирует, вышедшие после выпуска SQL Server 2012

Статус

Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в разделе «Информация в данной статье применима к:».

Временное решение

Для решения этой проблемы в сценарии 2, воспользуйтесь одним из следующих способов.
Способ 1


Измените оператор, чтобы избежать разделяемую блокировку на таблицу sys.sysdbreg с помощью подсказки "NOLOCK".
IF EXISTS (SELECT * FROM sys.database_recovery_status with(NOLOCK) WHERE database_id= DataBaseID AND database_guid IS NOT NULL)
Способ 2
Установить приоритет взаимоблокировки оператора «Низкий».
SET DEADLOCK_PRIORITY LOW
IF EXISTS(SELECT * FROM sys.database_recovery_status where database_id = DataBaseID AND database_guid IS NOT NULL)
Примечание При использовании второго метода во избежание взаимоблокировки в инструкции и в процессе восстановления базы данных, коды в операторе IF не выполняется.

Ссылки

Дополнительные сведения о монопольной блокировки, разделяемую блокировку и блокировка обновления перейдите на следующий веб-узел MSDN:
Общие сведения о режимах блокировки
О добавочных модель обслуживания для SQL Server щелкните следующий номер статьи базы знаний Майкрософт:
935897 Последовательный модели обслуживания доступна команда SQL Server для предоставления исправления для возникающих ошибок
Для получения дополнительных сведений о схеме именования для обновления SQL Server щелкните следующий номер статьи базы знаний Майкрософт:
822499 Схема присвоения имен пакетам обновлений программного обеспечения Microsoft SQL Server
Дополнительные сведения о терминах, используемых при описании обновлений программного обеспечения, см. в следующей статье базы знаний Майкрософт:
824684 Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт

Свойства

Код статьи: 2725950 - Последний отзыв: 20 ноября 2012 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Enterprise
  • Microsoft SQL Server 2012 Express
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
Ключевые слова: 
kbtshoot kbqfe kbfix kbsurveynew kbexpertiseadvanced kbmt KB2725950 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: 2725950

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com