wake-up-neo.com

ALTER DATABASE ist fehlgeschlagen, da die Datenbank nicht gesperrt werden konnte

Ich muss eine Datenbank neu starten, da einige Prozesse nicht funktionieren. Mein Plan ist, es offline zu nehmen und wieder online zu gehen.

Ich versuche dies in SQL Server Management Studio 2008:

use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go

Ich erhalte diese Fehler:

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.

Was mache ich falsch?

120
JOE SKEET

Nachdem Sie den Fehler erhalten haben, führen Sie den Befehl aus

EXEC sp_who2

Suchen Sie in der Liste nach der Datenbank. Möglicherweise wurde eine Verbindung nicht abgebrochen. Wenn Sie Verbindungen zur Datenbank finden, führen Sie den Befehl aus

KILL <SPID>

dabei ist <SPID> die SPID für die Sitzungen, die mit der Datenbank verbunden sind.

Versuchen Sie Ihr Skript, nachdem alle Verbindungen zur Datenbank entfernt wurden.

Ich habe leider keinen Grund, warum Sie das Problem sehen, aber hier ist ein Link, der zeigt, dass das Problem an anderer Stelle aufgetreten ist.

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/

279
bobs

Ich habe es geschafft, diesen Fehler mit den folgenden Schritten zu reproduzieren.

Verbindung 1 (einige Minuten laufen lassen)

CREATE DATABASE TESTING123
GO

USE TESTING123;

SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6

Anschlüsse 2 und 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
5
Martin Smith

Versuchen Sie dies, wenn es sich im Übergang befindet ...

http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html

USE master
GO

ALTER DATABASE <db_name>

SET OFFLINE WITH ROLLBACK IMMEDIATE
...
...
ALTER DATABASE <db_name> SET ONLINE
2
Watki02

Ich weiß, dass dies ein alter Beitrag ist, aber ich bin kürzlich auf ein sehr ähnliches Problem gestoßen. Leider konnte ich keinen der alter-Datenbankbefehle verwenden, da eine exklusive Sperre nicht gesetzt werden konnte. Ich konnte aber nie eine offene Verbindung zur Datenbank finden. Ich musste schließlich den Integritätsstatus der Datenbank zwangsweise löschen, um sie in einen Wiederherstellungszustand zu erzwingen, anstatt sich in der Wiederherstellung zu befinden. 

0
Geoff Dawdy

Nur um meine zwei Cents hinzuzufügen. Ich habe mich in die gleiche Situation versetzt, während ich die minimal erforderlichen Privilegien eines Datenbank-Login suchte, um die Anweisung erfolgreich auszuführen: 

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Es scheint, dass die ALTER-Anweisung erfolgreich abschließt, wenn sie mit einem sysadmin -Login ausgeführt wird. Sie erfordert jedoch den Verbindungsbereinigungsteil, wenn sie unter einem Login ausgeführt wird, der "nur" eingeschränkte Berechtigungen hat, wie:

ALTER ANY DATABASE

P.S. Ich habe stundenlang versucht, herauszufinden, warum "ALTER DATABASE .." nicht funktioniert, wenn es unter einem Login ausgeführt wird, das die dbcreator-Rolle + ALTER ANY DATABASE - Berechtigungen hat. Hier ist mein MSDN Thread !

0
Veselin Z.

In seltenen Fällen (z. B. nachdem eine umfangreiche Transaktion festgeschrieben wurde) verhindert ein laufender CHECKPOINT-Systemprozess, der eine FILE-Sperre für die Datenbankdatei enthält, den Übergang zum MULTI_USER-Modus.

0
mitix

In meinem Szenario gab es keinen Prozess, der die Datenbank unter sp_who2 blockierte. Wir haben jedoch festgestellt, dass die Datenbank viel größer ist als unsere anderen Datenbanken, und dass noch ausstehende Prozesse ausgeführt werden. Aus diesem Grund wird die Datenbank in der Verfügbarkeitsgruppe weiterhin als rot/offline angezeigt, nachdem wir versucht haben, die Daten durch Klicken mit der rechten Maustaste auf die angehaltene Datenbank wieder aufzunehmen.

Um zu überprüfen, ob noch Prozesse ausgeführt werden, führen Sie einfach diesen Befehl aus: Wählen Sie Prozent erledigt aus sys.dm_exec_requests, wobei Prozent erledigt> 0 ist

0
user123456789

Gehen Sie in SQL Management Studio zu Sicherheit -> Anmeldungen und doppelklicken Sie auf Ihre Anmeldung. Wählen Sie in der linken Spalte Serverrollen aus, und überprüfen Sie, ob Sysadmin aktiviert ist.

In meinem Fall war ich bei einem Konto ohne dieses Privileg angemeldet.

HTH!

0
Marty

Ich werde dies hier hinzufügen, falls jemand so viel Glück hat wie ich.

Beachten Sie bei der Durchsicht der Liste der Prozesse sp_who2 die Prozesse, die nicht nur für die betroffene Datenbank ausgeführt werden, sondern auch für master . In meinem Fall betraf das Problem, das die Datenbank blockierte, eine gespeicherte Prozedur, die eine xp_cmdshell gestartet hatte.

Prüfen Sie, ob Sie Prozesse in KILL/RollBack state für master database haben

SELECT *
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

Wenn Sie dasselbe Problem haben, hilft nur der Befehl KILL wahrscheinlich nicht. Sie können den SQL-Server neu starten, oder besser, die Datei cmd.exe unter Windows-Prozessen auf dem SQL-Server-Betriebssystem zu finden und zu beenden.

0
Alina

Das Beenden der Prozess-ID hat für mich gut funktioniert. Wenn Sie den Befehl "EXEC sp_who2" über ein neues Abfragefenster ausführen, filtern Sie die Ergebnisse für die Datenbank "Beschäftigt" Trick. Danach funktionierte alles wieder.

0
user3749524