Однопользовательский режим "отсутствует поведение" на 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