Однопользовательский режим "отсутствует поведение" на SQL Server

Я запускаю сценарий, предоставленный одним из сотрудников Microsoft, чтобы выяснить, какие индексы необходимо перестроить / реорганизовать в зависимости от средней фрагментации. Я получил разумный список, но при попытке перестроить некоторые из них в определенной базе данных я продолжал получать ошибки:

Превышено время ожидания запроса блокировки

Первая идея, которую я получил, - установить базу данных в однопользовательском режиме, перестроить индексы, а затем вернуть ее к жизни. Что ж, это не помогло, потому что база данных заполняется службой Windows, которая по иронии судьбы использует того же пользователя, с которым я связан, и единственного доступного мне с достаточными разрешениями для этого. Я работаю в корпоративной среде, поэтому луна немного ближе, чем получение учетных данных другого пользователя. Я также не могу остановить службу при выполнении моих задач, потому что она используется для многих других вещей.

Мой вопрос прост: как я могу заставить однопользовательский режим принудительно использовать один источник соединения? Другими словами, как скрыть базу данных или, в конечном итоге, сервер SQL от службы? Он будет правильно обрабатывать отсутствие как проблему сети, поэтому мне не нужно беспокоиться об этой части.

3 ответа

Решение

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

USE [Your DB Name]

SELECT REQUEST_MODE, REQUEST_TYPE, REQUEST_SESSION_ID
FROM sys.dm_tran_locks
WHERE RESOURCE_TYPE = 'OBJECT'
AND RESOURCE_ASSOCIATED_ENTITY_ID =(SELECT OBJECT_ID('YourTableName'))

REQUEST_SESSION_ID идентификатор сеанса, для которого установлена ​​блокировка таблицы. Тогда я бегу EXEC sp_who2 чтобы убедиться, что SPID является тем для ожидаемой услуги. Все, что мне нужно было сделать в конце, было KILL <SPID> и перестроить индекс. Возможно, вам придется сделать это несколько раз, если вы создаете более одного индекса, поскольку блокировка может быть установлена ​​снова.

Ваша проблема в том, что интерфейс будет ждать определенное количество времени, прежде чем принять решение об ошибке. Я сталкиваюсь с этим все время.

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

Существует опция ONLINE = ON/OFF, доступная при перестроении индексов в SQL Server 2005 и более поздних версиях, которая контролирует, как пользователи могут получить доступ к базовой таблице, которая может решить вашу проблему.

http://msdn.microsoft.com/en-us/library/ms188388(v=sql.110).aspx

Другие вопросы по тегам