IT SERVICES - Performance/Lentidão/Travamentos - Qual comando pode ser utilizado para localizar Locks em base de dados Microsoft SQLServer
Dúvida
Qual comando pode ser utilizado para localizar Locks em base de dados Microsoft SQLServer?
Solução
Importante
O comando descrito abaixo é um exemplo de comando utilizado para coleta de Locks na base de dados (em tempo real) pela equipe de DBAs da Senior.
A responsabilidade de execução deste comando é do DBA da sua empresa. Ele também poderá utilizar outros comandos para coleta dessa informação.
1. Para localizar locks em base de dados Microsoft SQLServer o seu DBA poderá utilizar o comando abaixo:
WITH NIVEL(SPID,BLOCKED,SEGUNDOS,LASTWAITTYPE,CONSULTA,NIVEL)
AS
(
SELECT P.SPID
, P.BLOCKED
, P.WAITTIME / 1000 SEGUNDOS
, P.LASTWAITTYPE
, S.TEXT CONSULTA
, 1 AS NIVEL
FROM SYS.SYSPROCESSES P
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(P.SQL_HANDLE) S
WHERE P.BLOCKED = 0
AND P.SPID IN (SELECT BLOCKED FROM SYS.SYSPROCESSES)
UNION ALL
SELECT P.SPID
, P.BLOCKED
, P.WAITTIME / 1000 SEGUNDOS
, P.LASTWAITTYPE
, S.TEXT CONSULTA
, N.NIVEL + 1 AS NIVEL
FROM SYS.SYSPROCESSES P
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(P.SQL_HANDLE) S
INNER JOIN NIVEL N ON P.BLOCKED = N.SPID
)
SELECT REPLICATE(' - ', NIVEL) + CAST(SPID AS VARCHAR(50)) AS "NIVEL",SPID,BLOCKED,SEGUNDOS,LASTWAITTYPE,CONSULTA FROM NIVEL
2. Para localizar locks em base de dados Microsoft SQLServer e já verificar o usuário do ERP e o PID da instância que está vinculada aos Locks, o seu DBA poderá utilizar o comando abaixo:
WITH NIVEL(SPID,BLOCKED,DBID,HOSTNAME,HOSTPROCESS,SEGUNDOS,LASTWAITTYPE,WAITRESOURCE,CONSULTA,NIVEL)
AS
(
SELECT P.SPID
, P.BLOCKED
, P.DBID
, P.HOSTNAME
, P.HOSTPROCESS
, P.WAITTIME / 1000 SEGUNDOS
, P.LASTWAITTYPE
, P.WAITRESOURCE
, S.TEXT CONSULTERA
, 1 AS NIVEL
FROM SYS.SYSPROCESSES P
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(P.SQL_HANDLE) S
WHERE P.BLOCKED = 0
AND P.SPID IN (SELECT BLOCKED FROM SYS.SYSPROCESSES)
UNION ALL
SELECT P.SPID
, P.BLOCKED
, P.DBID
, P.HOSTNAME
, P.HOSTPROCESS
, P.WAITTIME / 1000 SEGUNDOS
, P.LASTWAITTYPE
, P.WAITRESOURCE
, S.TEXT CONSULTA
, N.NIVEL + 1 AS NIVEL
FROM SYS.SYSPROCESSES P
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(P.SQL_HANDLE) S
INNER JOIN NIVEL N ON P.BLOCKED = N.SPID
)
SELECT REPLICATE(' - ', N.NIVEL) + CAST(N.SPID AS VARCHAR(50)) AS "NIVEL",N.SPID,N.BLOCKED,N.DBID,N.HOSTNAME,N.HOSTPROCESS,SEC.APPNAM,SEC.USRNAM,SEC.APPUSR,N.SEGUNDOS,N.LASTWAITTYPE,N.WAITRESOURCE,N.CONSULTA FROM NIVEL N
LEFT JOIN R911SEC SEC ON N.SPID = SEC.NUMSEC;
Exemplo de resultado do comando acima:
No exemplo acima:
- Hostname: é o nome da máquina/Servidor onde está rodando o processo envolvido no lock;
- HostProcess: é o número do PID da instância do aplicativo/sistema que está envolvido no lock;
- AppNam: é o nome do aplicativo (executável/EXE) que está envolvido no lock;
- UsrNam: é o nome do usuário do sistema operacional (SO) que está instanciando o aplicativo executável. Tome cuidado, pois não é o nome do usuário logado no sistema Senior (veja informações sobre o campo AppUsr em seguida);
- AppUsr: é o nome do usuário do sistema Senior.
Observação
Para mais informações sobre o questões relacionadas a Performance/Lentidão/Travamentos do Gestão Empresarial | ERP, consulte o artigo ERP - Performance/Lentidão/Travamentos - Onde é possível encontrar informações diversas sobre questões relacionadas a Performance/Lentidão/Travamentos (índice).