CORREÇÃO: Desempenho lento ou deadlock quando você restaura um banco de dados e executar instruções ao mesmo tempo no SQL Server 2012

Traduções deste artigo Traduções deste artigo
ID do artigo: 2725950 - Exibir os produtos aos quais esse artigo se aplica.
A Microsoft distribui correções do Microsoft SQL Server 2012 como um arquivo para download. Como as correções são cumulativas, cada versão nova contém todos os hotfixes e correções de segurança que foram incluídas com o 2012 de SQL Server anteriores corrigir lançamento.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Cenário 1

Considere o seguinte cenário:
  • Restaurar um banco de dados no Microsoft SQL Server 2012.
  • Antes de terminar a operação de restauração de banco de dados, outro processo faz referência a exibição de catálogo de sys.database_recovery_status e requer um bloqueio no mesmo banco de dados. Por exemplo, você execute a seguinte instrução Selecionar :

    SELECT * FROM sys.database_recovery_status
Nesse cenário, o desempenho lento ocorre em que um processo para a instrução SELECT aguarda até que o processo de restauração de banco de dados for concluído.

Cenário 2

Considere o seguinte cenário:
  • Restaurar um banco de dados no SQL Server 2012.
  • Antes de terminar a operação de restauração de banco de dados, execute a seguinte instrução:

    IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id= DataBaseID AND database_guid IS NOT NULL)
    Observação O DataBaseID representa a ID do banco de dados em que você executa a operação de restauração de banco de dados.
Nesse cenário, um deadlock ocorre no processo de restauração de banco de dados. Esse bloqueio faz com que o processo de restauração de banco de dados falhar.

Causa

Os dois cenários que são descritos na seção "Sintomas" são causados pelo mesmas causas.

Na seção "Scenario1", o problema ocorre porque o processo de restauração de banco de dados requer um bloqueio exclusivo no banco de dados. Quando você executar a instrução que é mencionada nesta seção, é necessário um bloqueio compartilhado no mesmo banco de dados. Portanto, o bloqueio compartilhado aguarda o bloqueio exclusivo até que o bloqueio exclusivo seja liberado.

Na seção "Cenário 2", quando você executa a instrução que é mencionada nesta seção, um bloqueio compartilhado é necessário no mesmo banco de dados e na tabela sys.sysdbreg . A última fase do processo de restauração de banco de dados, o processo requer um bloqueio de atualização na tabela sys.sysdbreg . No entanto, o bloqueio compartilhado não será liberado do banco de dados. Portanto, um deadlock ocorre na tabela sys.sysdbreg , e o processo de restauração de banco de dados é determinado para ser a vítima de deadlock.

Resolução

Informações da atualização cumulativa

Pacote de atualizações cumulativas 1 para SQL Server 2012 Service Pack 1

A correção para esse problema foi lançada pela primeira vez na atualização cumulativa 1. Para obter mais informações sobre como obter esse pacote de atualizações cumulativas para o SQL Server 2012 Service Pack 1, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
2765331 Pacote de atualizações cumulativas 1 para SQL Server 2012 Service Pack 1
Observação Como as compilações são cumulativas, cada novo lançamento de correções contém todos os hotfixes e correções de segurança que foram incluídas com o 2012 de SQL Server anteriores corrigir lançamento. Recomendamos que você considere a aplicação a versão mais recente da correção que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
2772858 O SQL Server 2012 compilações que foram lançadas após o lançamento do SQL Server 2012 Service Pack 1

Pacote de atualizações cumulativas 3 para SQL Server 2012

A correção para esse problema foi lançada pela primeira vez na atualização cumulativa 3. Para obter mais informações sobre como obter esse pacote de atualização cumulativa para SQL Server 2012, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
2723749 Atualização cumulativa 3 para SQL Server 2012
Observação Como as compilações são cumulativas, cada novo lançamento de correções contém todos os hotfixes e correções de segurança que foram incluídas com o 2012 de SQL Server anteriores corrigir lançamento. Recomendamos que você considere a aplicação a versão mais recente da correção que contém esse hotfix. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
2692828 O SQL Server 2012 compilações disponibilizadas após o lançamento do SQL Server 2012

Situação

A Microsoft confirmou que este é um problema nos produtos Microsoft que estão listados na seção "Aplica-se a".

Como Contornar

Para contornar o problema no cenário 2, use um dos seguintes métodos.
Método 1


Modificar a instrução para evitar o bloqueio compartilhado na tabela sys.sysdbreg usando a dica "NOLOCK".
IF EXISTS (SELECT * FROM sys.database_recovery_status with(NOLOCK) WHERE database_id= DataBaseID AND database_guid IS NOT NULL)
Método 2
Definir a prioridade de deadlock da instrução para "Baixa".
SET DEADLOCK_PRIORITY LOW
IF EXISTS(SELECT * FROM sys.database_recovery_status where database_id = DataBaseID AND database_guid IS NOT NULL)
Observação Quando você usa o segundo método para evitar o deadlock na instrução e no processo de restauração de banco de dados, os códigos na instrução IF não serão executados.

Referências

Para obter mais informações sobre bloqueio exclusivo, bloqueio compartilhado e bloqueio de atualização, vá para o seguinte site da Web MSDN:
Informações gerais sobre os modos de bloqueio
Para obter mais informações sobre o modelo de serviços incrementais para SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
935897 Um modelo de serviços incrementais está disponível da equipe do SQL Server para fornecer hotfixes para problemas relatados
Para obter mais informações sobre o esquema para nomeação para atualizações do SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
822499 Esquema para nomeação para pacotes de atualização de software do Microsoft SQL Server
Para obter mais informações sobre a terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
824684 Descrição da terminologia padrão usada para descrever as atualizações de software

Propriedades

ID do artigo: 2725950 - Última revisão: terça-feira, 20 de novembro de 2012 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbtshoot kbqfe kbfix kbsurveynew kbexpertiseadvanced kbmt KB2725950 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 2725950

Submeter comentários

 

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