MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Dica da Semana

Monitorando conexões bloqueadas

por Nilton Pinheiro setembro 7, 2004 Nenhum comentário

O que poucos sabem é que a partir do SP3, a Microsoft adicionou três novas colunas na sysprocesses e uma função de sistema chamada fn_get_sql que resolve todos estes problemas e permite saber a linha de código que esta sendo executada no momento do bloqueio.


 


Na dica desta semana estarei demonstrando como a função fn_get_sql pode lhe ajudar na hora de solucionar problemas de bloqueio de conexões.


 


Causando o bloqueio de conexões:


 


Para que eu possa demonstrar como a função fn_get_sql trabalha, precisamos primeiramente simular uma situação de bloqueio de conexões, para isto, abra uma conexão com o QA e crie a procedure abaixo no banco pubs.


 


CREATE PROCEDURE upd_author


AS


BEGIN TRANSACTION


update authors SET state=’SP’


where state = ‘UT’


waitfor delay ’00:01:00′


ROLLBACK TRANSACTION


 


Pegue o ID desta conexão pois precisaremos dele mais tarde:


 


SELECT @@SPID  à 55 para este exemplo


 


Esta procedure faz uma atualização na tabela authors e aguarda por 1 minuto antes de efetuar o Rollback da transação. Com isto, qualquer conexão que consultar os registros afetados ficará bloqueada.


 


Abra uma segunda conexão no QA e escreva o stament abaixo:


 


SELECT * FROM authors where state = ‘UT’


 



Pegue o ID desta conexão pois precisaremos dele mais tarde:


 


SELECT @@SPID  à 54 para este exemplo


 


Volte para a conexão 55 e execute a procedure upd_author, volte para a conexão 54 e execute o statement.


 


Monitorando as conexões:


 


Abra uma nova conexão no QA e execute a sp_who, podemos ver aqui que a conexão 54 esta sendo bloqueada pela conexão 55.


 


spid   ecid   status   loginame hostname blk  dbname cmd  
—— —— ——– ——– ——– —- —— ——
54     0      sleeping sa       WINXPPRO 55   pubs   SELECT
55     0      sleeping sa       WINXPPRO 0    pubs   WAITFOR
56     0      runnable sa       WINXPPRO 0    master SELECT


 


Neste ponto sempre nos perguntamos: O que será que a conexão 55 está executando para ter bloqueado a conexão 54? Para responder a esta pergunta normalmente utilizamos o DBCC INPUTBUFFER, o qual neste caso nos trará o seguinte resultado:


 



EventType      Parameters EventInfo   


————– ———- ————


Language Event 0          upd_author


 


Como podemos ver, o DBCC INPUTBUFFER nos mostra apenas a procedure sendo executada pela conexão 55. Não seria interessante se pudéssemos saber exatamente o código sendo executado dentro da procedure upd_author? É aí que entra a função de sistema fn_get_sql adicionada pelo SP3 do SQL Server.


 


Para ver como funciona esta função, crie no database master a procedure sp_usrinputbuffer (código completo) e na mesma conexão onde foi executado o DBCC INPUTBUFFER, execute o statement abaixo:


 


dbcc inputbuffer (55)


go


sp_usrinputbuffer 55


 


Obs: Pode ser preciso executar as conexões 55 e 54 novamente.


 


Temos como resultado:


 


EventType      Parameters EventInfo   


————– ———- ————


Language Event 0          upd_author


 


(1 row(s) affected)


 


DBCC execution completed. If DBCC printed error messages, contact your system administrator.


********STATEMENT SENDO EXECUTADO NO MOMENTO ************


 


waitfor delay ’00:01:00′


 


Aqui podemos ver que enquanto o DBCC INPUTBUFFER me retorna apenas o nome da procedure sendo executada, a sp_usrinputbuffer retorna o statement sendo executado pela procedure no exato momento do bloqueio.


 


Assim, podemos concluir que o bloqueio esta ocorrendo devido ao delay de 1 minuto da procedure upd_author. Se tirarmos este delay, o problema de bloqueio será resolvido.


 


Para saber mais sobre a função fn_get_sql, consulte o artigo Microsot KB 325607 – FIX: The fn_get_sql Function Returns SQL Text for Handle in the Sysprocesses System Table


 


 

Avaliação:
Compartilhe:
  • Anterior Semana Service Pack 2 do Windows XP21 anos atrás
  • Próximo Pacote de instalação em rede do Windows XP SP221 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2026 MCDBA Brasil.