MSSQLSERVER_7105
Si applica a: SQL Server
Dettagli
Attributo | Valore |
---|---|
Nome prodotto | SQL Server |
ID evento | 7105 |
Origine evento | MSSQLSERVER |
Componente | SQLEngine |
Nome simbolico | TXT_PGNOTEXIST |
Testo del messaggio | L'ID database %d, pagina %S_PGID, slot %d per il nodo con tipo di dati LOB non esiste. Questo problema è in genere dovuto a transazioni che possono leggere dati di cui non è stato eseguito il commit da una pagina di dati. Eseguire DBCC CHECKTABLE |
Spiegazione
Una query può riscontrare il messaggio 7105 quando non è possibile accedere ai dati LOB (Large Object) a cui fa riferimento una riga di pagina del database.
Poiché il livello di gravità di questo errore è 22, la connessione viene terminata dal server. Questo messaggio di errore viene scritto anche nel file SQL ERRORLOG e nel log eventi dell'applicazione di Windows con EventID=7105.
Possibili cause
È possibile che questo errore si verifichi a causa di uno dei motivi seguenti:
- È presente un problema di danneggiamento del database all'interno di una pagina del database o all'interno delle strutture di pagina LOB a cui fa riferimento la pagina del database.
- La query che sta riscontrando l'errore usa l'hint per la query
READ UNCOMMITTED ISOLATION LEVEL
oNOLOCK
. - Esiste un problema all'interno del motore di SQL Server che causa l'esito negativo della query con questo errore.
Vedere le sezioni Risoluzione e Ulteriori informazioni per determinare la causa del problema specifico e la soluzione appropriata.
Azione utente
Come indicato nel messaggio, il primo passaggio da eseguire consiste nell'eseguire
DBCC CHECKDB
sul database oDBCC CHECKTABLE
sulla tabella in cui si è verificato il problema.L'ID del database è indicato nel messaggio.
Per individuare la tabella interessata esatta senza eseguire
DBCC CHECKDB
, sarà necessario individuare le tabelle a cui ha avuto accesso la query che ha riscontrato l'errore. Un metodo consiste nell'usare SQL Profiler per tracciare la query. Tuttavia, in SQL Server 2008 (10.0.x) e SQL Server 2008 (10.0.x) R2 è possibile trovare la query usando la sessione eventi estesi system_health. Per altre informazioni su come usare la sessione di system_health, vedere questo collegamento: Usare la sessione di system_health.Come per qualsiasi problema di coerenza del database, è possibile risolvere questi errori eseguendo il ripristino da un backup valido noto che non contiene questo problema.
Tuttavia, se non è possibile eseguire il ripristino da un backup, seguire le raccomandazioni per
DBCC CHECKDB
oDBCC CHECKTABLE
per correggere questi errori. È possibile che ciò provochi la perdita di dati. Per altre informazioni sull'uso di CHECKDB e sulle cause dei problemi di danneggiamento del database, vedere l'articolo Come risolvere gli errori di coerenza del database segnalati da DBCC CHECKDB.
È possibile che questo errore si sia verificato perché la query che accede alla tabella usa un livello di isolamento
READ UNCOMMITTED
o l'hint per la queryNOLOCK
(condizione nota anche come lettura dirty).Se
DBCC CHECKDB
oDBCC CHECKTABLE
non visualizzano alcun errore associato alla tabella e ai dati LOB, la causa più probabile è l'uso di una lettura dirty. In tal caso, è necessario evitare di usare una lettura dirty o ritentare la query.Se si ritiene che questa sia la causa dell'errore, non esiste un problema di coerenza del database effettivo.
Ulteriori informazioni
Se il danneggiamento del database è causato da questo problema, DBCC CHECKDB
e/o DBCC CHECKTABLE
dovrebbero segnalare errori. Tuttavia, questi comandi non segnaleranno il messaggio 7105. Gli errori rilevati da CHECKDB dipenderanno da ciò che risulta danneggiato nel riferimento alle strutture LOB o nelle strutture LOB.
Se la riga della pagina del database non fa riferimento correttamente a una pagina LOB valida, è possibile che vengano visualizzati errori simili ai seguenti:
Messaggio 8929, livello 16, stato 1, riga 1
ID oggetto 2137058649, ID di indice 0, ID di partizione 72057594038910976, ID unità di allocazione 72057594039828480 (tipo Dati riga): errori rilevati nei dati fuori riga con ID 131203072 di proprietà del record di dati identificato da RID = (1:179:1)
Messaggio 8964, livello 16, stato 1, riga 1
Errore di tabella: ID oggetto 2137058649, ID indice 0, ID partizione 72057594038910976, ID unità di allocazione 72057594039894016 (tipo dati LOB). Non esistono riferimenti al nodo di dati all'esterno di righe alla pagina (1:177), slot 1, ID di testo 131203072.
Messaggio 8965, livello 16, stato 1, riga 1
Errore di tabella: ID oggetto 2137058649, ID indice 0, ID partizione 72057594038910976, ID unità di allocazione 72057594039894016 (tipo dati LOB). La pagina (255:177), slot 1 contiene un riferimento al nodo di dati all'esterno di righe alla pagina (1:179), slot 1, ID di testo 131203072, che non è stato rilevato durante l'analisi.Scenari diversi per il problema possono causare diverse combinazioni di errori. In questo esempio:
La pagina del database 1:179, slot 1 fa riferimento a una pagina LOB che non è una pagina valida nel database (pagina 255:177). La pagina (1:177) è una pagina LOB valida ma nessuna pagina di database vi ha mai fatto riferimento. Quindi, in questo caso, il problema è che la riga nello slot 1 della pagina 1:179 fa riferimento alla pagina 255:177 anziché alla pagina 1:177.
La chiave per determinare se gli errori di
DBCC CHECKDB
sono correlati a problemi relativi alle pagine LOB consiste nel cercare le frasi "dati all'esterno di righe" e "tipo Dati LOB".Il messaggio 8929 è un errore correlato alla pagina del database che fa riferimento a pagine LOB.
Il messaggio 8964 è un errore che indica che nessuna pagina di database fa riferimento a una pagina LOB.
Il messaggio 8965 è un errore che indica che una pagina del database fa riferimento a pagine LOB ma non esiste come pagina valida.In molte situazioni che coinvolgono questi tipi di errori, la correzione causerà l'eliminazione delle righe che puntano ai dati LOB e dei dati LOB stessi. L'algoritmo di correzione tenterà di rimuovere solo i frammenti LOB che interessano le righe del database in questione, ma ciò non è garantito in tutte le situazioni a seconda degli elementi danneggiati nella struttura ad albero LOB.
Nell'esempio riportato di seguito, i messaggi restituiti da CHECKTABLE usando
REPAIR_ALLOW_DATA_LOSS
sono simili ai seguenti:Ripristino: record eliminato per l'ID oggetto 2137058649, ID di indice 0, ID di partizione 72057594038910976, ID unità di allocazione 72057594039828480 (tipo dati di riga), nella pagina (1:179), slot 1. Gli indici verranno ricompilati.
Ripristino: colonna di dati all'esterno della riga eliminata con ID 131203072, per ID oggetto 2137058649, ID di indice 0, ID di partizione 72057594038910976, ID unità di allocazione 72057594039894016 (tipo di dati LOB) nella pagina (1:177), slot 1.
Messaggio 8929, livello 16, stato 1, riga 1
ID oggetto 2137058649, ID di indice 0, ID di partizione 72057594038910976, ID unità di allocazione 72057594039828480 (tipo Dati riga): errori rilevati nei dati fuori riga con ID 131203072 di proprietà del record di dati identificato da RID = (1:179:1)
L'errore è stato corretto.
Messaggio 8964, livello 16, stato 1, riga 1
Errore di tabella: ID oggetto 2137058649, ID indice 0, ID partizione 72057594038910976, ID unità di allocazione 72057594039894016 (tipo dati LOB). Non esistono riferimenti al nodo di dati all'esterno di righe alla pagina (1:177), slot 1, ID di testo 131203072.
L'errore è stato corretto.
Messaggio 8965, livello 16, stato 1, riga 1
Errore di tabella: ID oggetto 2137058649, ID indice 0, ID partizione 72057594038910976, ID unità di allocazione 72057594039894016 (tipo dati LOB). La pagina (255:177), slot 1 contiene un riferimento al nodo di dati all'esterno di righe alla pagina (1:179), slot 1, ID di testo 131203072, che non è stato rilevato durante l'analisi.
Impossibile correggere l'erroreL'ultima parte del messaggio
Could not repair this error
è fuorviante. L'errore è stato corretto perché la riga della pagina del database che punta alla pagina non valida (255:177) è stata eliminata.