Heute ging mir beim Restore eines MSSQL Servers ein Client auf die Nerven. Nachdem ich alle Benutzer gebeten habe, wegen eben der Rücksicherung einer Datenbank entsprechende Anwendungen zu beenden, war noch immer jemand auf der Datenbank. Doch wer? Ein Blick in die System-Prozesse zeigt den entsprechenden User:
select spid, status, loginame, hostname, blocked, db_name(dbid), cmd from master..sysprocesses
Da ich keine Lust hatte, mit dem entsprechenden User zu diskutieren, wieso er jetzt nicht die Sache beenden konnte, entschied ich mich für die radikale Methode und den entsprechenden Prozess abzuschießen. Der Benutzer würde sich schon im Falle des Falles bei mir melden.
Ein SQL Script sucht mir die Prozesse die auf die entsprechende Datenbank zugreifen und killt diese:
-- use the master database USE master go DECLARE @DatabaseName varchar(30), @ServerProcessID varchar(10), @StartTime datetime -- Set our database name to my_database (change this to your db) SELECT @StartTime = current_timestamp, @DatabaseName = 'my_database' -- Timeout after 3 minutes while(exists(Select * FROM sysprocesses WHERE dbid = db_id(@DatabaseName)) AND datediff(mi, @StartTime, current_timestamp) < 3) begin DECLARE spids CURSOR FOR SELECT convert(varchar, spid) FROM sysprocesses WHERE dbid = db_id(@DatabaseName) OPEN spids while(1=1) BEGIN FETCH spids INTO @ServerProcessID IF @@fetch_status < 0 BREAK exec('kill ' + @ServerProcessID) END DEALLOCATE spids end
Danach klappte der Restore problemlos und prompt meldete sich auch der entsprechende Benutzer per Telefon zu Wort. Ich nahm den Hörer zur Hand und meldete mich zuckersüß mit den Worten "Simon, Operator hier?"...