«Превышен период ожидания запроса блокировки» Ошибка при попытке увидеть иерархию БД

17

У меня проблемы с базой данных.

  1. Я могу выполнять основные запросы, хотя и намного медленнее, чем обычно.

  2. Когда я пытаюсь просмотреть деревья иерархии для таблиц, представлений или процедур в SSMS Object Explorer, я получаю lock request time out period exceeded.

  3. Мои отчеты SSRS, которые запускаются для объектов в этой базе данных, больше не завершаются.

  4. Задания, связанные с процедурами, хранящимися в этой базе данных, также не выполняются.

Я попытался использовать, sp_who2чтобы найти и уничтожить все соединения в базе данных, однако это не решило проблему.

Что здесь происходит? Как я могу решить это?

Ллойд Бэнкс
источник
Также смотрите: stackoverflow.com/questions/12167570/… ; не уверен, считается ли это дубликатом или нет.
LittleBobbyTables - Au Revoir
Исходя из вашего комментария к моему ответу ниже, я думаю, что вам нужно предоставить гораздо больше информации. Каков размер сервера, наблюдали ли вы за его счетчиками производительности, идет ли он на диск или иным образом истощается ресурс. Обязательно проверяйте вышеизложенное, а не просто предполагайте что-либо. Кроме того, это происходит, когда вы подключаетесь в удаленном режиме на рабочий стол? Проблема возникает только при доступе из одного места? Какова погода в сети для этого сервера (и ваше подключение к нему)?
NotMe
3
Похоже, у вас есть открытые транзакции, которые блокируют доступ на чтение таблиц.
a_horse_with_no_name

Ответы:

11

Это было вызвано постоянным откатом транзакции. Пришлось перезапустить мой кластер серверов

Ллойд Бэнкс
источник
2
Перезапуск сервиса решил это за меня.
HerrimanCoder
Перезапуск в такой ситуации может привести к восстановлению базы данных
MaazKhan47
dbcc opentran скажет вам, если есть открытые транзакции
Нейт Андерсон
Мне кажется странным, что во время выполнения транзакции я не могу, например, развернуть раздел таблиц. Нет данных для чтения, нет DDL, ничего, только список таблиц.
gerleim
5

Без учета аппаратного обеспечения, возможно, вам нужно запустить сценарий, чтобы проверить, какие действия удерживают сеанс SQL, один из распространенных сценариев - это не использовать Implicit transactions OptionSQL Server Management Studio.

Палтус
источник
Привет, тюрбо, можешь рассказать подробнее о том, что ты предлагаешь?
Похоже, что, хотя это не полностью объяснено, это может быть лучшим ответом, постоянным откатом транзакций, которые не откатываются и включаются только из-за неявных транзакций.
КонстантинК
Оглядываясь назад, я не мог сказать, что это должен быть постоянный откат транзакции. Судя по этому, locking request time out period exceedя бы сказал, что бег implicit transaction optionпоможет лучше понять причины.
Turbot
Инструменты / Параметры / Выполнение запроса / SQL Server / ANSI / SET НЕЗАКОННЫЕ СДЕЛКИ
Тадей
3

Я получил эту проблему, когда начал явную транзакцию, в которой я создал таблицу в базе данных tempdb из сценария, работающего в другой базе данных (не в базе данных tempdb). Когда я фиксировал транзакцию, фиксация, казалось, не снимала блокировку таблицы, которую я создал в tempdb.

Благодаря этой странице я USEвыполнил tempdb и выполнил DBCC OPENTRANSPID соединения с tempdb, который вызывал блокировку. Тогда я KILL <SPID number>убью его.

Не очень изящно, и я потерял всю информацию в таблице, которую создал в tempdb, но в моем случае это было нормально.

Baodad
источник
В нашем случае команда DML (переопределение представления) была снова введена в базу данных с использованием команды SET IMPLICIT TRANSACTIONS ON без COMMIT TRANSACTION , что случайно вызвало длительную транзакцию. Использование DBCC OPENTRAN помогло быстро отследить эту проблему.
Хулио Нобре
1

Так много всего, что я могу предложить, это лишь несколько вопросов, которые помогут вам найти ответ.

  1. БД на сервере предназначена только для запуска SQL Server? Если нет, другие процессы могут мешать, похищая драгоценное процессорное время.

  2. Серверу БД не хватает памяти? SQL Server будет пытаться выделить каждый байт, который может, но если он заполнен и ваши запросы требуют больше данных для загрузки, он вынужден использовать виртуальную память, что радикально увеличивает количество времени, которое могут потребоваться даже для простых запросов.

  3. Является ли пропускная способность сети сервера БД малой для своевременной передачи данных?


В конце концов, похоже, что компьютер, на котором вы размещаете SQL Server, недостаточно приспособлен для того, что вы пытаетесь сделать. Вполне возможно, что вы наконец достигли тех аппаратных ограничений, когда производительность радикально падает. Если это так (приведенные выше вопросы помогут вам определить это), вы захотите переместить БД на сервер, размер которого соответствует размеру данных (и запросов), которые вы пытаетесь обработать.

Это может означать использование более быстрых процессоров, более быстрых дисков или просто установку большего объема оперативной памяти.

Не я
источник
Это не проблема с оборудованием. Кластер серверов содержит несколько баз данных. Это единственная база данных, которая имеет проблемы
@LloydBanks: Это не значит, что это не аппаратная проблема. Если бы у меня было 2 базы данных, одна размером 20 ГБ с высокой скоростью транзакций, а другая - 1 ГБ с более низкой скоростью транзакций, то я бы ожидал, что 1 ГБ будет перенесено в виртуальную память; что бы увеличить время запроса. Если 20 дБ достаточно сильно пострадали, это может привести к проблемам с подключением меньшего.
NotMe
1

«Когда я пытаюсь просмотреть деревья иерархии для таблиц, представлений или процедур в SSMS Object Explorer, я получаю превышение времени ожидания запроса блокировки».

У меня была точно такая же проблема. Я пошел в окно выполнения запроса и; набрал и выполнил ROLLBACKзаявление.

Похоже, некоторые из серии заявлений, которые я выполнял до этого, проходили в открытой транзакции. В частности, потому что некоторые из них, где DDL заявления. Как только я произвел откат, иерархии объектов начали работать.

TS
источник
0

Как уже отмечали многие, обычно это длительные транзакции, в основном из-за которых я пропустил команду SET IMPLICIT TRANSACTIONS ON, которая вообще не должна использоваться. Чтобы понять, почему стоит проверить проницательную статью Брента Озара

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

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/

Хулио Нобре
источник