ALTER DATABASE non riuscito perché non è stato possibile posizionare un blocco sul database


124

Ho bisogno di riavviare un database perché alcuni processi non funzionano. Il mio piano è di metterlo offline e di nuovo online.

Sto provando a farlo 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

Ricevo questi errori:

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.

Che cosa sto facendo di sbagliato?


Qual è il problema che ha causato questa necessità in primo luogo? Avete delle transazioni di rollback al momento? Inoltre hai già eseguito questo comando in un'altra finestra SSMS che potrebbe essere ancora aperta? Mi chiedo (pura speculazione) se ciò potrebbe richiedere un blocco che blocca altri tentativi ma è ancora in attesa prima che il database possa effettivamente essere messo in modalità single_user.
Martin Smith,

1
@Martin - abbastanza giusto. Devo pensare a qualcos'altro o perdere la testa. nessuno dei due è del tutto possibile
codingbadger il

@grazie a tutti, ho riavviato SSMS e sono stato in grado di uccidere tutti
JOE SKEET

Potrebbe essere intellisense. Ho eliminato una query incompleta che aveva linee ondulate che cercavano di accedere al database e poi ha funzionato.
Faahmed,

Risposte:


293

Dopo aver visualizzato l'errore, esegui

EXEC sp_who2

Cerca il database nell'elenco. È possibile che una connessione non sia stata terminata. Se trovi connessioni al database, esegui

KILL <SPID>

dove si <SPID>trova lo SPID per le sessioni connesse al database.

Prova lo script dopo aver rimosso tutte le connessioni al database.

Sfortunatamente, non ho un motivo per cui stai riscontrando il problema, ma ecco un link che mostra che il problema si è verificato altrove.

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


Potete fornire qualche spiegazione sul perché una connessione non verrebbe interrotta dal comando? L'unica ragione per cui posso pensare sarebbe che è ancora in procinto di tornare indietro o è un set single_usertentativo ancora in sospeso.
Martin Smith,

@Martin, temo di non avere un motivo per questo. Ma aggiungerò un link che indica che altri hanno visto il problema. Concordo sul fatto che un rollback della transazione potrebbe essere il problema, ma KILLneanche lo risolverebbe.
Bob

Sii gentile a capire perché questo accade, ma i commenti sul tuo link sembrano indicare che funzionerebbe! (+1)
Martin Smith,

KILL (87) risulta in Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.erm ....
Tim Abell,

2
@MartinSmith Penso di sapere il perché: ho appena avuto lo stesso problema, una connessione persistente visualizzata sotto sp_who2 ha causato lo stallo di un offline. Si è rivelato essere un file aperto di modifica delle finestre in ssms. Credo che ciò che accade qui sia che la finestra di modifica delle righe sia una query aperta con un set di risultati modificabile. SQL Server ha una tale funzione come alternativa alle istruzioni di aggiornamento. Alla chiusura di questa particolare finestra sms, la sospensione sospesa offline è stata completata immediatamente.
Giovanni,

5

Sono riuscito a riprodurre questo errore nel modo seguente.

Connessione 1 (lasciare in esecuzione per un paio di minuti)

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

Collegamenti 2 e 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;


1

Lo aggiungerò qui nel caso qualcuno sarà fortunato come me.

Quando si esamina l' elenco di processi sp_who2 , annotare i processi eseguiti non solo per il database interessato ma anche per il master . Nel mio caso il problema che stava bloccando il database era correlato a una procedura memorizzata che ha avviato un xp_cmdshell.

Verificare se sono presenti processi nello stato KILL / RollBack per il database principale

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

Se hai lo stesso problema, probabilmente solo il comando KILL non ti aiuterà. È possibile riavviare il server SQL o il modo migliore è trovare cmd.exe nei processi di Windows sul sistema operativo SQL Server e ucciderlo.


0

In SQL Management Studio, vai su Sicurezza -> Login e fai doppio clic sul tuo Login. Scegli Ruoli server dalla colonna di sinistra e verifica che sysadmin sia selezionato.

Nel mio caso, ero collegato a un account senza quel privilegio.

HTH!


1
L'errore nella domanda originale si verifica anche quando sei SA, non ha nulla a che fare con i tuoi diritti. Se non si dispone di diritti sufficienti, non sarà possibile eseguire il comando offline.
Abele,

0

Uccidere l'ID processo ha funzionato bene per me. Quando esegui il comando "EXEC sp_who2" su una nuova finestra di query ... e filtra i risultati per il database "occupato", uccidere i processi con il comando "KILL" è riuscito a fare il trucco. Dopodiché tutto ha funzionato di nuovo.


0

Solo per aggiungere i miei due centesimi. Mi sono messo nella stessa situazione, mentre cercavo i privilegi minimi richiesti di un accesso db per eseguire correttamente l'istruzione:

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

Sembra che l'istruzione ALTER si completi correttamente , quando eseguita con un login sysadmin , ma richiede la parte di pulizia delle connessioni, quando eseguita con un login che ha "solo" autorizzazioni limitate come:

ALTER ANY DATABASE

PS Ho passato ore a cercare di capire perché "ALTER DATABASE .." non funziona se eseguito con un account di accesso che ha il ruolo dbcreator + i privilegi ALTER ANY DATABASE . Ecco il mio thread MSDN !


0

So che questo è un vecchio post, ma di recente ho riscontrato un problema molto simile. Sfortunatamente non sono stato in grado di utilizzare nessuno dei comandi alter database perché non è stato possibile posizionare un blocco esclusivo. Ma non sono mai stato in grado di trovare una connessione aperta con il db. Alla fine ho dovuto eliminare forzatamente lo stato di integrità del database per forzarlo in uno stato di ripristino anziché nel ripristino.


0

In rari casi (ad es. Dopo aver eseguito una transazione pesante) un processo di sistema CHECKPOINT in esecuzione che tiene un blocco FILE sul file di database impedisce la transizione alla modalità MULTI_USER.


0

Nel mio scenario, non vi era alcun processo che bloccava il database in sp_who2. Tuttavia, abbiamo scoperto che il database è molto più grande degli altri nostri database e che i processi in sospeso erano ancora in esecuzione, motivo per cui il database nel gruppo di disponibilità veniva ancora visualizzato come rosso / offline dopo aver provato a "riprendere i dati" facendo clic con il pulsante destro del mouse sul database in pausa.

Per verificare se i processi sono ancora in esecuzione, eseguire questo comando: selezionare percent complete da sys.dm_exec_requests dove percent_complete> 0

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.