Il sistema operativo ha restituito l'errore 21 (Il dispositivo non è pronto.)


13

Ogni volta che riavvio Windows, per alcuni database ottengo questo errore:

Il sistema operativo ha restituito l'errore 21 (Il dispositivo non è pronto.)

  1. Ho controllato il disco chkdsk /rsenza - settori danneggiati.
  2. Ho eseguito DBCC CHECKDBsenza errori:

    *(CHECKDB found 0 allocation errors and 0 consistency errors in database)* 
  3. Se riavvio SQL Server, gli errori scompaiono.

Windows 10 e SQL Server 2016 Express.

Risposte:


14

Ogni volta che riavvio Windows, per alcuni database viene visualizzato questo errore. (Errore del sistema operativo 21 - Dispositivo non pronto)

Ciò è dovuto al fatto che un disco non è in linea o non è in linea al momento dell'avvio di SQL Server o aveva stati di transizione dopo che SQL Server era online.

3.Se riavvio SQL Server, gli errori scompaiono

Sì, perché i database sono stati rimontati all'interno di SQL Server. Puoi anche offline-> online anche il database e funzionerebbe, supponendo che il dispositivo disco sia stato riparato.

Questo può essere facilmente riprodotto in un ambiente di test inserendo un database su un disco, disabilitando il disco, eseguendo una query di selezione (per ottenere l'errore), riportando il disco online e notando che la selezione fallisce ancora con lo stesso errore. Il database dovrà essere reinstallato per funzionare di nuovo e non ottenere il 21 errore del sistema operativo.

Cosa dovresti fare

Chiedi a qualcuno di eseguire alcune tracce di Windows per capire perché inizialmente non è in linea o perché non è in linea (qualsiasi transizione di stato) o perché viene mostrato pronto per Windows ma in realtà non lo è (forse è necessario caricare altri driver per esso).

Inoltre, controlla che tutti i driver del filtro del disco siano aggiornati per cose come antivirus, protezioni dalle intrusioni dell'host, ecc., Poiché potrebbero anche bloccare il servizio / avvio / stato.


Ho avuto un problema simile e ho aggiunto uno script per riavviare i servizi SQLServer / SqlLaunchPad dopo 5 minuti, ma non funziona. Quando riavvio manualmente più tardi, allora funziona senza problemi. La stessa configurazione in SQL Server2014 funziona senza problemi
Rajesh,

Cambia la modalità di avvio da Automatica a Ritardata. Questo farà in modo che SQLService si accenda per ultimo (dopo che i dischi si montano e fanno le loro cose).
Jonathan Fite,

6

Penso di aver trovato la causa.

Molto probabilmente il problema è dovuto alle opzioni di alimentazione "Avvio rapido" .

Avvio veloce

È una tecnica di Windows per ridurre il tempo di avvio; Fast Startup combina elementi di arresto a freddo e la modalità di ibernazione .

Qui puoi trovare un altro articolo su pro e contro

L'ho disabilitato e il problema sembra risolto.


Grande. Questo è un modo di vederlo. La vera causa è che alcuni servizi SQL non sono stati avviati quando si vede questo errore SQL. Non sono stati avviati a causa del modo in cui sono impostati su "avvio", soprattutto se si sta effettivamente utilizzando "Avvio rapido" per il sistema operativo.
Chagbert,

3

Queste sono le mie osservazioni e come ho risolto il problema (a beneficio di altri che potrebbero avere lo stesso problema)

  • Stavo usando l'istanza Amazon ec2 con il server SQL.
  • Avevo un dispositivo EBS Block collegato all'istanza ec2, mappato sull'unità D :.
  • I miei dati e registri erano nell'unità D :.
  • Quando interrompo l'istanza ec2 e la visualizzo in seguito, ho sempre riscontrato l'errore di "dispositivo non pronto" e i database non venivano visualizzati.
  • Ho provato a impostare il servizio MSSQLSERVER con "Avvio ritardato".
  • Tuttavia, dai registri del server sql ho scoperto che il ritardo non è stato rispettato e MSSQLSERVER è stato avviato insieme all'avvio.
  • Dal eventviewer ho osservato il momento in cui l'unità D: diventa sana.
  • Dai registri del server sql, ho notato l'ora in cui SQL Server sta avviando il mio database utenti.
  • Ho osservato che, D: l'unità è disponibile solo dopo 6 secondi; e ovviamente appare l'errore "Dispositivo non pronto".
  • Ho anche notato che il "Partenza ritardata" non è stato onorato perché c'era un altro servizio chiamato "SQL SERVER LaunchPad" che avvia "MSSQLSERVER".
  • Non ho bisogno della funzionalità di analisi del "Launchpad". Quindi ho disabilitato quel servizio.
  • Ora "MSSQLSERVER" si avvia in ritardo e può trovare i file D: drive.

1

L'errore completo che ho riscontrato durante la connessione all'istanza MS SQL predefinita locale (2017) tramite MSSMS è:

Il sistema operativo ha restituito l'errore 21 (Il dispositivo non è pronto.) A SQL Server durante una lettura all'offset 0x000000000ae000 nel file 'D: \ MSSQL \ DATA \ tempdev.mdf'. Ulteriori messaggi nel registro errori di SQL Server e nel registro errori del sistema operativo possono fornire ulteriori dettagli. Questa è una grave condizione di errore a livello di sistema che minaccia l'integrità del database e deve essere corretta immediatamente. Completare un controllo di coerenza del database completo (DBCC CHECKDB). Questo errore può essere causato da molti fattori; per ulteriori informazioni, consultare la documentazione in linea di SQL Server. (Microsoft SQL Server, errore: 823) Per assistenza, fare clic su: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=823&LinkId=20476

Ho iniziato a ottenerlo dopo aver spostato il mio tempdb sul mio nuovo disco D. L'esecuzione di un avvio / arresto del servizio SQL rimuove l'errore. Non ho mai avuto questo errore quando tutto era su C. Entrambe le mie unità sono SSD e crittografate con Bitlocker, non sono sicuro che questo potrebbe essere il problema, forse l'unità C viene sbloccata molto presto perché il sistema operativo ne ha bisogno e l'unità D viene sbloccata in seguito .

  1. Secondo la risposta di Max ( https://dba.stackexchange.com/a/175115 ), la disabilitazione di "Avvio rapido" ha risolto il mio problema. Secondo l'articolo Max link a ( https://www.howtogeek.com/243901/the-pros-and-cons-of-windows-10s-fast-startup-mode/ ) è abbastanza oscuro da trovare, nella " Scegli cosa fanno i pulsanti di accensione ", quindi" Modifica impostazioni attualmente non disponibili ".
  2. A differenza della risposta di Venvig ( https://dba.stackexchange.com/a/226115 ), l'impostazione del servizio "SQL Server" su Startup Type = "Automatic (Delayed Start)" ha anche risolto il mio problema (con Windows Fast Startup abilitato).

0

Ho riscontrato lo stesso problema molte volte e ho pensato di condividere la mia soluzione (nonostante le risposte già fornite):

Quindi ho due istanze SQL (SQL 2008 e SQL 2017). L'errore non si manifesta nella mia istanza SQL08 ma su SQl17. Ciò è causato dalle "credenziali dell'account" fornite durante l'installazione / configurazione di ciascuna istanza SQL:

inserisci qui la descrizione dell'immagine

Questo può essere visto in Servizi Windows. SQL08 è stato impostato per utilizzare "Account di sistema locale" mentre SQL17 non funzionante è stato impostato su "ACCOUNT DI RETE" durante l'installazione. Quindi basta cambiarlo e riavviare qui il servizio SQL (o riavviare l'istanza nel browser SQL).

La seconda parte di questo problema è unica per SQL Server 2017 CTP 2.0 quando si utilizza SQL Server Management Studio V17, nel qual caso SMO è passato a " sys.dm_os_enumerate_fixed_drives " anziché al vecchio " xp_fixeddrives " per ottenere informazioni sullo spazio libero sul disco locale . Per ovviare a questo, vai a DEVICE MANAGER e disabilita temporaneamente l'unità citata (nel mio caso era l'unità "G" che è solo la mia unità DVD-ROM).


0

Anche questo problema mi ha irritato. Ho 5 dB collegati alla mia istanza di SQL Server, 3 dei quali funzionano correttamente, ma 2 dei quali si lamentano

Il sistema operativo ha restituito l'errore 21 (Il dispositivo non è pronto.) A SQL Server durante una lettura all'offset 0x00000000204000 nel file "E: \ xxxxxxxx.mdf"

Ecco la mia soluzione

  1. Attivare Services.msc , individuare il servizio chiamato SQL Server (nome istanza) , fare clic con il tasto destro e riavviarlo .
  2. Torna su sms, aggiorna il tuo db e le cose dovrebbero funzionare.

In una nota a margine, ho provato a prendere il metodo offline / online di db. Non ha funzionato nel mio caso. La forza bruta che riavvia il servizio sqlserver ha funzionato bene. questo potrebbe essere un problema per coloro la cui posta in gioco di portare offline tutti i dbs è troppo alta. Tuttavia, se stai solo facendo uno sviluppo locale come me, allora questa soluzione dovrebbe andare bene.

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.