Alle Connections zu einer SQL-Datenbank trennen
Manchmal gibt es Situationen, da ist eine Datenbank so „vor die Wand gefahren“, dass der Zugriff durch ein simples „ALTER DATABASE … ROLLBACK IMMEDIATE“ nicht wieder hergestellt werden kann.
Das kann zum Beispiel passieren, wenn ein fehlerhafter Restore-Prozess gestartet wird. So im Falle meines Kunden geschehen. Restore über die MSSQLSMS-GUI gestartet, Medium ausgewählt, LDF und MDF-Datei ausgetauscht, aber das Ziel vergessen. Endeffekt beim SQL-Server 2008: Ziel- und Quelldaten(banken) komplett gesperrt und eine riesige Menge offener Transaktionen, die sich nicht beenden lassen. Es gibt aber noch Hoffnung:
Folgendes Script killt alle Transaktionen zu einer bestimmten Datenbank.
Bitte ‚DB_NAME‘ gegen den tatsächlichen Namen der gesperrten Datenbank austauschen und abfeuern.
USE master
GO
SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = “
Set @DBName = ‚DB_NAME‘
IF db_id(@DBName) < 4
BEGIN
PRINT‚Connections to system databases cannot be killed‘
RETURN
END
SELECT @spidstr=coalesce(@spidstr,‚,‘ )+‚kill ‚+convert(varchar, spid)+ ‚; ‚
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END
Im Anschluss daran funktioniert ein ggf. vorher nicht erfolgreiches
ALTERDATABASE DB_NAME
SET MULTI_USER;
GO
wieder.