Extreme Wartezeit beim Offline-Schalten einer SQL Server-Datenbank

278

Ich versuche, eine Offline-Wartung (Wiederherstellung der Entwicklungsdatenbank aus einer Live-Sicherung) für meine Entwicklungsdatenbank durchzuführen, aber der Befehl "Offline übernehmen" über SQL Server Management Studio wird extrem langsam ausgeführt - in der Größenordnung von mehr als 30 Minuten. Ich bin fast am Ende und kann online keine Hinweise darauf finden, was das Geschwindigkeitsproblem verursachen könnte oder wie es behoben werden kann.

Einige Websites haben vorgeschlagen, dass offene Verbindungen zur Datenbank diese Verlangsamung verursachen. Die einzige Anwendung, die diese Datenbank verwendet, ist die IIS-Instanz meines Entwicklungscomputers, und der Dienst wird gestoppt. Es gibt keine offenen Verbindungen mehr.

Was könnte diese Verlangsamung verursachen und was kann ich tun, um sie zu beschleunigen?

Erik Forbes
quelle

Antworten:

408

Nach einigen zusätzlichen Suchen (neue Suchbegriffe, inspiriert von der Antwort von gbn und dem Kommentar von u07ch zu KMikes Antwort) fand ich diese, die in 2 Sekunden erfolgreich abgeschlossen wurde:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Aktualisieren)

Wenn dies immer noch mit dem folgenden Fehler fehlschlägt, können Sie ihn gemäß diesem Blog-Beitrag beheben :

ALTER DATABASE ist fehlgeschlagen, da die Datenbank 'Datenbankname' nicht gesperrt werden konnte. Versuchen Sie es später erneut.

Sie können den folgenden Befehl ausführen, um herauszufinden, wer Ihre Datenbank sperrt:

EXEC sp_who2

Und verwenden SPIDSie alles , was Sie im folgenden Befehl finden:

KILL <SPID>

Führen Sie dann den ALTER DATABASEBefehl erneut aus. Es sollte jetzt funktionieren.

Erik Forbes
quelle
35
Wenn dies nicht funktioniert (eine Sperre konnte nicht platziert werden), versuchen Sie die Lösung auch unter stackoverflow.com/questions/4673065 .
Nalply
3
Wenn der Take DB Offline-Prozess noch ausgeführt wird, können Sie ihn für Entwicklungscomputer über den Task-Manager beenden und den obigen Befehl ausführen.
Null Head
1
Wenn Sie den Befehl KILL ausführen und die Meldung "KILL kann nicht zum Beenden Ihres eigenen Prozesses verwendet werden" erhalten, stellen Sie sicher, dass Sie die Masterdatenbank verwenden, um den Befehl auszuführen
Jarrod,
129

Es besteht höchstwahrscheinlich eine Verbindung zur Datenbank von irgendwoher (ein seltenes Beispiel: asynchrone Statistikaktualisierung )

Verwenden Sie sys.sysprocesses, um Verbindungen zu finden

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

Verwenden Sie ROLLBACK IMMEDIATE, um die Trennung zu erzwingen

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
gbn
quelle
7
+1, da die Prozessabfrage Sie darüber informiert, was mit dieser Datenbank verbunden ist. In meinem Fall war es ein Schurkenangestellter mit offenem SSMS :)
MikeMurko
3
In meinem Fall war ich der Schurke mit einem geöffneten Query Analyzer-Fenster
dellyjm
1
In meinem Fall hatten die Entwickler eine Produktions-Hauptwebsite für eine sehr bekannte Bank, die auf eine Datenbank zeigte, die OLD
ZZ9 am
3
Wenn es heißt, ALTER DATABASE failed because a lock could not be placed on databaseBefehl KILL <SPID>wird helfen
Muflix
28

Haben Sie geöffnete SQL Server Management Studio-Fenster, die mit dieser Datenbank verbunden sind?

Versetzen Sie es in den Einzelbenutzermodus und versuchen Sie es erneut.

KM.
quelle
2
ALTER DATABASE <DBNAME> SET SINGLE_USER WITH Rollback Immediate
u07ch
KMike - Die einzige Verbindung, die ich habe, ist offen für die Master-Datenbank, nicht für die Datenbank, die ich offline schalten möchte.
Erik Forbes
17

In meinem Fall hatte ich, nachdem ich so lange darauf gewartet hatte, dass es fertig war, keine Geduld und schloss einfach das Managementstudio. Vor dem Beenden wurde die Erfolgsmeldung angezeigt, dass db offline ist. Die Dateien konnten umbenannt werden.

Rudy
quelle
7

Führen Sie die gespeicherte Prozedur sp_who2 aus

Auf diese Weise können Sie feststellen, ob blockierende Sperren vorhanden sind. Töten Sie diese, um das Problem zu beheben.

Woodwa
quelle
5

In SSMS: Klicken Sie mit der rechten Maustaste auf das SQL Server-Symbol Aktivitätsmonitor. Prozesse öffnen. Finden Sie die verarbeitete Verbindung. Klicken Sie mit der rechten Maustaste auf den Vorgang, Töten.

Nzeemin
quelle
4

Wenn Sie auf solche Dinge stoßen, sollten Sie immer an Ihr Transaktionsprotokoll denken. Die Änderung der Datenbank mit sofortigem Rollback zeigt an, dass dies der Fall ist. Überprüfen Sie dies: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Bone-up auf Checkpoints usw. Sie müssen entscheiden, ob die Transaktionen in Ihrem Protokoll gespeichert werden sollen oder nicht, und dann den Modus auswählen, in dem Ihre Datenbank entsprechend ausgeführt wird. Es gibt wirklich keinen Grund für Sie, warten zu müssen, aber auch keinen Grund für Sie, Daten zu verlieren - Sie können beides haben.

noch eine andere Taube
quelle
2
Weiser Rat - danke - aber in diesem Fall sind die Daten entbehrlich, da es sich um eine Entwicklungsdatenbank handelt, in der wiederhergestellt wird.
Erik Forbes
3

Das Schließen der Instanz von SSMS (SQL Service Manager), von der aus die Anforderung gestellt wurde, löste das Problem für mich .....

Armand G.
quelle
3

In meinem Fall hatte ich mir vor dem Ausführen dieser Aktion einige Tabellen in der Datenbank angesehen. Mein Benutzerkonto hatte eine aktive Verbindung zu dieser Datenbank in SSMS. Nachdem ich die Verbindung zum Server in SSMS getrennt hatte (wobei das Dialogfeld "Datenbank offline schalten" geöffnet blieb), war der Vorgang erfolgreich.

RamenNoodle
quelle
Ich auch. Dann stellte ich die Verbindung wieder her, änderte die aktive Datenbank in Master und führte den folgenden Befehl aus: ALTER DATABASE XXX SET OFFLINE MIT ROLLBACK IMMEDIATE
cskwg
2

Um dies zu umgehen, habe ich die Website gestoppt, die mit der Datenbank in IIS verbunden war, und sofort wurde das Fenster "eingefroren" "Datenbank offline schalten" nicht mehr eingefroren.

Dan
quelle
2

Ich habe alle folgenden Vorschläge ausprobiert und nichts hat funktioniert.

  1. EXEC sp_who
  2. Töte <SPID>

  3. ALTER DATABASE SET SINGLE_USER WITH Rollback Sofort

    ALTER DATABASE SET OFFLINE MIT ROLLBACK SOFORT

    Ergebnis: Beide oben genannten Befehle steckten ebenfalls fest.

4. Klicken Sie mit der rechten Maustaste auf die Datenbank -> Eigenschaften -> Optionen. Setzen Sie die schreibgeschützte Datenbank auf True. Klicken Sie im Dialogfeld mit der Warnung, dass SQL Server alle Verbindungen zur Datenbank schließt, auf "Ja".

Ergebnis: Das Fenster blieb beim Ausführen hängen.

Als letzten Ausweg habe ich den SQL Server-Dienst über den Konfigurationsmanager neu gestartet und dann ALTER DATABASE SET OFFLINE WITH ROLLBACK IMMEDIATE ausgeführt. Es funktionierte wie ein Zauber

Viraj A.
quelle
1

Schließen Sie auch alle möglicherweise geöffneten Abfragefenster, die mit der betreffenden Datenbank verbunden sind;)

Steve Woods
quelle
1

Stellen Sie in SSMS die Datenbank auf schreibgeschützt und dann zurück ein. Die Verbindungen werden geschlossen, wodurch die Schlösser freigegeben werden.

In meinem Fall gab es eine Website mit offenen Verbindungen zur Datenbank. Diese Methode war einfach genug:

  1. Klicken Sie mit der rechten Maustaste auf die Datenbank -> Eigenschaften -> Optionen
  2. Auf Database Read-OnlyTrue setzen
  3. Klicken Sie im Dialogfeld "Ja" auf "Ja". SQL Server schließt alle Verbindungen zur Datenbank.
  4. Öffnen Sie die Optionen erneut und schalten Sie die schreibgeschützte Option wieder aus
  5. Versuchen Sie nun, die Datenbank umzubenennen oder offline zu schalten.
zacharydl
quelle
0

Für mich musste ich nur in den Job Activity Monitor gehen und zwei Dinge stoppen, die verarbeitet wurden. Dann ging es sofort offline. In meinem Fall wusste ich jedoch, was diese beiden Prozesse waren und dass es in Ordnung war, sie zu stoppen.

Craig
quelle
0

In meinem Fall bezog sich die Datenbank auf eine alte Sharepoint-Installation. Durch das Stoppen und Deaktivieren verwandter Dienste im Server-Manager wurde die seit 40 Minuten ausgeführte Offline-Aktion "aufgehoben" und sofort abgeschlossen.

Möglicherweise möchten Sie überprüfen, ob derzeit Dienste die Datenbank verwenden.

Jonathan
quelle
1
Führen Sie sp_who2diese Option aus, um festzustellen, welche Prozesse die Datenbank verwenden kill <PID>, und stoppen Sie sie.
Eric Kigathi
0

Denken Sie beim nächsten Mal im Dialogfeld "Offline übernehmen" daran, das Kontrollkästchen "Alle aktiven Verbindungen löschen" zu aktivieren. Ich war auch auf SQL_EXPRESS auf einem lokalen Computer ohne Verbindungen, aber diese Verlangsamung trat bei mir auf, es sei denn, ich habe dieses Kontrollkästchen aktiviert.

Brett Drake
quelle
-1

In meinem Fall habe ich den Tomcat-Server gestoppt. dann ging die DB sofort offline.

Java Main
quelle