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.