Отключение зависших сеансов 1с (SQL)

Часто при работе с базами 1с в клиент-серверном варианте появляется проблема зависших сеансов. Из-за них не удается восстановить архив sql, выполнить какие-то обработки, требующие монопольный режим и т.д.
В первую очередь при такой проблемы мы идем на сервер 1с и в консоли администрирования удаляем сеансы или соединения:

Но этот способ не всегда помогает: на уровне sql могут оставаться сеансы, которые в данной консоли не будут отображаться.
И так, идем значит мы на сервер, где установлен MS SQL и заходим в “SQL Server Management Studio” (если конечно администратор вам доверяет и дал к нему доступ). Создаем новый запрос и пишем простой, незамысловатый код:
1 |
sp_who |
Вариантов получения соединений много, можно так же использовать и такой вариант:
1 2 |
select db_name(dbid) as db, spid, loginame, program_name, status from sys.sysprocesses |
Что бы получить соединения только к интересующей нас базе, просто добавим условие для поля ‘db_name(dbid)’:
1 2 3 |
select db_name(dbid) as db, spid, loginame, program_name, status from sys.sysprocesses where db_name(dbid) = 'TEST_2_fin' |
Теперь по сути нам осталось убить процессы (метод KILL) по значениям из колонки ‘spid‘:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
set nocount on declare @dbname varchar(100) declare @query varchar(max) set @query = '' set @dbname = 'TEST_2_fin' select @query=coalesce(@query,',' )+'kill '+convert(varchar, spid)+ '; ' from sys.sysprocesses where dbid=db_id(@dbname) print @query if len(@query) > 0 begin exec(@query) end |
В результате данного запроса сформируется команда ‘kill 52; kill 54;’ и затем произойдет её выполнение ‘exec’.
Вариантов исполнения может быть много:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
DECLARE @spid VARCHAR(200) DECLARE @kill_spid VARCHAR(200) DECLARE kill_session CURSOR FOR SELECT spid FROM [master].dbo.sysprocesses WHERE dbid=db_id('TEST_1_sed') --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; |
Надеюсь благодаря этой статье вы хоть немного прокачаете свой скил в SQL. Ну и как заметка она пригодится.
Очень помогла статья!!! Спасибо!!!
Я добавил условие у себя, удалить все сеансы с логином sa. Иначе он доходил до моего сеанса и останавливался.
Получилось так:
set nocount on
declare @dbname varchar(100)
declare @query varchar(max)
set @query = ”
set @dbname = ‘TEST_2_fin’
select @query=coalesce(@query,’,’ )+’kill ‘+convert(varchar, spid)+ ‘; ‘
from sys.sysprocesses where dbid=db_id(@dbname) and loginame=’sa’
print @query
if len(@query) > 0
begin
exec(@query)
end
Отлично что мои заметки кому-то помогают! Спасибо так же и за свое решение – надеюсь оно тоже кому-то поможет!
Надо попробовать, тоже пишу на 1с, Sql хочу свой еще сайт сделать
Правильно! Конечно делай. И для себя будут заметки и для людей!