Jak podczas przywracania kopii zapasowej odłączyć wszystkie aktywne połączenia?

Mój SQL Server 2005 nie przywraca kopii zapasowej z powodu aktywnych połączeń. Jak mogę to wymusić?

Author: Tim Rogers, 2009-07-20

9 answers

SQL Server Management Studio 2005

Po kliknięciu prawym przyciskiem myszy na bazie danych i kliknięciu Tasks, a następnie kliknięciu Detach Database, wyświetla się okno dialogowe z aktywnymi połączeniami.

Odłącz ekran http://www.kodyaz.com/images/articles/kill-all-processes/detach-database.JPG

Klikając na hiperłącze pod "wiadomości" możesz zabić aktywne połączenia.

Możesz następnie zabić te połączenia bez odłączania bazy danych.

Więcej informacji tutaj .

SQL Server Management Studio 2008

Interfejs został zmieniony dla SQL Server Management studio 2008, oto kroki (via: Tim Leung )

  1. kliknij prawym przyciskiem myszy serwer w Object Explorer i wybierz "monitor aktywności".
  2. gdy to się otworzy, rozwiń grupę procesów.
  3. Teraz użyj rozwijanej listy, aby filtrować wyniki według nazwy bazy danych.
  4. Wyłącz połączenia z serwerem, wybierając prawym przyciskiem myszy 'Zabij proces' opcja.
 170
Author: George Stocker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:17

Chcesz ustawić db na tryb pojedynczego użytkownika, wykonaj restore, a następnie ustaw go z powrotem na multiuser:

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

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

Oficjalne odniesienie: https://msdn.microsoft.com/en-us/library/ms345598.aspx

 179
Author: brendan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 12:30:30

Ten kod zadziałał dla mnie, zabija wszystkie istniejące połączenia z bazą danych. Wszystko co musisz zrobić, to zmienić linię @ dbname = 'databaseName' tak, aby miała 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ć

 38
Author: RagnaRock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 10:04:58

Ponowne uruchomienie serwera SQL spowoduje odłączenie użytkowników. Najprostszy sposób, jaki Znalazłem-dobry również, jeśli chcesz wziąć serwer w trybie offline.

Ale z jakiegoś bardzo dziwnego powodu opcja 'Take Offline' nie robi tego niezawodnie i może zawiesić lub pomylić konsolę zarządzania. Ponowne uruchamianie, a następnie pobieranie prac offline

Czasami jest to opcja - jeśli na przykład zatrzymałeś serwer WWW, który jest źródłem połączeń.

 5
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-11 08:02:51

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
 4
Author: user2276214,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-12 23:06:04

Żaden z nich nie działał dla mnie, nie mógł usunąć lub odłączyć obecnych użytkowników. Nie widać też żadnych aktywnych połączeń z DB. Ponowne uruchomienie SQL Server (kliknij prawym przyciskiem myszy i wybierz Restart) pozwoliło mi to zrobić.

 2
Author: The Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-01 03:04:56

Aby dodać do porad już udzielonych, jeśli masz aplikację internetową działającą przez IIS, która korzysta z DB, może być również konieczne zatrzymanie (nie recykling) puli aplikacji podczas przywracania, a następnie ponowne uruchomienie. Zatrzymanie puli aplikacji zabija aktywne połączenia http i nie pozwala na więcej, co w przeciwnym razie może doprowadzić do wyzwalania procesów, które łączą się i tym samym blokują bazę danych. Jest to znany problem na przykład z systemem zarządzania treścią Umbraco podczas przywracania its database

 2
Author: Chris Halcrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-31 00:30:05

Natknąłem się na ten problem podczas automatyzacji procesu przywracania w SQL Server 2008. Moje (udane) podejście było mieszanką dwóch udzielonych odpowiedzi.

Najpierw natknąłem się na wszystkie połączenia tej bazy danych i je zabiłem.
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 ustawiam bazę danych na tryb single_user

ALTER DATABASE dbName SET SINGLE_USER
Następnie uruchamiam restore...
RESTORE DATABASE and whatnot

Kill the connections again

(same query as above)

I ustaw bazę danych z powrotem na multi_user.

ALTER DATABASE dbName SET MULTI_USER

W ten sposób zapewniam, że nie ma żadnych połączeń zatrzymujących bazę danych przed ustawieniem na tryb pojedynczy, ponieważ pierwszy zostanie zamrożony, jeśli istnieją.

 2
Author: Eric Wu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-05 18:40:57

Żadne z powyższych nie zadziałało na mnie. Moja baza danych nie wykazała żadnych aktywnych połączeń przy użyciu Monitora aktywności lub sp_who. Ostatecznie musiałem:

  • Kliknij prawym przyciskiem myszy węzeł bazy danych
  • Wybierz " Odłącz..."
  • Zaznacz pole "Drop Connections"
  • Reattach

Nie jest to najbardziej eleganckie rozwiązanie, ale działa i nie wymaga ponownego uruchamiania serwera SQL (nie jest to dla mnie opcja, ponieważ serwer DB hostował kilka innych baz danych)

 1
Author: Brent Waggoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 03:48:40