it-swarm.com.de

Wie trenne ich beim Wiederherstellen einer Sicherung alle aktiven Verbindungen?

Mein SQL Server 2005 stellt eine Sicherung wegen aktiver Verbindungen nicht wieder her. Wie kann ich es erzwingen?

165
Jader Dias

SQL Server Management Studio 2005

Wenn Sie mit der rechten Maustaste auf eine Datenbank klicken und auf Tasks und dann auf Detach Database Klicken, wird ein Dialogfeld mit den aktiven Verbindungen angezeigt.

Detach Screen

Durch Klicken auf den Hyperlink unter "Nachrichten" können Sie die aktiven Verbindungen beenden.

Sie können diese Verbindungen dann trennen, ohne die Datenbank zu trennen.

Weitere Informationen hier .

SQL Server Management Studio 2008

Die Benutzeroberfläche hat sich für SQL Server Management Studio 2008 geändert. Hier sind die Schritte (über: Tim Leung )

  1. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den Server und wählen Sie "Aktivitätsüberwachung".
  2. Erweitern Sie in diesem Fall die Gruppe Prozesse.
  3. Verwenden Sie nun das Dropdown-Menü, um die Ergebnisse nach dem Datenbanknamen zu filtern.
  4. Trennen Sie die Serververbindungen, indem Sie mit der rechten Maustaste auf die Option "Prozess beenden" klicken.
173
George Stocker

Sie möchten Ihre Datenbank in den Einzelbenutzermodus versetzen, die Wiederherstellung durchführen und dann wieder in den Mehrbenutzermodus versetzen:

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete

--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'

/*If there is no error in statement before database will be in multiuser
mode.  If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO

Referenz: Pinal Dave ( http://blog.SQLAuthority.com )

Offizielle Referenz: https://msdn.Microsoft.com/en-us/library/ms345598.aspx

189
brendan

Dieser Code hat bei mir funktioniert, er beendet alle bestehenden Verbindungen einer Datenbank. Sie müssen nur die Zeile Set @dbname = 'databaseName' so ändern, dass sie Ihren Datenbanknamen enthält.

Use Master
Go

Declare @dbname sysname

Set @dbname = 'databaseName'

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

danach konnte ich es wiederherstellen

42
RagnaRock

Durch einen Neustart des SQL Servers werden die Benutzer getrennt. Der einfachste Weg, den ich gefunden habe - gut, auch wenn Sie den Server offline schalten möchten.

Aus irgendeinem Grund funktioniert die Option "Offline schalten" nicht zuverlässig und kann die Verwaltungskonsole zum Stillstand bringen oder verwirren. Neustart und dann Offline-Betrieb

Manchmal ist dies eine Option - wenn Sie beispielsweise einen Webserver gestoppt haben, der die Quelle der Verbindungen ist.

5
Simon_Weaver

Versuche dies ...

DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
    spid
FROM
    master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
    @spid
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
    EXECUTE(@SQLCommand)
    FETCH NEXT FROM UserCursor INTO
        @spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO
4
user2276214

Dieses Problem trat bei der Automatisierung eines Wiederherstellungsprozesses in SQL Server 2008 auf. Mein (erfolgreicher) Ansatz war eine Mischung aus zwei der angegebenen Antworten.

Zuerst starte ich alle Verbindungen dieser Datenbank und beende sie.

DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = top 1 spid from master.dbo.sysprocesses
        where dbid = db_id('dbName')
End

Dann setze ich die Datenbank auf einen single_user-Modus

ALTER DATABASE dbName SET SINGLE_USER

Dann starte ich die Wiederherstellung ...

RESTORE DATABASE and whatnot

Trennen Sie die Verbindungen erneut

(same query as above)

Setzen Sie die Datenbank wieder auf multi_user.

ALTER DATABASE dbName SET MULTI_USER

Auf diese Weise stelle ich sicher, dass keine Verbindungen bestehen, die die Datenbank aufhalten, bevor der Einzelmodus aktiviert wird, da der erstere blockiert, wenn er vorhanden ist.

3
Eric Wu

Wenn Sie eine Web-App haben, die über IIS läuft und die die Datenbank verwendet, müssen Sie möglicherweise auch den App-Pool für die App stoppen (nicht recyceln) Während der Wiederherstellung starten Sie erneut. Durch das Stoppen des App-Pools werden aktive HTTP-Verbindungen abgebrochen und es werden keine weiteren Verbindungen zugelassen. Andernfalls können Prozesse ausgelöst werden, die eine Verbindung zur Datenbank herstellen und dadurch die Datenbank sperren. Dies ist ein bekanntes Problem, beispielsweise beim Umbraco Content Management System beim Wiederherstellen der Datenbank

2
Chris Halcrow

Keines davon funktionierte für mich, konnte aktuelle Benutzer nicht löschen oder trennen. Konnte auch keine aktiven Verbindungen zur DB sehen. Das Neustarten von SQL Server (Klicken Sie mit der rechten Maustaste und wählen Sie "Neu starten") ermöglichte es mir.

2
The Coder

Keines der oben genannten hat bei mir funktioniert. Meine Datenbank zeigte keine aktiven Verbindungen mit Activity Monitor oder sp_who. Ich musste letztendlich:

  • Klicken Sie mit der rechten Maustaste auf den Datenbankknoten
  • Wählen Sie "Trennen ..."
  • Aktivieren Sie das Kontrollkästchen "Drop Connections"
  • Wieder anbringen

Nicht die eleganteste Lösung, aber sie funktioniert und erfordert keinen Neustart von SQL Server (für mich keine Option, da auf dem DB-Server eine Reihe anderer Datenbanken gehostet wurden).

1
Brent Waggoner

Am liebsten mache ich so,

datenbank mit sofortigem Rollback offline setzen

und stellen Sie dann Ihre Datenbank wieder her. nachdem,

online gesetzte Datenbank mit sofortigem Rollback ändern

0
Aniyan Kolathur