Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как с помощью скрипта удалить все активные подключения к базе?  [new]
Spectator_Shadow
Member

Откуда:
Сообщений: 44
Доброе всем время суток.
Возникла задача из job удалить все активные подключения к базе.
20 ноя 09, 10:44    [7954961]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
use mydb
go
alter database mydb set single_user with rollback immediate
alter database mydb set multi_user
go

"достаточно одной таблэтки"
20 ноя 09, 11:14    [7955174]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
--Убиваем все активные сеансы подключенные к базе NameDB
DECLARE @spid VARCHAR(200)
DECLARE @kill_spid VARCHAR(200)

DECLARE kill_session CURSOR FOR

SELECT spid FROM [master].dbo.sysprocesses
WHERE dbid=db_id('NameDB')
--spid идентификатор сеанса SQL Server.

 OPEN kill_session;

FETCH NEXT FROM kill_session INTO @spid
WHILE @@FETCH_STATUS = 0

BEGIN

   SET @kill_spid='KILL ' + @spid + char(10)
   --PRINT @kill_spid
   EXEC (@kill_spid)
   
 FETCH NEXT FROM kill_session
 INTO @spid;
END;
 DEALLOCATE kill_session;
20 ноя 09, 11:22    [7955224]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
mike909
Member

Откуда:
Сообщений: 662
Crimean
use mydb
go
alter database mydb set single_user with rollback immediate
alter database mydb set multi_user
go

"достаточно одной таблэтки"

Ээээ.... single_user -> Это только начало хождения по граблям: например

PS. К сожалению 100% работоспособности добиться не удалось. В очередной раз захотелось напрячь мелкософт...
20 ноя 09, 11:33    [7955308]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
mike909
Member

Откуда:
Сообщений: 662
85sergu,

А статистику лучше прибить чере "KILL STATS JOB"
20 ноя 09, 11:39    [7955354]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31209
mike909
Crimean
use mydb
go
alter database mydb set single_user with rollback immediate
alter database mydb set multi_user
go

"достаточно одной таблэтки"

Ээээ.... single_user -> Это только начало хождения по граблям: например

PS. К сожалению 100% работоспособности добиться не удалось. В очередной раз захотелось напрячь мелкософт...
Честно говоря, за много лет не удалось добиться случая несрабатывания alter database set single_user with rollback immediate и тем более "перехвата" коннекта другим пользователем (конечно, если коннект не закрывается).

По ссылке вы ведь приводите другой код.

Само собой, код с "kill" не может гарантировать результат.
20 ноя 09, 12:29    [7955840]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
mike909
Member

Откуда:
Сообщений: 662
alexeyvg
Честно говоря, за много лет не удалось добиться случая несрабатывания alter database set single_user with rollback immediate

И мне не удалось - "alter database set single_user" всегда отрабатывает на ура. Проблемы вылезают позже
alexeyvg
и тем более "перехвата" коннекта другим пользователем (конечно, если коннект не закрывается).

А Вы попробуйте выполнить код приведенный по ссылке, там коннект не закрывается ...
alexeyvg

По ссылке вы ведь приводите другой код.

Там приводится код перевода базы в single_user/multi_user с отсрелом мешающих коннектов...
alexeyvg
Само собой, код с "kill" не может гарантировать результат.

Да, в той SP_шке не хватает ожидания завершения операции "KILL", я давно это исправил ...
Но, как я уже и говорил, добиться 100% безсбойной работы так и не удалось.
Я даже все win32 сервисы переключил на отдельный инстанс, который транслировал вызовы через Service Broker - стало еще хуже ж-(.
Если раньше "Деглюкатор" срабатывал раз в месяц, то после перехода на SB стало раз в две недели, зато сервисы перестали обижаться на обрыв соединений ...
P.S. сейчас у меня захват базы проходит два раза в три дня ...
20 ноя 09, 13:19    [7956205]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31209
mike909
alexeyvg
Честно говоря, за много лет не удалось добиться случая несрабатывания alter database set single_user with rollback immediate

И мне не удалось - "alter database set single_user" всегда отрабатывает на ура. Проблемы вылезают позже
А можно узнать, когда?

А то просто не понимаю, в чём проблема...

mike909
alexeyvg
и тем более "перехвата" коннекта другим пользователем (конечно, если коннект не закрывается).

А Вы попробуйте выполнить код приведенный по ссылке, там коннект не закрывается ...
Скрипт в первом посте?

mike909
Там приводится код перевода базы в single_user/multi_user с отсрелом мешающих коннектов...
Так понятно-же, зачем kill использовать? kill нужно убрать, а with rollback immediate добавить :-)

Я-же писал:
alexeyvg
Само собой, код с "kill" не может гарантировать результат.
20 ноя 09, 14:17    [7956704]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
mike909
Member

Откуда:
Сообщений: 662
alexeyvg
mike909
alexeyvg
Честно говоря, за много лет не удалось добиться случая несрабатывания alter database set single_user with rollback immediate

И мне не удалось - "alter database set single_user" всегда отрабатывает на ура. Проблемы вылезают позже
А можно узнать, когда?

При попытки вызова любой SP после успешного перехода в single_user.

alexeyvg
mike909
alexeyvg

[quot mike909][quot alexeyvg]и тем более "перехвата" коннекта другим пользователем (конечно, если коннект не закрывается).

А Вы попробуйте выполнить код приведенный по ссылке, там коннект не закрывается ...
Скрипт в первом посте?

mike909
Там приводится код перевода базы в single_user/multi_user с отсрелом мешающих коннектов...
Так понятно-же, зачем kill использовать? kill нужно убрать, а with rollback immediate добавить :-)

Я-же писал:
alexeyvg
Само собой, код с "kill" не может гарантировать результат.

А, дошло - мы о разных вещах говорим. Вы - о простом убийстве коннектов. Я - об убийстве простаивающих коннектов с ожиданием завершения работающих для выполнения неких опреаций обслуживания базы, требующих single_user.
Но, сути это не меняет - абсолютно не важно как будут прибиты коннекты, важно лиш то, что проблема с DeadLock_ом, при вызове любой sp в режиме single_user, никуда не делась.
А скрипт иллюстрации проблемы находится здесь.
20 ноя 09, 15:47    [7957392]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31209
mike909
А, дошло - мы о разных вещах говорим. Вы - о простом убийстве коннектов. Я - об убийстве простаивающих коннектов с ожиданием завершения работающих для выполнения неких опреаций обслуживания базы, требующих single_user.
Ну, не знаю. Нужно посмотреть, конечно.

На мой взгляд, для ТС правильный ответ тот, который привёл Crimean.
Для типичной задачи - перевести базу в сингл для выполнения операций, которого этого требуют, этого достаточно, и работает вполне надёжно.
20 ноя 09, 19:48    [7958761]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
Spectator_Shadow
Member

Откуда:
Сообщений: 44
В сем спасибо. Сделал как предложил 85sergu. Все работает. Сначала поставил kill, затем у меня идет проверка базы, со входом в SINGLE_USER.
1 дек 09, 09:55    [8000226]     Ответить | Цитировать Сообщить модератору
 Re: Как с помощью скрипта удалить все активные подключения к базе?  [new]
mike909
Member

Откуда:
Сообщений: 662
Spectator_Shadow
В сем спасибо. Сделал как предложил 85sergu. Все работает. Сначала поставил kill, затем у меня идет проверка базы, со входом в SINGLE_USER.

При всем своем уважении к 85sergu, у него маленькие грабельки зарыты.
А именно - нет ожидания завершения kill_а, процесс может долго сидеть в "KILLED/ROLLBACK"
Можно сделать примерно так
        -- ждем завершения RollBack_ов тех, кого замочили
        WHILE exists( select 1 
                      from sys.dm_exec_requests as c
                      inner join @Spid_List as s on c.session_id = s.session_id
                      where (command = 'KILLED/ROLLBACK') )
          WAITFOR DELAY '00:00:00';
Соответственно в табличную переменную @Spid_List нужно сохранить session_id убиваемых сессий
1 дек 09, 12:31    [8001521]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить