Mój SQL Server 2005 nie przywraca kopii zapasowej z powodu aktywnych połączeń. Jak mogę to wymusić?
Mój SQL Server 2005 nie przywraca kopii zapasowej z powodu aktywnych połączeń. Jak mogę to wymusić?
Odpowiedzi:
Kliknięcie bazy danych prawym przyciskiem myszy i kliknięcie, Tasks
a następnie kliknięcie Detach Database
powoduje wyświetlenie okna dialogowego z aktywnymi połączeniami.
Klikając na hiperłącze pod "Wiadomościami" możesz zabić aktywne połączenia.
Następnie możesz zabić te połączenia bez odłączania bazy danych.
Więcej informacji tutaj .
Interfejs zmienił się dla SQL Server Management studio 2008, oto kroki (przez: Tim Leung )
Chcesz ustawić swoją bazę danych w trybie pojedynczego użytkownika, wykonaj przywracanie, a następnie ustaw ją z powrotem na wielu użytkowników:
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
Źródła: Pinal Dave ( http://blog.SQLAuthority.com )
Oficjalne odniesienie: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
czy ROLLBACK AFTER 60
. Jedynym sposobem na zapisanie tych danych jest wykonanie kolejnej kopii zapasowej po wycofaniu. Ale przywracasz z innej kopii zapasowej. Więc jaki jest sens czekania? Czy coś mi brakuje?
Ten kod działał dla mnie, zabija wszystkie istniejące połączenia z bazą danych. Wszystko, co musisz zrobić, to zmienić wiersz Set @dbname = 'databaseName', aby zawierał nazwę Twojej bazy danych.
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
po tym udało mi się go przywrócić
Spróbuj tego:
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
Ponowne uruchomienie serwera SQL rozłączy użytkowników. Najłatwiejszy sposób, jaki znalazłem - dobry również, jeśli chcesz przełączyć serwer w tryb offline.
Ale z jakiegoś bardzo dziwnego powodu opcja „Przełącz w tryb offline” nie robi tego niezawodnie i może zawiesić lub zmylić konsolę zarządzania. Ponowne uruchomienie i przejście do trybu offline działa
Czasami jest to opcja - jeśli na przykład zatrzymałeś serwer WWW, który jest źródłem połączeń.
Napotkałem ten problem podczas automatyzacji procesu przywracania w SQL Server 2008. Moje (udane) podejście było połączeniem dwóch udzielonych odpowiedzi.
Najpierw sprawdzam wszystkie połączenia wspomnianej bazy danych i zabijam je.
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
Następnie ustawiłem bazę danych w trybie pojedynczego użytkownika
ALTER DATABASE dbName SET SINGLE_USER
Następnie uruchamiam przywracanie ...
RESTORE DATABASE and whatnot
Ponownie zakończ połączenia
(same query as above)
I ustaw bazę danych z powrotem na multi_user.
ALTER DATABASE dbName SET MULTI_USER
W ten sposób upewniam się, że nie ma żadnych połączeń zatrzymujących bazę danych przed przełączeniem w tryb pojedynczy, ponieważ ten pierwszy zostanie zawieszony, jeśli istnieją.
Żaden z nich nie działał dla mnie, nie mógł usunąć ani odłączyć obecnych użytkowników. Nie można też było zobaczyć żadnych aktywnych połączeń z bazą danych. Ponowne uruchomienie programu SQL Server (kliknij prawym przyciskiem myszy i wybierz opcję Uruchom ponownie) pozwoliło mi to zrobić.
Aby dodać do już podanych porad, jeśli masz aplikację internetową działającą za pośrednictwem usług IIS, która korzysta z bazy danych, może być konieczne zatrzymanie (nie ponowne użycie ) puli aplikacji dla aplikacji podczas przywracania, a następnie ponowne uruchomienie. Zatrzymanie puli aplikacji zabija aktywne połączenia HTTP i nie zezwala na więcej, co w przeciwnym razie mogłoby doprowadzić do wyzwolenia procesów, które łączą się z bazą danych, a tym samym blokują ją. Jest to znany problem dotyczący na przykład systemu zarządzania treścią Umbraco podczas przywracania bazy danych
Żadne z powyższych nie działało dla mnie. Moja baza danych nie pokazała żadnych aktywnych połączeń za pomocą Monitora aktywności lub sp_who. Ostatecznie musiałem:
Nie jest to najbardziej eleganckie rozwiązanie, ale działa i nie wymaga ponownego uruchamiania SQL Server (nie jest to opcja dla mnie, ponieważ serwer DB hostował kilka innych baz danych)
Wolę to robić,
zmiana bazy danych ustawiona w trybie offline z natychmiastowym wycofaniem
a następnie przywróć bazę danych. po tym,
zmiana bazy danych w trybie online z natychmiastowym wycofaniem