SQL Сервер BULK INSERT ошибся и не снял блокировку Sch-M, таблица недоступна - PullRequest
1 голос
/ 20 июня 2020

TL; DR: я думаю, что SQL сервер не выпустил блокировку Sch-M, и я не могу ее снять или найти транзакцию, удерживающую блокировку

Я пытался создать копию другой таблицы и выполнить некоторый сравнительный анализ обновлений данных с диска, и при выполнении BULK INSERT в пустой таблице возникла ошибка, потому что я использовал неправильное имя файла. Я запускал сценарий, выбирая большую часть текста из блокнота в SQL Server Management Studio и нажимая кнопку «Выполнить». Теперь никакие запросы, касающиеся таблицы, не могут выполняться, включая такие вещи, как OBJECT_ID или информацию о схеме в SQL Server Management Studio при ручном обновлении. Запросы просто зависают, и в последнем случае SSMS выдает ошибку о том, что блокировка не была снята в течение тайм-аута.

Пока я предпринял несколько шагов отладки.

Я посмотрел в таблице sys.dm_tran_locks, отфильтрованной по идентификатору ресурса БД. Там я вижу несколько общих блокировок для самой БД и несколько эксклюзивных ключевых блокировок и ровно 1 блокировку на объекте, блокировку Sch-M. Когда я пытаюсь получить имя объекта из идентификатора ресурса в таблице sys.dm_tran_locks, запрос зависает, как и OBJECT_ID () (и не для других имен / идентификаторов таблиц). Блокировка ссылается на идентификатор сеанса 54.

Я также просмотрел таблицу sys.dm_exec_requests, чтобы попытаться найти дополнительную информацию о SPID 54, но нет строк с этим идентификатором сеанса. Фактически, единственные процессы - это те, которые принадлежат sa, и единственный запрос, проверяющий таблицу sys.dm_exec_requests, принадлежащую мне.

Отсюда, если я все правильно понимаю, похоже, что каким-то образом НАМНОГО Оператор INSERT каким-то образом не смог освободить требуемую блокировку Sch-M.

Итак, вот мои вопросы: почему все еще существует блокировка Sch-M на таблице, если процесс, которому она принадлежит, кажется, больше не существует ? Есть ли способ восстановить доступ к таблице без перезапуска серверного процесса SQL? Будет ли код SQL в сценарии после выполнения BULK INSERT, но только для пустой таблицы?

Я использую SQL Server 2016 и SQL Server Management Studio 2016.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...