Risoluzione degli Errori dei File MDF di SQL Server su Windows Server

I file MDF (Master Database File) sono i componenti critici che fungono da file di dati principale in SQL Server, contenendo tutti i dati utente come tabelle, indici, stored procedure, viste e altri oggetti del database. Questo file contiene sia lo schema che i dati effettivi, rendendolo la parte più importante di qualsiasi database SQL Server. L'estensione .mdf identifica questo file primario che interagisce con i file di registro (.ldf). I file MDF richiedono un rilevamento rapido e metodi di ripristino adeguati in caso di danneggiamento per ridurre al minimo la perdita di dati.

La corruzione del database SQL Server richiede un rilevamento rapido e metodi di ripristino adeguati per ridurre al minimo la perdita di dati. I segnali di danneggiamento dei file MDF aiutano ad agire rapidamente in caso di problemi.

Tipi e Sintomi Comuni degli Errori MDF

Se i problemi del sistema operativo, del driver o dell'hardware causano condizioni di lettura in scrittura o non aggiornate nel percorso di I/O, è possibile che vengano visualizzati messaggi di errore correlati all'integrità dei dati, ad esempio errori 605, 823, 3448 e 3456 in SQL Server. SQL Server ha rilevato un errore di I/O basato sulla coerenza logica: lettura non aggiornata. Questo errore si è verificato durante una pagina nell'ID del database in corrispondenza dell'offset nel file . Per informazioni più dettagliate, vedere i messaggi aggiuntivi nel log degli errori di SQL Server e nel registro eventi di sistema. Si tratta di una condizione di errore grave che può compromettere l'integrità del database e che deve essere corretta immediatamente.

Esempi di Log degli Errori Correlati

  • 2003-07-24 16:43:04.57 spid63 ... 2003-07-24 16:52:40.99 spid63 Could not undo log record (63361:16876:181), for transaction ID (0:159696956), on page (1:7040977), database 'pubs' (database ID 12). Page information: LSN = (63192:958360:10), type = 2.
  • 2010-02-06 15:57:24.14 spid17s Could not redo log record (58997:5252:28), for transaction ID (0:109000187), on page (1:480946), database 'MyDatabase' (database ID 17). Page: LSN = (58997:5234:17), type = 3. Log: OpCode = 2, context 5, PrevPageLSN: (58997:5243:17).
  • Errore: 3456, gravità: 21, stato: 1 Non è stato possibile ripetere il record del log (276666:1664:19), per l'ID transazione (0:825853240), nella pagina (1:1787100), database 'authors' (7). Pagina: LSN = (276658:4501:9), tipo = 1.

Al momento o segnalando questo errore, la cache di lettura contiene una versione precedente della pagina o i dati non sono stati scritti correttamente nel disco fisico. Poiché una lettura non aggiornata o una scrittura persa comporta l'archiviazione dei dati che non è prevista, può verificarsi un'ampia gamma di comportamenti. Alcuni clienti hanno segnalato righe mancanti dopo aver eseguito attività di conteggio delle righe. Questo problema si verifica a causa di una scrittura persa. Forse, la pagina doveva essere collegata alla catena di pagine dell'indice cluster.

Microsoft ha anche notato condizioni che non soddisfano i criteri per l'errore 605 o 823, ma sono causate dalla stessa attività di lettura o di scrittura non aggiornata. In alcuni casi, una pagina sembra essere aggiornata due volte, ma con lo stesso valore LSN. Questo comportamento può verificarsi se l'ID oggetto e l'ID pagina sono corretti (pagina già allocata all'oggetto) e viene apportata una modifica alla pagina e scaricata sul disco. Il recupero della pagina successiva restituisce un'immagine precedente e quindi viene apportata una seconda modifica. Il log delle transazioni di SQL Server indica che la pagina è stata aggiornata due volte con lo stesso valore LSN. Questa azione diventa un problema quando si tenta di ripristinare una sequenza di log delle transazioni o con problemi di coerenza dei dati, ad esempio errori di chiave esterna o voci di dati mancanti.

Leggi anche: Installare OBS Studio: la guida definitiva

Altri errori che indicano problemi con i file MDF includono:

  • Failed to retrieve data for this request. xxx.mdf is not a primary database file.
  • Attach database failed for Server ‘xxx’.
  • The header for file ‘xxx.mdf’ is not a valid database file header.
  • SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0x2abc3894; actual: 0x2ebe208e). It occurred during a read of page (1:1) in database ID 12 at offset 0x00000000002000 in file ‘xxx.mdf’. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB).
  • 2003-03-29 09:51:41.12 spid57 Sort read failure (bad page ID). pageid = (0x1:0x13e9), dbid = 2, file = e:\program files\Microsoft SQL Server\mssql\data\tempdb.mdf.

Tabella: Codici di Errore Comuni e Loro Possibili Cause

Codice Errore SQL Server Descrizione Breve Causa Potenziale
605, 823, 3448, 3456 Errori di integrità dei dati / I/O logico Problemi I/O (lettura non aggiornata, scrittura persa), cache hardware, driver
"Accesso Negato" (OS Error 5) Impossibile creare/aprire file MDF Permessi insufficienti al file system, blocco file, UAC
"Non è possibile connettersi a FABIO\SQLEXPRESS" Errore di connessione a SQL Server Nome istanza errato, SQL Server non accessibile, problemi di rete/firewall
"The header for file ‘xxx.mdf’ is not a valid database file header" File MDF non riconosciuto come database valido Corruzione del file MDF, file non primario, tentativo di allegare file di log
"incorrect checksum" Errore di coerenza logica I/O Corruzione dei dati, problemi hardware sottostanti, driver
"An attempt to attach an auto-named database for file..." Impossibile collegare database Database con lo stesso nome già esistente, file non apribile, file su condivisione UNC senza autorizzazioni

Cause degli Errori e Diagnostica

Se si riceve uno dei messaggi di errore elencati nella sezione Sintomi e non sono spiegati da un evento come un errore di unità fisica, esaminare eventuali problemi noti con SQL Server, il sistema operativo, i driver e l'hardware. Per illustrare, Microsoft ha confermato scenari in cui una chiamata API WriteFile restituisce uno stato di esito positivo, ma una lettura immediata dello stesso blocco di dati restituisce dati meno recenti, inclusi i dati probabilmente archiviati in una cache di lettura hardware. In alcuni casi, questo problema si verifica a causa di un problema di lettura della cache.

SQL Server ha introdotto nuove funzionalità di diagnostica di I/O a partire da SQL Server 2000 Service Pack 4 e queste funzionalità di diagnostica fanno parte del prodotto da allora. In SQL Server 2017 e versioni successive questa funzionalità di diagnostica è abilitata per impostazione predefinita. In SQL Server 2016 e versioni precedenti queste funzionalità di diagnostica possono essere abilitate solo usando il flag di traccia 818. Il flag di traccia 818 abilita un buffer circolare in memoria usato per tenere traccia delle ultime 2.048 operazioni di scrittura riuscite eseguite dal computer che esegue SQL Server, senza includere operazioni di ordinamento e I/O del file di lavoro. Quando si verificano errori come 605, 823 o 3448, il valore LSN (Log Sequence Number) del buffer in ingresso viene confrontato con l'elenco di scrittura recente. Se l'LSN recuperato durante l'operazione di lettura è precedente a quello usato nell'operazione di scrittura, viene registrato un nuovo messaggio di errore nel log degli errori di SQL Server.

La maggior parte delle operazioni di scrittura di SQL Server si verifica come checkpoint o come scritture lazy (una scrittura differita è un'attività in background che usa operazioni di I/O asincrone). Il messaggio seguente non mostra errori espliciti dall'API WriteFile o dall'API ReadFile chiama sql Server. Gli operatori di SQL Server sort eseguono attività di I/O, in genere nel tempdb database. Queste operazioni di I/O sono simili alle operazioni di I/O del buffer; Tuttavia, sono già stati progettati per usare la logica di ripetizione dei tentativi di lettura per provare a risolvere problemi simili. In alcuni casi, il problema potrebbe non essere specifico di una cache hardware. Potrebbe trattarsi di un problema con un driver di filtro. I comportamenti indicati nel paragrafo precedente indicano un problema di memorizzazione nella cache di lettura e vengono spesso risolti disabilitando la cache di lettura. Le azioni descritte nel paragrafo precedente forzano in genere un invalidamento della cache e le letture riuscite che si verificano mostrano che il supporto fisico viene aggiornato correttamente.

Risoluzione degli Errori di Corruzione dei File MDF

1. Ripristino da Backup

Il metodo di ripristino più affidabile inizia con il ripristino da un backup recente. Questo approccio evita la corruzione dei dati riportando il database a uno stato integro. È possibile utilizzare il comando RESTORE DATABASE con i parametri FROM DISK appropriati per riportare il database allo stato precedente alla corruzione.

Leggi anche: Guida a Haiku Deck per Windows

2. Utilizzo di DBCC CHECKDB e Opzioni di Riparazione

SQL Server fornisce metodi nativi e gratuiti per riparare la corruzione dei file MDF. Eseguire una verifica di coerenza del database (DBCC CHECKDB). Le opzioni di riparazione presentano dei rischi. REPAIR_ALLOW_DATA_LOSS potrebbe rimuovere completamente le pagine danneggiate, causando la perdita permanente di dati. Ignora inoltre i vincoli di chiave esterna, che possono compromettere l'integrità relazionale tra le tabelle. Questo comando esamina una sola tabella anziché l'intero database. Gli amministratori del database ottengono l'accesso in sola lettura tramite la modalità di emergenza in caso di errore dell'accesso normale. Il processo ricostruisce il log delle transazioni, ma si perde la coerenza transazionale e si interrompe la catena di ripristino.

Se si verifica l'errore 3448 quando si tenta di eseguire il rollback di una transazione con errore 605 o 823, l'istanza di SQL Server chiude automaticamente il database e tenta di aprirla e ripristinarla. La prima pagina in cui si verifica l'errore 605 o 823 è considerata una pagina non valida e l'ID pagina viene mantenuto dal computer che esegue SQL Server. Durante il ripristino (prima della fase di rollforward) quando viene letto l'ID pagina non valido, i dettagli principali relativi all'intestazione della pagina vengono registrati nel log degli errori di SQL Server.

3. Strumenti di Terze Parti per il Recupero

Se i metodi manuali sopra indicati falliscono, puoi provare strumenti professionali, come DataNumen SQL Recovery, che ti aiuta a riparare i file MDF danneggiati che SQL Server gli strumenti integrati non sono in grado di gestire questo tipo di file. Vedrai una barra di avanzamento che mostra come procede la riparazione. Le aziende con diversi database danneggiati risparmieranno tempo grazie alla riparazione in batch. È possibile aggiungere tutti i file MDF danneggiati a una coda, impostare le preferenze di output e avviare il ripristino. DataNumen SQL Recovery fa più del recupero standard. Solitamente i metodi standard non riescono a riparare i database crittografati dal malware. DataNumen SQL Recovery sfrutta algoritmi speciali per ottenere dati da file MDF crittografati da ransomware senza pagare gli aggressori. Se i file MDF sono stati recuperati da DataNumen Data Recovery (o altri strumenti di recupero dati) non possono essere allegati in SQL Server, questi file potrebbero ancora essere danneggiati.

4. Servizi di Recupero Online

I servizi online offrono un modo diverso per riparare i database SQL quando scaricare e installare un software di recupero non è possibile o non è conveniente. Questi servizi cloud funzionano con SQL Server file di database come .mdf, .ndf e .ldf. Gli strumenti di recupero offline offrono maggiore controllo e privacy, ma richiedono maggiori competenze tecniche. La maggior parte dei servizi online consente di testarne l'efficacia con demo gratuite. La scelta migliore tra recupero online e offline dipende dalle tue esigenze.

Gestione dei Problemi di Connessione e Permessi

Spesso, gli errori relativi ai file MDF non derivano dalla loro corruzione intrinseca, ma da problemi di accesso o connessione all'istanza di SQL Server.

Leggi anche: Scopri come lavorare con i file MDF

Un errore comune è: "Non è possibile connettersi a FABIO\SQLEXPRESS. Si è verificato un errore di rete o specifico dell'istanza mentre si cercava di stabilire una connessione con SQL Server. Il server non è stato trovato o non è accessibile. Verificare che il nome dell'istanza sia corretto e che SQL Server sia configurato in modo da consentire connessioni remote." Questo può accadere dopo l'installazione o la riconfigurazione del sistema operativo e dei software.

Un altro scenario frequente è quello legato ai permessi del file system. Ad esempio: "CREATE FILE encountered operating system error 5(Accesso Negato) etc. etc." o "Unable to open physical file 'c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\TestDB.mdf ' .Operating system error 5(Accesso Negato)". Questi errori indicano che l'account utente o di servizio che tenta di accedere o creare il file MDF non ha le autorizzazioni necessarie a livello di sistema operativo. Questo si manifesta anche con il messaggio "Autorizzazioni insufficienti per aprire il file."

Anche se si utilizza l'autenticazione Windows per SQL Express e si sono dati "TUTTI i privilegi su TUTTI gli utenti presenti" nella cartella Microsoft SQL Server, il problema potrebbe persistere a causa di come Windows gestisce i permessi o a causa di processi che tengono bloccato il file. Un tentativo di allegare un database con un file MDF può fallire anche con il messaggio: "An attempt to attach auto-named database for file c:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\TestDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share." Questo sottolinea l'importanza non solo dei permessi, ma anche della disponibilità del file e della corretta gestione dei nomi dei database.

La gestione di un database che risiede su un'unità di rete "Z" mentre MS SQL SERVER risiede sul PC locale "C" introduce ulteriori complessità legate alla rete e alle autorizzazioni UNC (Universal Naming Convention) sulla condivisione. Il problema con SQLite riscontrato da un utente, dove cercava di scrivere nella cartella condivisa ma non aveva password e nome utente per farlo, è un esempio calzante di come le credenziali di rete possano influenzare l'accesso ai file di database.

Prevenzione e Monitoraggio

Prevenire è meglio che curare. La manutenzione regolare del database, le corrette procedure di backup e il monitoraggio dello stato del disco riducono sostanzialmente i rischi di corruzione. L'ottimizzazione delle prestazioni diventa il passo successivo una volta verificata l'integrità dei dati. Il team principale dovrebbe innanzitutto ricostruire gli indici più utilizzati per ripristinare rapidamente le prestazioni sui sistemi critici. L'opzione CHECKSUM verifica l'integrità del backup durante l'operazione. Il monitoraggio proattivo aiuta a rilevare potenziali problemi prima che danneggino i dati. Monitoraggio di Azure o SQL Server Management Studio possono configurare questi avvisi.

Si noti che Microsoft ha confermato che in caso di carichi di I/O rari e pesanti, alcune piattaforme hardware possono restituire una lettura non aggiornata. SQL Server richiede che i sistemi supportino il recapito garantito ai supporti stabili, come descritto nei requisiti del programma di affidabilità di I/O di SQL Server. Se si verifica uno dei comportamenti o se si è sospetti di problemi simili insieme alla disabilitazione dei meccanismi di memorizzazione nella cache, Microsoft consiglia vivamente di ottenere l'aggiornamento più recente per SQL Server.

tags: #windows #server #errore #mdf