Compito bloccato in Management Studio, come li gestisci?


12

Dopo aver fatto clic su "Porta offline il database" in Management Studio questo messaggio rimane bloccato e non si chiude se si fa clic su Chiudi.

https://i.imgur.com/KD6AROv.png

Qual è un buon modo per affrontare lavori bloccati come questi in Management Studio? Puoi ucciderli tramite il monitor attività? Dovrei cercare quale processo sta interrompendo questo lavoro e terminarlo?


4
Scopri prima cosa lo blocca. È possibile ottenere queste informazioni da sys.dm_exec_requests. Inoltre, il tuo lavoro può farlo in modo tale da non essere bloccato, ad esempio emettendo ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;prima ... altrimenti resta semplicemente in attesa e, per un database occupato, potrebbe essere per sempre.
Aaron Bertrand

L'impostazione del database in single_user ha risolto il problema, avrei dovuto immaginare ... SQLserver richiede sempre single_user per questo tipo di cose.
A_V

Risposte:


12

Direi di non usare mai la cosa "Take Offline" nella GUI a meno che tu non sappia per certo che il database non è in uso. Da niente. È difficile da sapere senza fare qualche legwork, quindi perché non salvare questo script da qualche parte e usarlo sempre?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

E poi il reciproco ovviamente:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

Il motivo per cui è necessario impostarlo per SINGLE_USERprimo è eliminare tutti gli utenti esistenti (esiste un'opzione per farlo nella finestra di dialogo di scollegamento, ma non nella finestra di dialogo Take offline), poiché SQL Server ha bisogno dell'accesso esclusivo al database per prendere offline. Ora, potresti voler fare qualche lavoro extra per vedere chi sta attualmente utilizzando il database, come se lo facessi nel mezzo di un'operazione di backup di grandi dimensioni o di un processo ETL o di quello che hai, potrebbe essere problematico.

EDIT : Ho inviato un suggerimento su Connect a questo proposito (vedi Connect # 2687832 ) e l'ho anche pubblicato su Trello (archiviato sotto "Esplora oggetti").


E cosa succede se anche l'impostazione di un singolo utente non riesce perché non è possibile ottenere un blocco sul database?
StackOverthrow

@ user560822 Dovrai attendere fino a quando non avrai un blocco sul database. Se questo significa che devi iniziare a uccidere sessioni ...
Aaron Bertrand

7

Quando sei già in una situazione di sospensione, non dimenticare che puoi cercare connessioni aperte sul server con

sp_who2  

in un altro database, ad esempio master.
Analizza i risultati per individuare quelli in cui il database è quello che stai tentando di mettere offline.
Nota il valore della colonna spid (id processo) di quelle righe.

Uno alla volta, corri

kill  ##

dove "##" è lo spid.

Sicuramente assicurati che quei processi non siano importanti da lasciare in esecuzione ... saranno terminati senza nemmeno finire l'ultimo comando e senza preavviso.


1
La risposta accettata non ha funzionato per me. Errore nel primo comando. Questa risposta funziona perfettamente. Grazie
Cheburek,

va bene :) Sì, la risposta accettata è davvero per evitare il problema ... se sei già impiccato, hai bisogno di qualcosa del genere per ucciderlo
Mike M
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.