Wie unterbrechen Sie alle aktuellen Verbindungen zu einer SQL Server 2005-Datenbank?

StackOverflow https://stackoverflow.com/questions/11620

  •  08-06-2019
  •  | 
  •  

Frage

Ich möchte eine Datenbank umbenennen, erhalte aber weiterhin die Fehlermeldung „Die exklusive Sperre konnte nicht für die Datenbank erstellt werden“, was darauf hindeutet, dass noch einige Verbindungen aktiv sind.

Wie kann ich alle Verbindungen zur Datenbank beenden, damit ich sie umbenennen kann?

War es hilfreich?

Lösung

Sehen Beenden Sie alle aktiven Verbindungen zu einer Datenbank.

Der Grund dafür, dass der Ansatz das ist Adam schlug vor Das Problem besteht darin, dass während der Zeit, in der Sie die aktiven Verbindungen durchlaufen, neue Verbindungen hergestellt werden können und Sie diese verpassen.Der Artikel, auf den ich verlinkt habe, verwendet den folgenden Ansatz, der diesen Nachteil nicht aufweist:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

Andere Tipps

Um dies zu erreichen, ersetzen Sie im Skript „DB_NAME“ durch die Datenbank, um alle Verbindungen zu beenden:

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

Töte es und töte es mit Feuer:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

DECLARE @spid int
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname)
WHILE @spid IS NOT NULL
BEGIN
EXECUTE ('KILL ' + @spid)
SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid
END

Verwendung von SQL Management Studio Express:

Führen Sie im Objekt-Explorer-Baum einen Drilldown unter „Verwaltung“ zu „Aktivitätsmonitor“ durch (wenn Sie ihn dort nicht finden können, klicken Sie mit der rechten Maustaste auf den Datenbankserver und wählen Sie „Aktivitätsmonitor“).Wenn Sie den Aktivitätsmonitor öffnen, können Sie alle Prozessinformationen anzeigen.Sie sollten in der Lage sein, die Sperren für die Datenbank, an der Sie interessiert sind, zu finden und diese Sperren aufzuheben, wodurch auch die Verbindung unterbrochen wird.

Danach sollte eine Umbenennung möglich sein.

Ich habe immer verwendet:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

Das Offlineschalten dauert eine Weile und manchmal treten dabei Probleme auf.

Meiner Meinung nach der solideste Weg:

AblösenKlicken Sie mit der rechten Maustaste auf DB -> Aufgaben -> Trennen...Überprüfen Sie "Drop -Verbindungen" OK

Wieder anbringenKlicken Sie mit der rechten Maustaste auf Datenbanken -> Anhängen.Hinzufügen...-> Wählen Sie Ihre Datenbank aus und ändern Sie die Spalte „Anhängen als“ in den gewünschten Datenbanknamen.OK

Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

Verwenden Sie die „Master“-Datenbank und führen Sie diese Abfrage aus. Dadurch werden alle aktiven Verbindungen Ihrer Datenbank unterbrochen.

Normalerweise tritt dieser Fehler auf, wenn ich versuche, eine Datenbank wiederherzustellen. Normalerweise gehe ich in Management Studio einfach an die Spitze der Struktur, klicke mit der rechten Maustaste und starte den Datenbankserver neu (da er sich auf einem Entwicklungscomputer befindet, ist dies in der Produktion möglicherweise nicht ideal). ).Dadurch werden alle Datenbankverbindungen geschlossen.

Klicken Sie im MS SQL Server Management Studio im Objekt-Explorer mit der rechten Maustaste auf die Datenbank.Wählen Sie im folgenden Kontextmenü „Aufgaben -> Offline schalten“.

Ein weiterer „Kill it with Fire“-Ansatz besteht darin, einfach den MSSQLSERVER-Dienst neu zu starten.Ich erledige gerne Dinge über die Befehlszeile.Wenn Sie dies genau in CMD einfügen, wird Folgendes erreicht:NET STOP MSSQLSERVER & NET START MSSQLSERVER

Oder öffnen Sie „services.msc“, suchen Sie nach „SQL Server (MSSQLSERVER)“ und klicken Sie mit der rechten Maustaste, wählen Sie „Neustart“.

Dadurch werden „mit Sicherheit“ ALLE Verbindungen zu ALLEN Datenbanken, die auf dieser Instanz ausgeführt werden, unterbrochen.

(Das gefällt mir besser als viele Ansätze, die die Konfiguration auf dem Server/der Datenbank ändern und wieder ändern.)

Hier erfahren Sie, wie Sie so etwas in MS SQL Server Management Studio 2008 zuverlässig durchführen können (funktioniert möglicherweise auch für andere Versionen):

  1. Klicken Sie im Objekt-Explorer-Baum mit der rechten Maustaste auf den Stammdatenbankserver (mit dem grünen Pfeil) und dann auf Aktivitätsmonitor.
  2. Öffnen Sie die Registerkarte „Prozesse“ im Aktivitätsmonitor, wählen Sie das Dropdown-Menü „Datenbanken“ und filtern Sie nach der gewünschten Datenbank.
  3. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Datenbank und starten Sie die Aufgabe „Aufgaben -> Offline schalten“.Lassen Sie dies im Hintergrund laufen, während Sie...
  4. Schalten Sie alles sicher ab, was Sie können.
  5. Beenden Sie alle verbleibenden Prozesse über die Registerkarte „Prozess“.
  6. Bringen Sie die Datenbank wieder online.
  7. Benennen Sie die Datenbank um.
  8. Bringen Sie Ihren Dienst wieder online und verweisen Sie ihn auf die neue Datenbank.

Die für mich in diesem Szenario funktionierende Option lautet wie folgt:

  1. Starten Sie den Vorgang „Trennen“ für die betreffende Datenbank.Dadurch wird ein Fenster (in SQL 2005) geöffnet, in dem die aktiven Verbindungen angezeigt werden, das Aktionen in der Datenbank verhindert.
  2. Beenden Sie die aktiven Verbindungen und brechen Sie den Trennvorgang ab.
  3. Die Datenbank sollte nun zur Wiederherstellung verfügbar sein.

Versuche dies:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

Klicken Sie mit der rechten Maustaste auf den Datenbanknamen, klicken Sie auf „Eigenschaft“, um das Eigenschaftenfenster aufzurufen. Öffnen Sie die Registerkarte „Optionen“ und ändern Sie die Eigenschaft „Zugriff einschränken“ von „Mehrbenutzer“ in „Einzelbenutzer“.Wenn Sie auf die Schaltfläche „OK“ klicken, werden Sie aufgefordert, alle offenen Verbindungen zu schließen, „Ja“ auszuwählen und die Datenbank umzubenennen.

Diese haben bei mir (SQL2008 Enterprise) nicht funktioniert, ich konnte auch keine laufenden Prozesse oder Benutzer sehen, die mit der Datenbank verbunden waren.Durch einen Neustart des Servers (klicken Sie mit der rechten Maustaste auf SQL Server in Management Studio und wählen Sie „Neu starten“) konnte ich die Datenbank wiederherstellen.

Ich verwende SQL Server 2008 R2, meine Datenbank war bereits auf Einzelbenutzer eingestellt und es gab eine Verbindung, die alle Aktionen in der Datenbank einschränkte.Daher die Empfehlung SQLMenaces Die Lösung antwortete mit einem Fehler. Hier ist eine, die in meinem Fall funktioniert hat.

Ich verwende sp_who, um eine Liste aller Prozesse in der Datenbank abzurufen.Dies ist besser, da Sie möglicherweise überprüfen möchten, welcher Prozess beendet werden soll.

declare @proc table(
    SPID bigint,
    Status nvarchar(255),
    Login nvarchar(255),
    HostName nvarchar(255),
    BlkBy nvarchar(255),
    DBName nvarchar(255),
    Command nvarchar(MAX),
    CPUTime bigint,
    DiskIO bigint,
    LastBatch nvarchar(255),
    ProgramName nvarchar(255),
    SPID2 bigint,
    REQUESTID bigint
)

insert into @proc
exec sp_who2

select  *, KillCommand = concat('kill ', SPID, ';')
from    @proc

Ergebnis
Sie können den Befehl in der Spalte „KillCommand“ verwenden, um den gewünschten Prozess abzubrechen.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;

Sie können den Befehl SP_Who verwenden und alle Prozesse beenden, die Ihre Datenbank verwenden, und dann Ihre Datenbank umbenennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top