Das Betriebssystem hat den Fehler 21 zurückgegeben. (Das Gerät ist nicht bereit.)

12

Bei jedem Neustart von Windows wird bei einigen Datenbanken die folgende Fehlermeldung angezeigt:

Das Betriebssystem hat den Fehler 21 zurückgegeben. (Das Gerät ist nicht bereit.)

  1. Ich habe die Festplatte überprüft mit chkdsk /r- keine schlechten Sektoren.
  2. Ich habe DBCC CHECKDBohne Fehler ausgeführt:

    *(CHECKDB found 0 allocation errors and 0 consistency errors in database)* 
  3. Wenn ich SQL Server neu starte, verschwinden die Fehler.

Windows 10 und SQL Server 2016 Express.

Max
quelle

Antworten:

13

Bei jedem Neustart von Windows tritt bei einigen Datenbanken dieser Fehler auf. (Betriebssystemfehler 21 - Gerät nicht bereit)

Dies liegt daran, dass eine Festplatte zum Zeitpunkt des Starts von SQL Server offline oder nicht online war oder den Status geändert hat, nachdem SQL Server online war.

3.Wenn ich SQL Server neu starte, verschwinden die Fehler

Ja, da die Datenbanken in SQL Server erneut bereitgestellt wurden. Sie können die Datenbank auch offline-> online stellen und sie funktioniert, sofern das Festplattengerät repariert wurde.

Dies kann in einer Testumgebung leicht reproduziert werden, indem eine Datenbank auf einer Festplatte abgelegt, die Festplatte deaktiviert, eine Auswahlabfrage ausgeführt wird (um den Fehler zu erhalten), die Festplatte wieder online geschaltet wird und festgestellt wird, dass die Auswahl immer noch mit demselben Fehler fehlschlägt. Die Datenbank muss erneut bereitgestellt werden, damit sie wieder funktioniert und kein Betriebssystemfehler 21 auftritt.

Was tun?

Lassen Sie jemanden Windows-Tracing durchführen, um herauszufinden, warum es anfänglich nicht online geschaltet wird oder warum es offline geschaltet wird (jeder Statusübergang) oder warum es für Windows bereit ist, aber wirklich nicht (möglicherweise müssen andere Treiber geladen werden) es).

Überprüfen Sie außerdem, ob alle Festplattenfiltertreiber auf dem neuesten Stand sind, z. B. Virenschutz, Schutz vor Hosteinbrüchen usw., da diese möglicherweise auch den Dienst / Start / Status blockieren.

Sean Gallardy
quelle
Ich hatte ein ähnliches Problem und fügte ein Skript hinzu, um die SQLServer / SqlLaunchPad-Dienste nach 5 Minuten neu zu starten, aber das funktioniert nicht. Wenn ich später manuell neu starte, funktioniert es ohne Probleme. Die gleiche Konfiguration in SQL Server2014 funktioniert ohne Probleme
Rajesh
Ändern Sie den Startmodus von Automatisch auf Verzögerung. Dadurch wird sichergestellt, dass der SQLService zuletzt aktiviert wird (nachdem die Festplatten gemountet wurden und ihre Aufgabe erledigt haben).
Jonathan Fite
6

Ich glaube, ich habe die Ursache gefunden.

Höchstwahrscheinlich liegt das Problem an den Energieoptionen "Schnellstart" .

Schneller Start

Es ist eine Windows-Technik, um die Startzeit zu verkürzen. Fast Startup kombiniert Elemente einer Kaltabschaltung und der Funktion für den Ruhezustand .

Hier finden Sie einen weiteren Artikel über Vor- und Nachteile

Ich habe es deaktiviert und das Problem scheint gelöst zu sein.

Max
quelle
Toll. Dies ist eine Sichtweise. Die eigentliche Ursache ist, dass einige SQL-Dienste zu dem Zeitpunkt, zu dem dieser SQL-Fehler angezeigt wird, noch nicht gestartet wurden. Sie wurden nicht gestartet, da sie auf "Start" eingestellt sind, insbesondere wenn Sie tatsächlich "Schnellstart" für das Betriebssystem verwenden.
Chagbert
3

Dies sind meine Beobachtungen und wie ich das Problem gelöst habe (zum Nutzen anderer, die möglicherweise das gleiche Problem haben)

  • Ich habe eine Amazon Ec2-Instanz verwendet, auf der ein SQL Server ausgeführt wird.
  • Ich hatte ein EBS-Block-Gerät an die ec2-Instanz angeschlossen, das dem Laufwerk D: zugeordnet war.
  • Meine Daten und Protokolle befanden sich im Laufwerk D:.
  • Wenn ich die ec2-Instanz stoppe und später aufrufe, tritt immer der Fehler "Gerät nicht bereit" auf, und die Datenbanken werden nicht angezeigt.
  • Ich habe versucht, den MSSQLSERVER-Dienst mit "Verzögerter Start" einzustellen.
  • Aus den SQL Server-Protokollen ging jedoch hervor, dass die Verzögerung nicht berücksichtigt wurde und MSSQLSERVER direkt mit dem Start gestartet wurde.
  • Vom Eventviewer aus habe ich den Zeitpunkt beobachtet, zu dem das D: -Laufwerk fehlerfrei wird.
  • In den SQL Server-Protokollen habe ich den Zeitpunkt notiert, zu dem SQL Server meine Benutzerdatenbank startet.
  • Ich habe festgestellt, dass das Laufwerk D: erst nach 6 Sekunden verfügbar ist. und offensichtlich wird der Fehler "Gerät nicht bereit" angezeigt.
  • Ich habe auch festgestellt, dass der "verzögerte Start" nicht berücksichtigt wurde, da es einen anderen Dienst namens "SQL SERVER LaunchPad" gab, der "MSSQLSERVER" startet.
  • Ich benötige die Analytics-Funktion des "Launchpad" nicht. Also habe ich diesen Dienst deaktiviert.
  • Jetzt startet "MSSQLSERVER" mit einer Verzögerung und kann die D: Laufwerksdateien finden.
VenVig
quelle
1

Der vollständige Fehler, den ich beim Herstellen einer Verbindung zu meiner lokalen Standard-MS SQL-Instanz (2017) über MSSMS erhalten habe, lautet:

Das Betriebssystem hat während eines Lesevorgangs mit dem Offset 0x000000000ae000 in der Datei 'D: \ MSSQL \ DATA \ tempdev.mdf' den Fehler 21 (Das Gerät ist nicht bereit.) An SQL Server zurückgegeben. Zusätzliche Meldungen im SQL Server-Fehlerprotokoll und im Betriebssystemfehlerprotokoll enthalten möglicherweise weitere Details. Dies ist eine schwerwiegende Fehlerbedingung auf Systemebene, die die Datenbankintegrität gefährdet und sofort behoben werden muss. Führen Sie eine vollständige Datenbankkonsistenzprüfung (DBCC CHECKDB) durch. Dieser Fehler kann durch viele Faktoren verursacht werden. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation. (Microsoft SQL Server, Fehler: 823) Klicken Sie auf: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=823&LinkId=20476

Ich fing an, dies zu bekommen, als ich meine Tempdb auf mein neues D-Laufwerk verschob. Durch Starten / Stoppen des SQL-Dienstes wird der Fehler behoben. Ich habe diesen Fehler nie erhalten, als alles auf C war. Meine beiden Laufwerke sind SSD und mit Bitlocker verschlüsselt. Ich bin mir nicht sicher, ob dies das Problem sein könnte. Möglicherweise wird das Laufwerk C sehr früh entsperrt, da das Betriebssystem dies benötigt, und das Laufwerk D wird später entsperrt .

  1. Gemäß der Antwort von Max ( /dba//a/175115 ) wurde mein Problem durch Deaktivieren von "Fast Startup" behoben. Laut dem Artikel, auf den Max verweist ( https://www.howtogeek.com/243901/the-pros-and-cons-of-windows-10s-fast-startup-mode/ ), ist es ziemlich dunkel, im " Wählen Sie, was die Netzschalter tun "und dann" Einstellungen ändern, die derzeit nicht verfügbar sind ".
  2. Im Gegensatz zu Venvigs Antwort ( /dba//a/226115 ) hat das Setzen des "SQL Server" -Dienstes auf Startup Type = "Automatic (Delayed Start)" auch mein Problem behoben (mit Windows'Fast Startup re aktiviert).
Thierry_S
quelle
0

Ich bin oft auf dasselbe Problem gestoßen und dachte, ich sollte meine Lösung teilen (ungeachtet der bereits gegebenen Antworten):

Ich habe also zwei SQL-Instanzen (SQL 2008 und SQL 2017). Der Fehler tritt nicht in meiner SQL08-Instanz, sondern in SQl17 auf. Dies wird durch die "Kontoanmeldeinformationen" verursacht, die während der Installation / Einrichtung jeder SQL-Instanz bereitgestellt werden:

Geben Sie hier die Bildbeschreibung ein

Dies kann unter Windows-Dienste angezeigt werden. SQL08 wurde so eingestellt, dass es das "lokale Systemkonto" verwendet, während das fehlerhafte SQL17 während des Setups auf "NETWORK ACCOUNT" gesetzt wurde. Ändern Sie dies einfach und starten Sie den SQL-Dienst hier neu (oder starten Sie die Instanz im SQL-Browser neu).

Der zweite Teil dieses Problems betrifft SQL Server 2017 CTP 2.0, wenn SQL Server Management Studio V17 verwendet wird. In diesem Fall hat das SMO auf " sys.dm_os_enumerate_fixed_drives " anstelle der alten " xp_fixeddrives " umgestellt , um Informationen zum freien Speicherplatz Ihrer lokalen Festplatte abzurufen . Um dies zu umgehen, rufen Sie den DEVICE MANAGER auf und deaktivieren Sie das angegebene Laufwerk vorübergehend (in meinem Fall war Laufwerk "G", das nur mein DVD-ROM-Laufwerk ist).

Chagbert
quelle
0

Dieses Problem hat mich auch irritiert. Ich habe 5 DBs an meine SQL Server-Instanz angeschlossen, von denen 3 einwandfrei funktionieren, aber 2 sich beschweren

Das Betriebssystem hat den Fehler 21 (Das Gerät ist nicht bereit.) Während eines Lesevorgangs mit dem Offset 0x00000000204000 in der Datei 'E: \ xxxxxxxx.mdf' an SQL Server zurückgegeben.

Hier ist meine Lösung.

  1. Aktivieren Sie Services.msc , suchen Sie den Dienst SQL Server (Instanzname) , klicken Sie mit der rechten Maustaste und starten Sie ihn neu.
  2. Gehen Sie zurück zu ssms, aktualisieren Sie Ihre Datenbank, und die Dinge sollten funktionieren.

Nebenbei bemerkt habe ich versucht, db offline / online zu verwenden. In meinem Fall hat es nicht funktioniert. Brute Force Neustart des SQL Server-Dienstes funktionierte gut. Dies könnte ein Problem für diejenigen sein, deren Einsatz, alle DBs offline zu schalten, zu hoch ist. Wenn Sie jedoch nur lokale Entwicklung wie ich durchführen, sollte diese Lösung in Ordnung sein.

Ji_in_coding
quelle