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

I modi per correggere SQL Server hanno rilevato un errore di I/O basato sulla coerenza logica

Riepilogo: Il problema dell'inaccessibilità del database SQL è il problema comune affrontato dagli utenti del database. Quindi questo blog sulla risoluzione dei problemi discuterà di SQL Server rilevato un errore di I/O basato sulla coerenza logica. Discuteremo il motivo di questo errore e i modi migliori per sapere come affrontare questo problema. Per accedere e recuperare il database SQL inaccessibile, l'utente può avvalersi dell'aiuto dello strumento Recupera database di SQL Server.

Motivi dietro l'errore di I/O basato sulla coerenza logica del database:

  • Arresto/arresto anomalo del sistema improvviso o arresto forzato
  • L'amministratore SQL tenta di eseguire query o modificare i dati SQL

Quando un database di SQL Server rileva un errore basato sulla coerenza logica, il passaggio iniziale consiste nel rilevare l'errore.

Le strategie di accompagnamento possono aiutare a rilevare l'errore:

  • Utilizza lo strumento Best Practice Analyzer (BPA):lo strumento BPA aiuta a identificare gli errori di coerenza di base. Questo strumento è esplicito per la variante SQL, il che significa che BPA 2008 è accessibile con SQL 2008, ecc.
  • Controlla il sistema Windows a livello di struttura del registro eventi, gli errori relativi al driver o al disco
  • Verifica la rispettabilità del framework dei file eseguendo l'ordine chkdsk
  • Esegui la diagnostica suggerita dai produttori di hardware per il framework o il disco
  • Per SQL Server 2008, eseguire l'utilità SQLIOSim sull'unità del database che ha annunciato un errore di I/O.
  • Contattare il venditore di hardware o il produttore del dispositivo per verificare che i prerequisiti hardware corrispondano alle necessità di I/O del server SQL.

I metodi manuali per affrontare SQL Server hanno rilevato un errore di I/O basato sulla coerenza logica

Tecnica 1:verifica dell'hardware e della rete applicativa

L'errore di irregolarità del database può essere corretto creando una rete appropriata tra il database e l'applicazione SQL.

Tecnica 2:ripristino da backup SQL

La soluzione più possibile consiste nell'utilizzare il backup per il ripristino del database SQL. Prima di eseguire il ripristino dal backup, assicurati che:

  • Hai un backup completo in corso
  • Il backup è aggiornato, solo prima della corruzione, e non molto vecchio per mantenere una distanza strategica dalla perdita di dati di base.
  • La corruzione è a livello di pagina, poiché i problemi di corruzione a livello di pagina possono essere risolti con l'assistenza del ripristino a livello di pagina.

Passaggio 1: Utilizzare l'ordine di accompagnamento per ripristinare il database SQL da un backup completo

Esegui il backup del registro delle transazioni

Backup LOG PageLevelRestores TO

Piatto ='g:PageLevelRestores_LOG1.bak'

CON INIT

Vai

Passaggio 2: Esegui la modifica del ripristino per rispecchiare le progressioni online.

Esegui il backup della coda del registro...

Backup LOG PageLevelRestores TO

Cerchio ='g:PageLevelRestores_LOG_TAIL.bak'

CON INIT

Vai

Nota:non esiste alcun motivo valido per ripristinare l'intero database del server SQL se il danneggiamento è associato a una singola pagina. Puoi ripristinare il database dal backup accessibile per quella pagina che è minata. L'esecuzione degli ordini di accompagnamento aiuterà a ripristinare il backup per una pagina solitaria:

Ripristina tutti i backup dei log accessibili nella richiesta corretta

Ripristina LOG PageLevelRestores DA

Cerchio ='g:PageLevelRestores_LOG1.bak'

CON NORECOVERY

Vai

Infine, ripristina il backup del registro di coda

Ripristina LOG PageLevelRestores DA

Cerchio ='g:PageLevelRestores_LOG_TAIL.bak'

CON NORECOVERY

Vai

Infine, completa la sequenza di ripristino

Ripristina DATABASE PageLevelRestores CON RECOVERY

Vai

Quando il backup del database ha ripristinato il database SQL, eseguire nuovamente la query DBCC CHECKDB per verificare che la dichiarazione di selezione prevalga senza errori di I/O basati sulla coerenza logica del database SQL. Questo ordine controlla inoltre che non vi sia alcuna perdita di dati in questa tabella.

Limitazioni del backup del database SQL:

  1. È assurdo aspettarsi di eseguire il ripristino dal backup del database SQL quando il backup accessibile non è aggiornato.
  2. Nella remota possibilità che l'errore di I/O basato sulla coerenza logica sia diffuso nel database del server SQL, a quel punto questa strategia non sarà legittima.
  3. Per quelle situazioni in cui la pagina difettosa è presente in un indice non cluster, il database SQL può essere corretto eliminando e ricreando l'indice del database SQL.

Tecnica 3:ripara il database SQL corrotto con REPAIR_ALLOW_DATA_LOSS

REPAIR_ALLOW_DATA_LOSS è il livello fisso di base per gli errori analizzati.

Note:prima di utilizzare REPAIR_ALLOW_DATA_LOSS, eseguire l'accompagnamento:

Fai un backup del database del server SQL e salvalo con un altro nome

Imposta il database SQL in modalità Utente singolo

Ottieni il conteggio dei record di tutte le tabelle utilizzando i comandi associati

Proclama @COUNT INT

Proclama @SQL VARCHAR(2000)

Crea TABLE #T_Info(ID INT IDENTITY(1,1),T_Name VARCHAR(200),D_Count INT)

Proclama TINFO_CUR CURSOR FOR

SELEZIONARE TABLE_NAME DA INFORMATION_SCHEMA.TABLES

WHERE TABLE_TYPE='TABELLA DI BASE'

APRI TINFO_CUR

Ottieni NEXT FROM TINFO_CUR IN @T_Name

WHILE @@FETCH_STATUS =0

Inizia

SET @SQL='INSERT INTO #T_Info(T_Name,D_Count) SELECT ”'[email protected]_Name+”',COUNT(*) FROM '[email protected]_Name+”

ESEGUI (@SQL)

Ottieni NEXT FROM TINFO_CUR IN @T_Name

FINE

CHIUDI TINFO_CUR

DEALLOCATE TINFO_CUR

SELEZIONA * DA #T_Info ORDINA PER T_NAME

I progressi di accompagnamento aiutano a correggere il database SQL e a risolvere errori di I/O coerenti basati sulla coerenza:

Esegui il comando:

DBCC CHECKDB (DB_NAME, REPAIR_ALLOW_DATA_LOSS)

Una volta che il database SQL è stato corretto, ripetere la procedura di "Conteggio record tabella" e confrontare con il conteggio dei record precedenti.

Non deve esserci alcuna distinzione tra il conteggio iniziale e l'ultimo record della tabella.

Vincoli :

REPAIR_ALLOW_DATA_LOSS può correggere l'errore di I/O basato sulla coerenza logica del database, ma esiste un problema significativo di perdita di dati, in cui una connessione potrebbe subire la perdita di dati di base.

Soluzione elettiva

Se le tecniche di cui sopra non funzionano, a quel punto, dai un'occhiata a uno strumento SysTools SQL File Repair . Questo strumento risolve i file MDF e NDF corrotti e ripristina tutti gli oggetti del database. Inoltre, questo strumento aiuta a recuperare tutti gli oggetti del database come tabelle, trigger, indici, chiavi, regole, file eliminati e stored procedure. È di incredibile aiuto nel bel mezzo di un'emergenza, poiché il prodotto offre una soluzione di riparazione inconfondibile e supporta tutte le versioni del database SQL.

Conclusione

Leggi anche: Come verificare se il database SQL è danneggiato 

In questo post, abbiamo descritto il motivo per cui SQL Server ha rilevato un errore di I/O basato sulla coerenza logica e le tecniche per risolvere questo problema.

Alla luce dell'errore, abbiamo cercato di individuare la tecnica giusta. Nella remota possibilità che l'hardware o il framework siano responsabili dell'errore, è prescritto per determinare i problemi relativi all'hardware e, nel caso in cui DBCC CHECKDB segnali un errore di coerenza, a quel punto tentare di ripristinare il database SQL utilizzando un backup aggiornato.

Se il problema non viene risolto con l'hardware e il backup, a quel punto provare a riparare il database con l'assistenza di REPAIR_ALLOW_DATA_LOSS. Questo è il grado di correzione di base per determinare tutti gli errori da CHECKDB, ma ciò non implica che risolverà davvero l'errore. Inoltre, potrebbe causare la perdita di dati.