sql >> Database >  >> RDS >> Sqlserver

Omgaan met zeer ernstige fouten in SQL Server

In mijn vorige artikel over SQL Server Agent-waarschuwingen heb ik stapsgewijze instructies gegeven voor het instellen en configureren van SQL Agent-waarschuwingen voor zeer ernstige fouten 19-25 en voor fout 825. In dit artikel ga ik bespreek deze fouten in detail en deel wat u moet doen als ze zich voordoen in uw omgeving.

Fouten met een ernstniveau van 19 of hoger zorgen ervoor dat de huidige batch niet wordt voltooid. Fouten met een ernst van 20 en hoger zijn fatale fouten en beëindigen de huidige clientverbinding. Deze fouten kunnen ook van invloed zijn op alle processen in de database. Fatale fouten zijn precies wat de naam aangeeft:het lopende proces wordt beëindigd en de clientverbinding wordt gesloten.

Ernst 19 fouten

Een Ernst 19-fout is een fout vanwege het ontbreken van een bron. Dit betekent dat een interne limiet (die u niet kunt configureren) is overschreden en ervoor heeft gezorgd dat de huidige batch is beëindigd. Deze fouten komen zelden voor en er is weinig dat u kunt doen om het probleem op te lossen. Als er een ernst 19-fout optreedt, moet u contact opnemen met uw primaire ondersteuningsprovider; typisch zou dat Microsoft zijn.

In al mijn jaren dat ik met SQL Server heb gewerkt, kan ik me geen enkel incident herinneren waarbij een fout van ernst 19 werd gegenereerd. Zelfs als ik in Bing zocht, had ik problemen met het vinden van de fout; de weinige verwijzingen die ik vond hadden betrekking op een vroege versie van SQL Server en verwezen naar een bug in SQL Server zelf.

Severity 20 fouten

Een Ernst 20-fout is een fatale fout in het huidige proces. Dit geeft aan dat er een probleem is opgetreden met een instructie en is beëindigd. Aangezien dit alleen het huidige proces beïnvloedt, is het zeer onwaarschijnlijk dat de database zelf is beschadigd. Deze fouten zijn gekoppeld aan een individuele verklaring, dus u moet de volledige foutmelding verzamelen en contact opnemen met de persoon of het team dat verantwoordelijk is voor dat stukje code. Dit kan intern zijn of mogelijk de leverancier van de applicatie. Een voorbeeldfout is:

Error:18056, Severity 20, State:29
De client kon een sessie met SPID 123, die was gereset voor pooling van verbindingen, niet opnieuw gebruiken.

Voor deze fout zou ik contact opnemen met de ontwikkelaar of leverancier van de toepassing, omdat de fout verband houdt met een gepoolde verbinding die een fout tegenkomt bij het proberen te resetten. Ik zou ook de SQL Server-logboeken bekijken, die mogelijk een meer gedetailleerd foutbericht bevatten over wat er feitelijk gebeurt om de fout te veroorzaken.

Fouten Ernst 21

Een Severity 21-fout is een fatale fout in de database die van invloed is op alle processen die die database gebruiken.

Ik heb deze fout zien optreden bij het herstellen van een database met Enterprise-functies naar een Standard Edition-instantie, evenals wanneer een database beschadigd is en de gebruiker probeert toegang te krijgen tot een corrupte pagina. Een voorbeeld van een foutmelding van dit type is:

Fout:605, Ernst:21, Status 1
Poging om logische pagina (1:8574233) op te halen in database 'DB_NAME' hoort bij object '0', niet bij object 'Table01'.

Wanneer u probeert een database die Enterprise-functies gebruikt te herstellen naar een Standard Edition-instantie, moet u eerst de Enterprise-functies verwijderen. Als u bijvoorbeeld gegevenscompressie gebruikt of het vastleggen van gegevens wijzigt, moet u eerst stoppen met het gebruik en deze functies uit de database verwijderen, een back-up van de database maken en deze vervolgens terugzetten naar de Standard Edition-instantie. U kunt de DMV sys.dm_db_persisted_sku_features gebruiken om te controleren of u alleen Enterprise-functies in gebruik heeft.

Voor de corruptiefouten moet u DBCC CHECKDB uitvoeren om de omvang van de corruptie te bepalen en van daaruit verder te gaan. Als u geluk heeft, bevindt de fout zich in een niet-geclusterde index die u opnieuw kunt opbouwen en het probleem kunt oplossen. Als de corruptie ernstiger is, zou u een herstelbewerking kunnen overwegen. Om corruptie beter te begrijpen en hoe verschillende aspecten van corruptie op te lossen, raad ik je aan om de verschillende blogposts van Paul Randal te lezen. Paul heeft een hele categorie over corruptie die je hier kunt bekijken:

  • http://www.sqlskills.com/blogs/paul/category/corruption/

DBCC CHECKDB uitvoeren als onderdeel van een regelmatig geplande taak tegen uw databases wordt sterk aanbevolen om corruptie zo vroeg mogelijk op te sporen. Als u niet regelmatig op corruptie controleert, loopt u een groot risico dat u de corrupte gegevens niet kunt herstellen.

Severity 22-fouten

Een Ernst 22-fout is een fatale fout omdat de integriteit van de tabel verdacht is, wat in feite aangeeft dat de in het bericht gespecificeerde tabel of index is beschadigd. Corruptie komt voor en komt vaak voor. Onze ervaring is dat de meeste corruptie optreedt als gevolg van een I/O-subsysteem-gerelateerd probleem. Als u een Ernst 22-fout tegenkomt, moet u DBCC CHECKDB uitvoeren om de omvang van de schade vast te stellen. Een voorbeeldfout is:

Fout:5180, Ernst:22, Staat:1
Kon XYZ niet openen voor ongeldige bestands-ID ## in database. Tabel of database is mogelijk beschadigd.

Als de fout zich in een niet-geclusterde index bevindt, kunt u de index gewoon opnieuw opbouwen en de corruptie herstellen. Als de beschadiging zich in een heap- of geclusterde index bevindt, moet u de database in een consistente staat herstellen.

Ik heb rapporten gezien waarin de corruptie in het geheugen zat, maar niet op de schijf. In dat geval zou een herstart van de instantie of het offline en vervolgens online instellen van de database de fout moeten verhelpen.

Severity 23 fouten

Een Ernst 23-fout is een andere fatale fout die meldt dat de database zelf een integriteitsprobleem heeft. De oplossing lijkt veel op die van een Ernst 22-fout, waarbij u onmiddellijk DBCC CHECKDB moet uitvoeren om de volledige omvang van de schade aan de database te achterhalen.

Dit niveau van corruptie wordt gedetecteerd als een effect op de hele database. Dit kan corruptie zijn in het gegevensbestand zelf of corruptie in het logbestand. De details van de fout leiden u naar het hoofdprobleem. De volgende fout wijst er bijvoorbeeld op dat we onze database moeten herstellen of moeten proberen het logboek opnieuw op te bouwen. Voor consistentie zou ik herstellen van mijn meest recente back-up en alle beschikbare back-ups van transactielogboeken.

Fout:9004, Ernst:23 Status:6
Er is een fout opgetreden tijdens het verwerken van het logboek voor database 'db_name'. Herstel indien mogelijk vanaf een back-up. Als er geen back-up beschikbaar is, kan het nodig zijn om het logboek opnieuw op te bouwen.

Severity 24 fouten

Een Ernst 24-fout is een fatale fout met betrekking tot een hardware. Dit bericht wordt weergegeven als gevolg van een soort mediafout. De meest voorkomende van dit soort fouten die ik heb gezien, hebben te maken met problemen met geheugen en I/O-fouten. Bijvoorbeeld:

Fout:832, Ernst:24, Staat:1
Een pagina die constant had moeten zijn, is gewijzigd (verwachte controlesom:, werkelijke controlesom:, database , bestand , pagina ). Dit duidt meestal op een geheugenfout of andere hardware- of OS-corruptie.

Wanneer dergelijke fouten optreden, moet u contact opnemen met uw systeemondersteuningsteam om een ​​geheugentest op uw server uit te voeren en de server een goede gezondheidscontrole te geven. Deze fout kan een slecht geheugen zijn of een geheugenkrabbel (een kernelproces of iets dat het geheugen van SQL Server verandert).

Nog een voorbeeld:

Fout:824, Ernst:24, Staat:2
SQL Server heeft een logische, op consistentie gebaseerde I/O-fout gedetecteerd:onjuiste pageid (verwacht 1:123; werkelijke 0:0). Het gebeurde tijdens het lezen van pagina (1:123) in database-ID . Aanvullende berichten in het foutenlogboek van SQL Server of het systeemgebeurtenislogboek kunnen meer details geven.

Deze fout duidt op een consistentiefout in het primaire gegevensbestand van de database. U moet onmiddellijk DBCC CHECKDB uitvoeren om de omvang van de corruptie te bepalen en de juiste actie te ondernemen om de database te herstellen of te herstellen.

Severity 25 fouten

Een Ernst 25-fout is een fatale systeemfout. Ik heb gehoord dat ernst 25 min of meer een verzamelnaam is voor diverse fatale fouten. Ik heb deze fout alleen gezien wanneer deze betrekking had op mislukte upgrades:iets verhindert dat een van de upgradescripts wordt uitgevoerd en er wordt een Error 25-fout gegenereerd. U krijgt dan een foutmelding die lijkt op:

Upgrade op scriptniveau voor database 'master' is mislukt omdat upgradestap 'sqlagent90_sysdbugg.sql' fout 598, status 1, ernst 25 heeft aangetroffen. Dit is een ernstige fout die de normale werking zou kunnen verstoren en de database offline zal worden gehaald. Als de fout is opgetreden tijdens het upgraden van de 'master'-database, wordt voorkomen dat de hele SQL Server-instantie wordt gestart. Controleer de vorige foutenlogboekvermeldingen op fouten, onderneem de juiste corrigerende maatregelen en start de database opnieuw zodat de stappen voor het upgraden van het script worden voltooid.

In dit geval gaven fouten voorafgaand aan dit bericht een onjuist pad aan voor de standaardgegevenslocatie voor SQL Server. Nadat dat was gecorrigeerd, werd de upgrade succesvol uitgevoerd.

Fout 825

Fout 825 wordt vaak de read-retry-waarschuwing genoemd, maar de voorwaarde is voor zowel lees- als schrijfbewerkingen. Deze fout laat u weten dat een nieuwe poging van de bewerking nodig was en hoe vaak SQL Server de poging opnieuw moest proberen voordat deze succesvol was. SQL Server zal de bewerkingen maximaal vier keer opnieuw proberen, na vier pogingen zal het een 823- of 824-fout veroorzaken. Error 825-berichten zien er ongeveer als volgt uit:

Een lezing van het bestand 'pad naar bestandsnaam\db_name.mdf' op offset 0x00000002000 is gelukt na 2 keer falen met fout:onjuiste controlesom (verwacht:XYZ; feitelijk ABC). Aanvullende berichten in het foutenlogboek van SQL Server en het systeemgebeurtenislogboek kunnen meer details geven. Deze foutconditie bedreigt de integriteit van de database en moet worden gecorrigeerd. Voer een volledige databaseconsistentiecontrole uit (DBCC CHECKDB). Deze fout kan door veel factoren worden veroorzaakt; Zie SQL Server Books Online voor meer informatie.

Deze berichten zijn belangrijk omdat ze erop wijzen dat u een groter probleem heeft met uw schijfsubsysteem. Methoden voor probleemoplossing zijn om DBCC CHECKDB uit te voeren om ervoor te zorgen dat de database consistent is, zoals de fout aanbeveelt, en om de Windows-gebeurtenislogboeken te controleren op fouten van het besturingssysteem of opslagapparaten. U moet uw opslag- en hardware-ondersteuningsteam vragen om ook het onderliggende I/O-subsysteem op fouten te controleren.

Samenvatting

Het configureren van SQL Agent-waarschuwingen is gratis en eenvoudig. Proactief zijn en reageren op deze waarschuwingen is belangrijk om de uitvaltijd voor u en uw klanten te minimaliseren. Zoals je nu hebt geleerd, kunnen veel dingen van invloed zijn op SQL Server en de consistentie van je databases, en de beste verdediging om van deze fouten te kunnen herstellen is het hebben van goede back-ups en het kennen van de verschillende herstelopties voor DBCC CHECKDB . Het wordt altijd aanbevolen om DBCC CHECKDB uit te voeren regelmatig tegen uw databases om corruptie zo vroeg mogelijk op te sporen, want hoe sneller u corruptie vindt, hoe groter de kans dat u een back-up van de gegevens hebt, zodat u deze kunt herstellen zonder gegevensverlies.


  1. Een database openen in de exclusieve modus in Access 2016

  2. Haal het teken tussen de eerste 2 speciale tekens in SQL

  3. GROUP_CONCAT() Functie in MySQL

  4. Een experthandleiding voor Slony-replicatie voor PostgreSQL