Восстановление БД агента заданий SQL завершается с ошибкой #6107: могут быть уничтожены только пользовательские процессы

У нас есть агент заданий SQL, который запускается в рабочие часы для восстановления нашей локальной базы данных (FooData) из производственной резервной копии.

Во-первых, база данных устанавливается в режим SINGLE_USER и все открытые процессы уничтожаются. Во-вторых, база данных восстановлена.

Но на третьем этапе иногда возникает ошибка 6107: "могут быть уничтожены только пользовательские процессы"

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

USE master;
go
exec msdb.dbo.KillSpids FooData;
go
ALTER DATABASE FooData SET MULTI_USER;
go

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

2 ответа

Решение

Я нашел ответ на мою проблему, изменив одну строку кода, которая работала как шарм.

Как упомянуто в первоначальном вопросе, строка "KillSpids" используется на шаге 1 задания. (Вместе с SET SINGLE USER) "KillSpids" имеет смысл на шаге 1, поскольку в базе данных могут все еще оставаться активными нежелательные процессы.

Затем в шаге 3 снова была добавлена ​​строка "KillSpids", но это было ненужным и также вызывало ошибку 6107.

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

USE master;
go
ALTER DATABASE [FooData] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
go
ALTER DATABASE FooData SET MULTI_USER;
go

Пользователь, вероятно, не вошел в систему. Возможно, система выполняет какую-то задачу. Выход из exec sp_who или же sp_who2 покажет, какие сессии открыты. Любой SPID ниже 50 является системным процессом и не может быть уничтожен KILL, Единственный способ остановить их - это остановить службу SQL Server или выдать SHUTDOWN команда (которая делает то же самое).

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