Mein SQL Server 2005 stellt eine Sicherung wegen aktiver Verbindungen nicht wieder her. Wie kann ich es erzwingen?
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.
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 .
Die Benutzeroberfläche hat sich für SQL Server Management Studio 2008 geändert. Hier sind die Schritte (über: Tim Leung )
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
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
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.
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
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.
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
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.
Keines der oben genannten hat bei mir funktioniert. Meine Datenbank zeigte keine aktiven Verbindungen mit Activity Monitor oder sp_who. Ich musste letztendlich:
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).
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