Восстановление БД агента заданий 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
команда (которая делает то же самое).