Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Gestione degli errori di gravità elevata in SQL Server

Nel mio precedente articolo sugli avvisi di SQL Server Agent, ho fornito istruzioni dettagliate su come impostare e configurare gli avvisi di SQL Agent per gli errori di gravità elevata 19-25 e 825. In questo articolo, andrò a discuti in dettaglio di questi errori e condividi cosa dovresti fare se si verificano nel tuo ambiente.

Gli errori con un livello di gravità pari o superiore a 19 impediscono il completamento del batch corrente. Gli errori con una gravità pari o superiore a 20 sono errori irreversibili e interrompono la connessione client corrente. Questi errori possono anche influire su tutti i processi nel database. Gli errori irreversibili sono esattamente ciò che suggerisce il nome:il processo in esecuzione viene terminato e la connessione client viene chiusa.

Errori di gravità 19

Un errore di gravità 19 è un errore dovuto alla mancanza di una risorsa. Ciò significa che un limite interno (che non è possibile configurare) è stato superato e ha causato la fine del batch corrente. Questi errori si verificano raramente e c'è poco che puoi fare per correggere il problema. Se si verifica un errore di gravità 19, contattare il provider di supporto principale; in genere, sarebbe Microsoft.

In tutti i miei anni di lavoro con SQL Server, non riesco a ricordare alcun incidente in cui è stato generato un errore di gravità 19. Anche cercando Bing, ho avuto problemi a trovare le occorrenze dell'errore; i pochi riferimenti che ho trovato erano relativi a una versione precedente di SQL Server e facevano riferimento a un bug all'interno dello stesso SQL Server.

Errori di gravità 20

Un errore di gravità 20 è un errore irreversibile nel processo corrente. Ciò indica che un'istruzione ha riscontrato un problema ed è stata terminata. Poiché ciò influisce solo sul processo corrente, è molto improbabile che il database stesso sia stato danneggiato. Questi errori sono legati a una singola istruzione, quindi dovrai raccogliere l'intero messaggio di errore e contattare la persona o il team responsabile di quel bit di codice. Questo potrebbe essere interno o eventualmente il fornitore dell'applicazione. Un esempio di errore è:

Errore:18056, gravità 20, stato:29
Il client non è stato in grado di riutilizzare una sessione con SPID 123, che era stata reimpostata per il pool di connessioni.

Per questo errore, contattare lo sviluppatore o il fornitore dell'applicazione, poiché l'errore è correlato a una connessione in pool che ha riscontrato un errore durante il tentativo di ripristino. Vorrei anche esaminare i registri di SQL Server che potrebbero avere un messaggio di errore più dettagliato su ciò che sta effettivamente accadendo per causare l'errore.

Errori di gravità 21

Un errore di gravità 21 è un errore irreversibile nel database che interessa tutti i processi che utilizzano quel database.

Ho riscontrato questo errore durante il tentativo di ripristinare un database utilizzando le funzionalità Enterprise in un'istanza dell'edizione standard, nonché quando un database è danneggiato e l'utente tenta di accedere a una pagina danneggiata. Un esempio di messaggio di errore di questo tipo è:

Errore:605, gravità:21, stato 1
Il tentativo di recuperare la pagina logica (1:8574233) nel database 'DB_NAME' appartiene all'oggetto '0', non all'oggetto 'Table01'.

Quando si tenta di ripristinare un database che utilizza le funzionalità Enterprise in un'istanza Standard Edition, sarà necessario rimuovere prima le funzionalità Enterprise. Ad esempio, se si utilizza la compressione dei dati o si modifica l'acquisizione dei dati, sarà necessario prima interrompere l'utilizzo e rimuovere tali funzionalità dal database, eseguire il backup del database e quindi ripristinarlo nell'istanza Standard Edition. Puoi utilizzare il sys.dm_db_persisted_sku_features DMV per verificare se sono in uso funzioni solo Enterprise.

Per gli errori di danneggiamento dovrai eseguire DBCC CHECKDB per determinare l'entità della corruzione e andare da lì. Se sei fortunato, l'errore sarà in un indice non cluster che puoi ricostruire e risolvere il problema. Se il danneggiamento è più grave, potresti essere in attesa di un'operazione di ripristino. Per comprendere meglio la corruzione e come risolvere vari aspetti della corruzione, ti incoraggio a rivedere i vari post sul blog di Paul Randal. Paul ha un'intera categoria sulla corruzione che puoi visualizzare qui:

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

Esecuzione di DBCC CHECKDB come parte di un lavoro pianificato regolarmente sui database, si consiglia vivamente di rilevare la corruzione il prima possibile. Se non controlli regolarmente la corruzione, corri il rischio enorme di non essere in grado di recuperare i dati corrotti.

Errori di gravità 22

Un errore di gravità 22 è un errore irreversibile perché l'integrità della tabella è sospetta, indicando sostanzialmente che la tabella o l'indice specificato nel messaggio è danneggiato. La corruzione accade e accade spesso. La nostra esperienza è che la maggior parte dei danneggiamenti si verifica a causa di un problema relativo al sottosistema di I/O. Se si verifica un errore di gravità 22, sarà necessario eseguire DBCC CHECKDB per determinare l'entità del danno. Un esempio di errore è:

Errore:5180, gravità:22, stato:1
Impossibile aprire XYZ per ID file ## non valido nel database. La tabella o il database potrebbero essere danneggiati.

Se l'errore si trova in un indice non cluster, puoi semplicemente ricostruire l'indice e correggere il danneggiamento. Se il danneggiamento è in un heap o in un indice cluster, dovrai ripristinare il database in uno stato coerente.

Ho visto rapporti in cui il danneggiamento era in memoria ma non su disco. In tal caso, un riavvio dell'istanza o l'impostazione del database offline e quindi online dovrebbe eliminare l'errore.

Errori di gravità 23

Un errore di gravità 23 è un altro errore irreversibile che segnala che il database stesso presenta un problema di integrità. La risoluzione è molto simile a quella di un errore di gravità 22, in cui è necessario eseguire immediatamente DBCC CHECKDB per trovare l'intera portata del danno al database.

Questo livello di danneggiamento viene rilevato come un effetto sull'intero database. Potrebbe trattarsi di un danneggiamento all'interno del file di dati stesso o di un danneggiamento all'interno del file di registro. I dettagli dell'errore ti indirizzeranno verso il problema alla radice. Ad esempio, il seguente errore indica che avremmo bisogno di ripristinare il nostro database o tentare di ricostruire il registro. Per coerenza, ripristinerei dal backup più recente e da tutti i backup del registro delle transazioni disponibili.

Errore:9004, Gravità:23 Stato:6
Si è verificato un errore durante l'elaborazione del registro per il database 'db_name'. Se possibile, ripristina dal backup. Se non è disponibile un backup, potrebbe essere necessario ricostruire il registro.

Errori di gravità 24

Un errore di gravità 24 è un errore irreversibile relativo a un hardware. Questo messaggio verrebbe visualizzato a causa di qualche tipo di errore del supporto. Il più comune di questi tipi di errori che ho visto sono legati a problemi con la memoria e gli errori di I/O. Ad esempio:

Errore:832, gravità:24, stato:1
Una pagina che avrebbe dovuto essere costante è stata modificata (checksum previsto:, checksum effettivo:, database , file , pagina ). Questo di solito indica un errore di memoria o altro hardware o danneggiamento del sistema operativo.

Quando si verificano errori come questo, contattare il team di supporto del sistema per eseguire il test della memoria sul server e sottoporre il server a un buon controllo dello stato. Questo errore potrebbe essere una cattiva memoria o uno scribbler di memoria (un processo del kernel o qualcosa che sta cambiando la memoria di SQL Server).

Un altro esempio:

Errore:824, gravità:24, stato:2
SQL Server ha rilevato un errore di I/O basato sulla coerenza logica:pageid errato (previsto 1:123; effettivo 0:0). Si è verificato durante una lettura della pagina (1:123) nell'ID database . Ulteriori messaggi nel registro degli errori di SQL Server o nel registro degli eventi di sistema possono fornire maggiori dettagli.

Questo errore indica un errore di coerenza nel file di dati primario del database. Dovresti eseguire immediatamente DBCC CHECKDB per determinare l'entità del danneggiamento e intraprendere l'azione appropriata per riparare o ripristinare il database.

Errori di gravità 25

Un errore di gravità 25 è un errore irreversibile di sistema. Ho sentito dire che la gravità 25 è più o meno un catch-all per vari errori fatali. Ho visto questo errore solo in relazione ad aggiornamenti non riusciti:qualcosa impedisce l'esecuzione di uno degli script di aggiornamento e viene generato un errore di gravità 25. Riceveresti un errore simile a:

L'aggiornamento a livello di script per il database "master" non è riuscito perché il passaggio di aggiornamento "sqlagent90_sysdbupg.sql" ha rilevato l'errore 598, stato 1, gravità 25. Questa è una condizione di errore grave che potrebbe interferire con il normale funzionamento e il database verrà portato offline. Se l'errore si è verificato durante l'aggiornamento del database "master", impedirà l'avvio dell'intera istanza di SQL Server. Esaminare le voci del registro degli errori precedenti per individuare eventuali errori, intraprendere le azioni correttive appropriate e riavviare il database in modo che le istruzioni di aggiornamento dello script vengano completate.

In questo caso, gli errori precedenti a questo messaggio indicavano un percorso errato per il percorso dei dati predefinito per SQL Server. Una volta corretto, l'aggiornamento è stato eseguito correttamente.

Errore 825

L'errore 825 viene spesso indicato come avviso di lettura-riprova, tuttavia la condizione riguarda sia le operazioni di lettura che quelle di scrittura. Questo errore indica che era necessario un nuovo tentativo dell'operazione e quante volte SQL Server ha dovuto ripetere il tentativo prima che avesse esito positivo. SQL Server ritenterà le operazioni fino a quattro volte, dopo quattro tentativi genererà un errore 823 o 824. I messaggi di errore 825 saranno simili ai seguenti:

Una lettura del file "percorso del nome del file\db_name.mdf" all'offset 0x00000002000 è riuscita dopo aver fallito 2 volte con errore:checksum errato (previsto:XYZ; ABC effettivo). Ulteriori messaggi nel registro degli errori di SQL Server e nel registro degli eventi di sistema possono fornire maggiori dettagli. Questa condizione di errore minaccia l'integrità del database e deve essere corretta. Completare un controllo completo della coerenza del database (DBCC CHECKDB). Questo errore può essere causato da molti fattori; per ulteriori informazioni, vedere documentazione in linea di SQL Server.

Questi messaggi sono importanti in quanto indicano un problema più grande con il sottosistema del disco. I metodi di risoluzione dei problemi consisterebbero nell'eseguire DBCC CHECKDB per garantire che il database sia coerente, come consigliato dall'errore, nonché per esaminare i registri eventi di Windows per rilevare eventuali errori dal sistema operativo o dai dispositivi di archiviazione. Dovresti chiedere al tuo team di supporto hardware e storage di esaminare anche il sottosistema I/O sottostante per rilevare eventuali errori.

Riepilogo

La configurazione degli avvisi di SQL Agent è semplice e gratuita. Essere proattivi e reattivi a questi avvisi è importante per ridurre al minimo i tempi di inattività per te e i tuoi clienti. Come ora hai imparato, molte cose possono influenzare SQL Server e la coerenza dei tuoi database e la migliore difesa per essere in grado di recuperare da questi errori è avere buoni backup e conoscere le varie opzioni di riparazione per DBCC CHECKDB . Si consiglia sempre di eseguire DBCC CHECKDB regolarmente contro i tuoi database per rilevare il danneggiamento il prima possibile, poiché prima trovi il danneggiamento, più è probabile che venga eseguito il backup dei dati in modo da poter ripristinare senza perdita di dati.