Mein SQL Server 2005 stellt aufgrund aktiver Verbindungen keine Sicherung wieder her. Wie kann ich es erzwingen?
Mein SQL Server 2005 stellt aufgrund aktiver Verbindungen keine Sicherung wieder her. Wie kann ich es erzwingen?
Antworten:
Wenn Sie mit der rechten Maustaste auf eine Datenbank klicken Tasks
und dann klicken und dann klicken Detach Database
, 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 beenden, ohne die Datenbank zu trennen.
Weitere Informationen hier .
Die Benutzeroberfläche wurde 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 auf Mehrbenutzer einstellen:
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
ROLLBACK IMMEDIATE
oder ROLLBACK AFTER 60
. Die einzige Möglichkeit, diese Daten zu speichern, besteht darin, nach dem Rollback eine weitere Sicherung durchzuführen. Sie stellen jedoch aus einem anderen Backup wieder her. Also, wozu warten? Vermisse ich etwas
Dieser Code hat bei mir funktioniert, er beendet alle vorhandenen Verbindungen einer Datenbank. Sie müssen lediglich 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
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
Durch einen Neustart von SQL Server werden Benutzer getrennt. Der einfachste Weg, den ich gefunden habe - gut auch, wenn Sie den Server offline schalten möchten.
Aber aus irgendeinem sehr seltsamen Grund macht die Option "Offline nehmen" dies nicht zuverlässig und kann die Verwaltungskonsole hängen oder verwirren. Neustart und Offline-Arbeiten
Manchmal ist dies eine Option - wenn Sie beispielsweise einen Webserver gestoppt haben, der die Quelle der Verbindungen ist.
Ich bin auf dieses Problem gestoßen, als ich einen Wiederherstellungsprozess in SQL Server 2008 automatisiert habe. Mein (erfolgreicher) Ansatz war eine Mischung aus zwei der bereitgestellten Antworten.
Zuerst laufe ich über alle Verbindungen dieser Datenbank und töte 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 habe ich die Datenbank auf einen single_user-Modus gesetzt
ALTER DATABASE dbName SET SINGLE_USER
Dann führe ich die Wiederherstellung aus ...
RESTORE DATABASE and whatnot
Beenden Sie die Verbindungen erneut
(same query as above)
Und setzen Sie die Datenbank wieder auf multi_user.
ALTER DATABASE dbName SET MULTI_USER
Auf diese Weise stelle ich sicher, dass keine Verbindungen vorhanden sind, die die Datenbank halten, bevor der Einzelmodus aktiviert wird, da der erstere einfriert, wenn dies der Fall ist.
Keines davon funktionierte für mich, konnte aktuelle Benutzer nicht löschen oder trennen. Es konnten auch keine aktiven Verbindungen zur Datenbank angezeigt werden. Durch einen Neustart von SQL Server (Rechtsklick und Auswahl von Neustart) konnte ich dies tun.
Wenn Sie eine Web-App über IIS ausführen, die die Datenbank verwendet, müssen Sie möglicherweise auch den App-Pool für die App stoppen (nicht recyceln), während Sie sie wiederherstellen, und dann neu starten. Durch das Stoppen des App-Pools werden aktive http-Verbindungen beendet und keine weiteren Verbindungen mehr zugelassen. Andernfalls können Prozesse ausgelöst werden, die eine Verbindung zur Datenbank herstellen und diese dadurch sperren. Dies ist ein bekanntes Problem, beispielsweise beim Umbraco Content Management System beim Wiederherstellen seiner Datenbank
Keines der oben genannten hat bei mir funktioniert. In meiner Datenbank wurden keine aktiven Verbindungen mit Activity Monitor oder sp_who angezeigt. Ich musste letztendlich:
Nicht die eleganteste Lösung, aber sie funktioniert und erfordert keinen Neustart von SQL Server (für mich keine Option, da der DB-Server eine Reihe anderer Datenbanken gehostet hat).
Ich mache das lieber so,
Ändern Sie den Datenbanksatz offline mit sofortigem Rollback
und stellen Sie dann Ihre Datenbank wieder her. nachdem,
Datenbank online ändern mit sofortigem Rollback