Error de "tiempo de espera de solicitud de bloqueo excedido" al intentar ver jerarquías de base de datos

17

Estoy teniendo problemas con una base de datos.

  1. Puedo ejecutar consultas básicas, aunque mucho más lento de lo normal.

  2. Cuando intento ver los árboles de jerarquía para tablas, vistas o procedimientos en el Explorador de objetos SSMS, obtengo lock request time out period exceeded.

  3. Mis informes SSRS que se ejecutan en objetos en esta base de datos ya no se están completando.

  4. Los trabajos asociados con los procedimientos almacenados en esta base de datos tampoco se ejecutan.

Intenté usar sp_who2para encontrar y eliminar todas las conexiones en la base de datos, sin embargo, esto no ha resuelto el problema.

¿Que esta pasando aqui? ¿Cómo puedo resolver esto?

Lloyd Banks
fuente
Ver también: stackoverflow.com/questions/12167570/… ; No estoy seguro si eso cuenta como un duplicado o no.
LittleBobbyTables
Según su comentario a mi respuesta a continuación, creo que debe proporcionar mucha más información. ¿Cómo se dimensiona el servidor? ¿Has visto sus contadores de rendimiento? ¿Se está intercambiando en disco o de alguna otra forma? Asegúrese de verificar realmente lo anterior y no simplemente asumir cualquier cosa. Además, ¿esto sucede cuando te conectas mientras estás en el escritorio? ¿El problema solo ocurre cuando se accede desde una única ubicación? ¿Cuál es el clima de la red para ese servidor (y su conexión a él)?
NotMe
3
Parece que tiene transacciones abiertas que bloquean el acceso de lectura a las tablas.
a_horse_with_no_name

Respuestas:

11

Fue causado por una reversión perpetua de una transacción. Finalmente tuve que reiniciar mi clúster de servidores

Lloyd Banks
fuente
2
Reiniciar el servicio lo resolvió para mí.
HerrimanCoder
Reinicio en tal situación que puede conducir a la base de datos de recuperación
MaazKhan47
dbcc opentran le dirá si hay transacciones abiertas
Nate Anderson
Me resulta extraño que, mientras se ejecuta una transacción, no puedo expandir la sección de tablas, por ejemplo. Sin datos leídos, sin DDL, nada, solo la lista de tablas.
gerleim
5

Excluyendo la consideración de Harware, tal vez necesite ejecutar el script para verificar cuáles son las actividades que retienen la Sesión SQL, uno de los escenarios comunes es no usar un Implicit transactions Optionen SQL Server Management Studio.

Rodaballo
fuente
Hola rodaballo, ¿puedes entrar en más detalles sobre lo que estás sugiriendo?
Parece que si bien esto no se explica por completo, podría ser una mejor respuesta, la reversión perpetua de transacciones que no se revierten, y que solo están habilitadas debido a transacciones implícitas.
ConstantineK
Mirando hacia atrás la pregunta que no pude decir, debe ser la reversión perpetua de una transacción. Al juzgar locking request time out period exceedque diría que correr implicit transaction optiondaría una mejor pista de las causas.
Rodaballo el
Herramientas / Opciones / Ejecución de consultas / SQL Server / ANSI / SET TRANSACCIONES IMPLÍCITAS
Tadej
3

Recibí este problema cuando comencé una transacción explícita en la que creé una tabla en tempdb a partir de un script que se ejecuta en otra base de datos (no tempdb). Cuando comprometí la transacción, la confirmación no parecía liberar el bloqueo en la tabla que había creado en tempdb.

Gracias a esta página , hice USEtempdb y ejecuté y DBCC OPENTRANobtuve el SPID de la conexión a tempdb que estaba causando el bloqueo. Entonces yo KILL <SPID number>para matarlo.

No es muy elegante, y perdí toda la información en la tabla que había creado en tempdb, pero eso estaba bien en mi caso.

Baodad
fuente
En nuestro caso, se emitió un comando DML (redefinición de vista) contra una base de datos usando SET IMPLICIT TRANSACTIONS ON sin COMMIT TRANSACTION , que accidentalmente causó una transacción duradera. El uso de DBCC OPENTRAN ayudó a rastrear rápidamente este problema.
Julio Nobre
1

Hay tantas cosas que esto podría ser que todo lo que puedo ofrecer son algunas preguntas para ayudarlo a orientarse hacia una respuesta.

  1. ¿Está la base de datos en un servidor dedicado solo a ejecutar SQL Server? De lo contrario, otros procesos podrían estar interfiriendo al robar el valioso tiempo del procesador.

  2. ¿Está el servidor de base de datos esencialmente sin memoria? SQL Server intentará asignar cada byte que pueda, pero si está lleno y sus consultas requieren que se carguen más datos, entonces tiene que recurrir al uso de memoria virtual, lo que aumenta radicalmente la cantidad de tiempo que pueden tomar incluso consultas simples.

  3. ¿El ancho de banda de la red del servidor DB es pequeño para manejar la transferencia de datos de manera oportuna?


Al final del día, parece que la máquina en la que aloja SQL Server es de tamaño inferior a lo que está tratando de hacer. Es completamente posible que finalmente haya alcanzado esos límites de hardware donde el rendimiento está disminuyendo radicalmente. Si este es el caso (las preguntas anteriores lo ayudarán a determinarlo), entonces querrá mover la base de datos a un servidor que tenga el tamaño adecuado para la cantidad de datos (y consultas) que está tratando de procesar.

Esto podría significar usar procesadores más rápidos, unidades más rápidas o simplemente instalar más RAM.

Yo no
fuente
No es un problema de hardware. El clúster de servidores aloja múltiples bases de datos. Esta es la única base de datos que tiene problemas
@LloydBanks: Eso no significa que este no sea un problema de hardware. Si tengo 2 bases de datos, una de 20GB de tamaño con una alta tasa de transacción y otra de 1GB con una tasa de transacción más baja, entonces esperaría que el 1GB db se intercambie a la memoria virtual; lo que aumentaría los tiempos de consulta. Si el db de 20 GB se ve afectado lo suficiente, esto podría provocar problemas de conectividad con el más pequeño.
NotMe
1

"Cuando intento ver los árboles de jerarquía de tablas, vistas o procedimientos en el Explorador de objetos de SSMS, obtengo un tiempo de espera de solicitud de bloqueo excedido".

Tuve exactamente el mismo problema. Fui a la ventana de ejecución de consultas y; ROLLBACKdeclaración escrita y ejecutada .

Parece que algunas de las series de declaraciones que estaba ejecutando antes de eso, tenían una transacción abierta. Específicamente, porque algunos de ellos eran declaraciones DDL. Una vez que emití la reversión, las jerarquías de objetos comenzaron a funcionar.

TS
fuente
0

Como muchos ya lo habían señalado, por lo general, hay una transacción duradera, que en su mayoría causó que mi señorita usara SET IMPLICIT TRANSACTIONS ON, que no debe usarse en absoluto. Para ver por qué revisa el perspicaz artículo de Brent Ozar

De todos modos, puede obtener una lista de transacciones pendientes de larga duración utilizando la siguiente consulta.

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
where [s_tdt].[database_transaction_begin_time] is not null
ORDER BY
    [Begin Time] ASC;

https://www.brentozar.com/archive/2018/02/set-implicit_transactions-one-hell-bad-idea/

Julio Nobre
fuente