Tempo di attesa estremo quando si porta offline un database di SQL Server


278

Sto cercando di eseguire un po 'di manutenzione offline (ripristino del database degli sviluppatori dal backup live) sul mio database degli sviluppatori, ma il comando "Take Offline" tramite SQL Server Management Studio sta funzionando molto lentamente, nell'ordine di 30 minuti più adesso. Sono quasi alla fine del mio ingegno e non riesco a trovare riferimenti online su ciò che potrebbe causare il problema di velocità o su come risolverlo.

Alcuni siti hanno suggerito che le connessioni aperte al database causano questo rallentamento, ma l'unica applicazione che utilizza questo database è l'istanza IIS della mia macchina di sviluppo e il servizio è interrotto: non ci sono più connessioni aperte.

Cosa potrebbe causare questo rallentamento e cosa posso fare per accelerarlo?

Risposte:


408

Dopo alcune ricerche aggiuntive (nuovi termini di ricerca ispirati alla risposta di gbn e al commento di u07ch sulla risposta di KMike) ho trovato questo, che è stato completato con successo in 2 secondi:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Aggiornare)

Se l'errore persiste con il seguente errore, puoi risolverlo come ispirato da questo post del blog :

ALTER DATABASE non è riuscito perché non è stato possibile posizionare un blocco sul database 'dbname' Riprovare più tardi.

puoi eseguire il comando seguente per scoprire chi mantiene un blocco sul tuo database:

EXEC sp_who2

E usa tutto ciò SPIDche trovi nel seguente comando:

KILL <SPID>

Quindi eseguire ALTER DATABASEnuovamente il comando. Ora dovrebbe funzionare.


35
Se non funziona (non è stato possibile posizionare un lucchetto), provare anche la soluzione in stackoverflow.com/questions/4673065 .
nalply,

3
Se il processo Take DB Offline è ancora in esecuzione, per le macchine dev è possibile ucciderlo da Task Manager ed eseguire il comando sopra.
Null Head,

1
Se si esegue il comando KILL e viene visualizzato il messaggio "Impossibile utilizzare KILL per interrompere il proprio processo.", Assicurarsi di utilizzare il database principale per eseguire il comando
Jarrod

129

Molto probabilmente esiste una connessione al DB da qualche parte (un raro esempio: aggiornamento statistico asincrono )

Per trovare le connessioni, utilizzare sys.sysprocesses

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

Per forzare le disconnessioni, utilizzare ROLLBACK IMMEDIATE

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

7
+1 perché la query di processo ti consente di sapere cosa è connesso a questo database. nel mio caso era un impiegato
disonesto

3
Nel mio caso ero il ladro con una finestra dell'analizzatore di query aperta
dellyjm il

1
Nel mio caso gli sviluppatori avevano un sito Web principale di produzione per una banca molto nota che puntava a un database chiamato OLD
ZZ9

3
Se dice che il ALTER DATABASE failed because a lock could not be placed on databasecomando KILL <SPID>aiuterà
Muflix il

28

Hai delle finestre aperte di SQL Server Management Studio connesse a questo DB?

Mettilo in modalità utente singolo, quindi riprova.


2
ALTER DATABASE <DBNAME> SET SINGLE_USER CON Rollback immediato
u07ch

KMike - l'unica connessione che ho è aperta al database Master, non al database che sto cercando di mettere offline.
Erik Forbes,

17

Nel mio caso, dopo aver aspettato così tanto che finisse, non ho avuto pazienza e ho semplicemente chiuso lo studio di gestione. Prima di uscire, mostrava il messaggio di successo, db non è in linea. I file erano disponibili per rinominare.


7

eseguire la procedura memorizzata sp_who2

Questo ti permetterà di vedere se ci sono blocchi di blocco .. uccidere i loro dovrebbe risolverlo.


5

In SSMS: fare clic con il pulsante destro del mouse sull'icona del server SQL, Activity Monitor. Processi aperti. Trova il elaborato connesso. Fai clic con il tasto destro del mouse sul processo, Kill.


4

ogni volta che ti imbatti in questo tipo di cose dovresti sempre pensare al tuo registro delle transazioni. Lo statuto alter db con rollback immediato indica che questo è il caso. Dai un'occhiata a: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Osserva i checkpoint, ecc. Devi decidere se vale la pena salvare le transazioni nel tuo registro e quindi scegliere la modalità per eseguire il tuo db di conseguenza. Non c'è davvero alcun motivo per cui devi aspettare, ma non c'è nemmeno motivo per perdere dati - puoi avere entrambi.


2
Saggio consiglio - grazie - ma in questo caso i dati sono sacrificabili in quanto è un database di sviluppo che viene ripristinato.
Erik Forbes,

3

Chiudere l'istanza di SSMS (SQL Service Manager) da cui è stata effettuata la richiesta ha risolto il problema per me .....


3

Nel mio caso avevo esaminato alcune tabelle nel DB prima di eseguire questa azione. Il mio account utente aveva una connessione attiva a questo DB in SSMS. Una volta disconnesso dal server in SSMS (lasciando aperta la finestra di dialogo "Porta database offline") l'operazione è riuscita.


Lo stesso con me. Quindi mi sono riconnesso, ho modificato il database attivo in master ed ho eseguito il seguente comando: ALTER DATABASE XXX SET OFFLINE CON ROLLBACK IMMEDIATE
cskwg

2

Per ovviare a questo, ho bloccato il sito Web che era collegato al db in IIS e immediatamente il pannello "congelato" "porta offline db" è stato sbloccato.


2

Ho provato tutti i suggerimenti di seguito e niente ha funzionato.

  1. EXEC sp_who
  2. Uccidi <SPID>

  3. ALTER DATABASE SET SINGLE_USER CON Rollback immediato

    ALTER DATABASE SET OFFLINE CON ROLLBACK IMMEDIATO

    Risultato: entrambi i comandi precedenti sono stati bloccati.

4 Fare clic con il tasto destro del mouse sul database -> Proprietà -> Opzioni Imposta il database in sola lettura su True. Fare clic su "Sì" nella finestra di dialogo di avviso. SQL Server chiuderà tutte le connessioni al database.

Risultato: la finestra era bloccata durante l'esecuzione.

Come ultima risorsa, ho riavviato il servizio server SQL da Configuration Manager e quindi ho eseguito ALTER DATABASE SET OFFLINE CON ROLLBACK IMMEDIATE. Ha funzionato come un fascino


1

Inoltre, chiudi tutte le finestre di query che potresti avere che sono connesse al database in questione;)


1

In SSMS, impostare il database in sola lettura, quindi indietro. Le connessioni verranno chiuse, il che libera i blocchi.

Nel mio caso c'era un sito Web con connessioni aperte al database. Questo metodo è stato abbastanza semplice:

  1. Fare clic con il tasto destro del mouse sul database -> Proprietà -> Opzioni
  2. Impostare Database Read-Onlysu True
  3. Fare clic su "Sì" nella finestra di dialogo di avviso. SQL Server chiuderà tutte le connessioni al database.
  4. Riaprire Opzioni e disattivare la sola lettura
  5. Ora prova a rinominare il database o portarlo offline.

0

Per me, dovevo solo entrare nel Job Activity Monitor e interrompere due cose che stavano elaborando. Quindi è andato offline immediatamente. Nel mio caso, però, sapevo quali fossero quei 2 processi e che era giusto fermarli.


0

Nel mio caso, il database era correlato a una vecchia installazione di Sharepoint. L'arresto e la disabilitazione dei servizi correlati nel server manager "hanno annullato" l'azione take offline, in esecuzione da 40 minuti, e si è conclusa immediatamente.

Potresti voler verificare se qualche servizio sta attualmente utilizzando il database.


1
Esegui sp_who2per vedere quali processi utilizzano il database e utilizzali kill <PID>per arrestarli.
Eric Kigathi,

0

La prossima volta, dalla finestra di dialogo Take Offline, ricordati di selezionare la casella di controllo "Elimina tutte le connessioni attive". Ero anche su SQL_EXPRESS sul computer locale senza connessioni, ma questo rallentamento è accaduto per me a meno che non avessi spuntato quella casella.


-1

Nel mio caso ho arrestato il server Tomcat. quindi immediatamente il DB è andato offline.

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.