Risoluzione dei problemi errore DBCC 2570 in SQL Server 2005 e versioni successive

INTRODUZIONE

In questo articolo descrive l'errore di SQL Server 2570, la causa dell'errore e come risolvere il problema.

Ulteriori informazioni

Controlli DATA_PURITY

In SQL Server 2005, una nuova opzione, DATA_PURITY, è stato aggiunto ai comandi DBCC CHECKDB e DBCC CHECKTABLE. Quando si esegue un comando DBCC CHECKDB o DBCC CHECKTABLE con questa opzione è attivata, il comando eseguirà le convalide "purezza dati" su ogni valore di colonna in tutte le righe della tabella o delle tabelle nel database. Questi nuovi controlli vengono eseguiti per garantire che i valori memorizzati nelle colonne siano validi (vale a dire che i valori non sono fuori dell'intervallo per il dominio associato al tipo di dati della colonna). La natura della convalida eseguita dipende dal tipo di dati della colonna. Nel seguente elenco non esaustivo vengono riportati alcuni esempi:
Tipo di dati di colonnaTipo di convalida dei dati eseguita
Carattere UnicodeLa lunghezza dei dati deve essere un multiplo di 2.
DateTimeIl campo giorni deve essere compreso tra 1753 1 gennaio e il 31 dicembre 9999. Il campo ora deve essere antecedente a "11:59:59:999 PM".
Reale e FloatVerificare l'esistenza di valori a virgola mobile non valido, come SNAN, QNAN, NINF, ND, PD, PINF.
Non tutti i tipi di dati vengono verificati per la validità dei dati della colonna. Solo quelli in cui è possibile avere un valore memorizzato non compreso nell'intervallo vengono controllati. Ad esempio, il tipo di dati tinyint ha un intervallo valido compreso tra 0 e 255 ed è memorizzato in un singolo byte (che è possibile memorizzare solo valori da 0 a 255), controllo in modo che il valore non è necessario.

I controlli di convalida dei dati di purezza non sono abilitati automaticamente per tutti i database. I controlli vengono attivati in base a diversi fattori:
  • Per i database creati in SQL Server 2005 e versioni successive, questi controlli sono attivati per impostazione predefinita e non possono essere disabilitati, in modo che l'utilizzo dell'opzione DATA_PURITY quando si esegue un comando DBCC CHECKDB o DBCC CHECKTABLE è irrilevante.
  • Per i database creati nelle versioni precedenti di SQL Server, ad esempio SQL Server 2000, SQL Server 7.0 e versioni aggiornate a SQL Server 2005, questi controlli non sono abilitati per impostazione predefinita. Affinché queste verifiche da eseguire, è necessario specificare l'opzione DATA_PURITY nel comando DBCC CHECKDB o DBCC CHECKTABLE. Ciò può comportare due cose:
    • Il comando DBCC completata e che il database è pulito, inclusi tutti i controlli di purezza di dati. Questo fatto viene registrato nell'intestazione del database. Tutte le successive DBCC CHECKDB o DBCC CHECKTABLE esecuzioni di comandi noteranno queste informazioni ed eseguono automaticamente il controllo di purezza di dati, come accade per i database creati in SQL Server 2005. In altre parole, quando un database è noto come "clean", vengono eseguiti sempre i controlli di purezza di dati.
    • Il comando DBCC completa ma segnala problemi sui dati incoerenti. In questo caso, è necessario pulire il database per rimuovere le incoerenze che si tenta di eseguire nuovamente il comando DBCC. È necessario specificare l'opzione DATA_PURITY per il comando DBCC fino a quando il database viene segnalato per essere pulita.
  • Se si specifica l'opzione PHYSICAL_ONLY quando viene eseguito il comando DBCC CHECKDB o DBCC CHECKTABLE, i controlli di purezza di dati non vengono eseguiti.

SINTOMI

Dati non validi o fuori dell'intervallo potrebbero stati memorizzati nel database nelle versioni precedenti di SQL Server per i seguenti motivi:
  • Sono dati validi presenti nell'origine durante l'utilizzo di metodi di inserimento di massa, ad esempio l'utilità bcp.
  • Dati non validi è stati passati tramite RPC evento chiamate a SQL Server.
  • Altre potenziali cause del danneggiamento di dati fisici a sinistra il valore della colonna in uno stato non valido.
Se si dispongono di dati non validi in una colonna di una tabella, possono verificarsi dei problemi in base al tipo di operazione che viene eseguita con i dati non validi. Tuttavia, è probabile che non verrà visualizzato alcun problema e i dati non validi non verranno individuati finché non si esegue un comando DBCC CHECKDB o DBCC CHECKTABLE in SQL Server 2005 e versioni successive.

Alcuni dei sintomi che è possibile grazie alla presenza di dati non validi includono (ma non limitati a):
  • Violazioni di accesso o altri tipi di eccezioni durante l'esecuzione di query su colonna interessata.
  • Risultati non corretti restituiti dalle query eseguite su colonna interessata.
  • Errori o problemi quando vengono create statistiche su colonne interessate.
  • Messaggi di errore analogo al seguente:
    Msg 9100, livello 23, stato 2, riga 1 possibili rilevato indice danneggiato. Eseguire DBCC CHECKDB.

Report di problema DATA_PURITY

Quando si esegue un DBCC CHECKDB o DBCC CHECKTABLE, comando con l'opzione DATA_PURITY (o la purezza dati i controlli vengono eseguiti automaticamente) e non validi presenti dati nelle tabelle per i comandi DBCC, l'output DBCC include altri messaggi che indicano i problemi con i dati. Alcuni messaggi di errore di esempio che indicano problemi di purezza di dati sono le seguenti:
Risultati DBCC per "account_history".
Msg 2570, livello 16, stato 2, riga 1
Pagina (1:1073), l'oggetto in 33 slot ID 1977058079, indice ID 0, 129568478265344 ID di partizione, unità di allocazione ID 129568478265344 (tipo "dati nella riga"). Valore della colonna "account_name_japan" è esterno all'intervallo per il tipo di dati "nvarchar". Aggiornare la colonna su un valore consentito.

Msg 2570, livello 16, stato 2, riga 1
Pagina (1:1156), l'oggetto in 120 slot ID 1977058079, indice ID 0, 129568478265344 ID di partizione, unità di allocazione ID 129568478265344 (tipo "dati nella riga"). Valore della colonna "account_name_japan" è esterno all'intervallo per il tipo di dati "nvarchar". Aggiornare la colonna su un valore consentito.
Esistono 153137 righe 1080 pagine per l'oggetto "account_history".
CHECKDB trovare 0 errori di allocazione e consistenza 338 nella tabella "account_history" (oggetto ID 1977058079).
CHECKDB presente 0 errori di allocazione e 338 coerenza nel database 'BadUnicodeData'.
Esecuzione di DBCC completata. Se sono stati creati messaggi di errore, contattare l'amministratore di sistema.
Risultati DBCC per 'table1'.
Msg 2570, livello 16, stato 3, riga 1
Pagina (1:154), slot 0 in oggetto ID 2073058421, indice ID 0, 72057594038321152 ID di partizione, unità di allocazione ID 72057594042318848 (tipo "dati nella riga"). Valore della colonna "col2" è esterno all'intervallo per il tipo di dati "reale". Aggiornare la colonna su un valore consentito.
Esistono 2 pagine per l'oggetto "table1" 4 righe.
CHECKDB trovare 0 errori di allocazione e gli errori di 1 coerenza nella tabella "table1" (oggetto ID 2073058421).
CHECKDB trovare errori di allocazione 0 e 1 la coerenza nel database 'realdata'. Esecuzione di DBCC completata. Se sono stati creati messaggi di errore, contattare l'amministratore di sistema.
Risultati DBCC per "table2".
Msg 2570, livello 16, stato 3, riga 1
Pagina (1:155), slot 0 in oggetto ID 2105058535, indice ID 0, 72057594038452224 ID di partizione, unità di allocazione ID 72057594042449920 (tipo "dati nella riga"). Valore della colonna "col2" è esterno all'intervallo di dati di tipo "decimal". Aggiornare la colonna su un valore consentito.
1 pagine per l'oggetto "table2" sono 4 righe.
CHECKDB trovare 0 errori di allocazione e gli errori di 1 coerenza nella tabella "table2" (oggetto ID 2105058535).
CHECKDB trovare errori di allocazione 0 e 1 la coerenza nel database 'realdata'. Esecuzione di DBCC completata. Se sono stati creati messaggi di errore, contattare l'amministratore di sistema.
Risultati DBCC per "tabella3".
Msg 2570, livello 16, stato 3, riga 1
Pagina (1:157), slot 0 in oggetto ID 2121058592, indice ID 0, 72057594038517760 ID di partizione, unità di allocazione ID 72057594042515456 (tipo "dati nella riga"). Valore della colonna "col2" è esterno all'intervallo per il tipo di dati "datetime". Aggiornare la colonna su un valore consentito.
Esistono 3 righe in 1 pagine per l'oggetto "tabella3".
CHECKDB trovare 0 errori di allocazione e gli errori di 1 coerenza nella tabella 'tabella3' (oggetto ID 2121058592).
CHECKDB trovare errori di allocazione 0 e 1 la coerenza nel database 'realdata'. Esecuzione di DBCC completata. Se sono stati creati messaggi di errore, contattare l'amministratore di sistema.
Per ogni riga che contiene un valore di colonna non valido, verrà generato un errore 2570.

La risoluzione del problema di purezza di dati

Non è possibile riparare gli errori 2570 utilizzando una delle opzioni di ripristino DBCC. In questo modo è Impossibile per DBCC determinare il valore deve essere utilizzato per sostituire il valore di colonna non valido. Di conseguenza, il valore della colonna deve essere aggiornato manualmente.

Per eseguire un aggiornamento manuale, è necessario individuare la riga che presenta il problema. Esistono due modi per eseguire questa operazione.
  • Eseguire una query sulla tabella che contiene i valori non validi per trovare le righe che contengono valori non validi.
  • Utilizzare le informazioni dell'errore 2570 per identificare le righe che contengono un valore non valido.
Verranno trattati entrambi i metodi in dettaglio di seguito, utilizzando esempi per trovare le righe che contengono dati non validi.

Dopo aver individuato la riga corretta, è necessaria una decisione sul nuovo valore che verrà utilizzato per sostituire i dati esistenti. Questa decisione deve essere eseguita con molta attenzione base dell'intervallo di valori validi per l'applicazione e il senso logico che tale riga di dati. Le scelte disponibili sono:
  • Se si conosce il valore deve essere, impostarlo su quel valore.
  • Impostarlo su un valore accettabile.
  • Impostare il valore della colonna su NULL.
  • Impostare il valore della colonna per il valore massimo o minimo per il tipo di dati della colonna.
  • Se si ritiene che la riga specifica non è in alcun modo senza un valore valido per la colonna, è possibile eliminare completamente la riga.

Ricerca di righe con valori non validi mediante query T-SQL

Il tipo di query che è necessario eseguire per trovare le righe che presentano valori non validi dipende dal tipo di dati della colonna che ha segnalato un problema. Se si osserva il messaggio di errore 2570, vedrete due elementi importanti di informazioni che vi aiuteranno a questo. Nell'esempio seguente, il valore della colonna "account_name_japan" è esterno all'intervallo per il tipo di dati "nvarchar". È possibile identificare facilmente la colonna con il problema, nonché il tipo di dati della colonna coinvolto. Pertanto, quando si conoscono i dati di tipo colonna coinvolta, è possibile formulare la query per trovare le righe che contengono valori non validi per tale colonna, la selezione delle colonne necessari per identificare tale riga (come i predicati in una clausola WHERE) per qualsiasi ulteriore aggiornare o eliminare.

Tipo di dati Unicode:
SELECT col1 ,DATALENGTH(account_name_japan) as Length ,account_name_japan FROM account_history
WHERE DATALENGTH(account_name_japan) % 2 != 0


Tipo di dati float:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from the CHECKDB output
SELECT col1, col2 FROM table1
WHERE col2<>0.0 AND (col2 < 2.23E-308 OR col2 > 1.79E+308) AND (col2 < -1.79E+308 OR col2 > -2.23E-308)

Tipo di dati real:
-- Change col1 to your actual primary key column(s), col2 to the column from the 2570 error, table1 to the table from -- the CHECKDB output
SELECT col1, col2 FROM testReal
WHERE col2<>0.0 AND (col2 < CONVERT(real,1.18E-38) OR col2 > CONVERT(real,3.40E+38)) AND (col2 < CONVERT(real,-3.40E+38) OR col2 > CONVERT(real,-1.18E-38))
ORDER BY col1; -- checks for real out of range

Decimal e Numeric tipo di dati:
SELECT col1 FROM table2WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999

Tenere presente che è necessario modificare i valori in base alla precisione e scala con cui è stata definita la colonna decimal o numeric. Nell'esempio precedente, la colonna è stata definita come col2 decimal(15,5).

Data ora tipo:
È necessario eseguire due query diverse per identificare le righe che contengono valori non validi per colonna di data/ora.
SELECT col1 FROM table3WHERE col2 < '1/1/1753 12:00:00 AM' OR col2 > '12/31/9999 11:59:59 PM'

SELECT col1 FROM table3 WHERE
((DATEPART(ms,col2)+ (1000*DATEPART(s,col2)) + (1000*60*DATEPART(mi,col2)) + (1000*60*60*DATEPART(hh,col2)))/(1000*0.00333))
> 25919999

Ricerca di righe con valore non valido utilizzando il percorso fisico:

È possibile utilizzare questo metodo se non si riesce a trovare le righe di interesse utilizzando il metodo di T-SQL in precedenza. Nel messaggio di errore 2570, viene stampata la posizione fisica della riga che contiene il valore non valido. Ad esempio, visualizzare il messaggio seguente:
Pagina (1:157), slot 0 in oggetto ID 2121058592, indice ID 0, 72057594038517760 ID di partizione, unità di allocazione ID 72057594042515456 (tipo "dati nella riga"). Valore della colonna "col2" è esterno all'intervallo per il tipo di dati "datetime". Aggiornare la colonna su un valore consentito.
In questo messaggio, si noteranno le informazioni: pagina (1:157), allo slot 0. Si tratta di informazioni identificare la riga. Il FileId è 1, il PageInFile è 157 e il valore SlotId è 0. Dopo aver ottenuto queste informazioni, sarà necessario eseguire il comando, come illustrato di seguito:
DBCC TRACEON ( 3604 )DBCC PAGE ( realdata , 1 , 157 , 3 )

Questo comando verrà stampato l'intero contenuto di una pagina. Parametri per il comando DBCC PAGE sono:
  • nome del database
  • FileId
  • PageInFile
  • opzione di stampa
Quando si esegue questo comando, si noterà l'output che contiene informazioni simili al seguente formato:
Slot 0  Offset 0x60 Length 19 Record Type = PRIMARY_RECORD Record  Attributes = NULL_BITMAP Memory Dump @0x44D1C060 00000000: 10001000 01000000
ffffffff ffffffff †................ 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 0 Column 0 Offset 0x4 Length 4 col1 = 1 Slot 0 Column 1 Offset 0x8 Length 8 col2 = Dec 31 1899 19:04PM Slot 1 Offset 0x73 Length 19 Record Type = PRIMARY_RECORD Record
Attributes = NULL_BITMAP Memory Dump @0x44D1C073 00000000: 10001000 02000000
0ba96301 f8970000 †..........c..... 00000010:
0200fc†††††††††††††††††††††††††††††††... Slot 1 Column 0 Offset 0x4 Length 4
col1 = 2 Slot 1 Column 1 Offset 0x8 Length 8 col2 = Jul 8 2006 9:34PM Slot 2
Offset 0x86 Length 19 Record Type = PRIMARY_RECORD Record Attributes =
NULL_BITMAP Memory Dump @0x44D1C086 00000000: 10001000 03000000 0ba96301
f8970000 †..........c..... 00000010: 0200fc†††††††††††††††††††††††††††††††...
Slot 2 Column 0 Offset 0x4 Length 4 col1 = 3 Slot 2 Column 1 Offset 0x8 Length
8 col2 = Jul 8 2006 9:34PM
In questo output si possono chiaramente notare i valori di colonna per la riga di interesse. In questo caso, necessaria la riga memorizzata nello slot 0 della pagina. Nel messaggio di errore, si conosce che tale col2 è quella in cui il problema. Così potete assumere il valore di col1 per lo Slot 0 e utilizzarlo come il predicato nella clausola WHERE dell'istruzione update o istruzione delete.

Avviso Si consiglia di utilizzare il primo metodo (vale a dire T-SQL di utilizzare query per trovare le informazioni richieste). Utilizzare il comando DBCC PAGE solo come ultima risorsa. Richiedere estrema attenzione durante l'utilizzo di questo comando in un ambiente di produzione. Si consiglia di ripristinare il database di produzione su un server di test, quindi ottenere tutte le informazioni necessarie tramite DBCC PAGE e quindi eseguire gli aggiornamenti nel server di produzione. Come sempre, assicurarsi di mantenere una copia di backup pronta nel caso di errori ed è necessario ripristinare una copia precedente del database.

Riferimenti

Per ulteriori informazioni sull'istruzione DBCC CHECKDB, vedere l'argomento "DBCC CHECKDB (Transact-SQL)" sul seguente sito Web Microsoft Developer Network (MSDN):Per ulteriori informazioni sui problemi noti in SQL Server 2000, fare clic sul numero riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base riportato di seguito:
900335 FIX: operazione di ripristino automatico del database di SQL Server 2000 potrebbe non riuscire se l'indice contiene un tipo di dati FLOAT o un tipo di dati reali e questo tipo di dati contiene un valore NaN

Per ulteriori informazioni sugli eventi RPC, vedere l'argomento "Chiamare una Stored Procedure (OLE DB)" sul seguente sito Web MSDN:Per ulteriori informazioni sui tipi di dati diversi, vedere l'argomento "Chiamare una Stored Procedure (OLE DB)" sul seguente sito Web MSDN:Per ulteriori informazioni sulle convenzioni di valore punto mobile, visitare il seguente sito Web Intel:Microsoft fornisce informazioni di contatto di terze parti per facilitare l'individuazione del supporto tecnico. Tali informazioni potrebbero cambiare senza preavviso. Microsoft non garantisce l'accuratezza delle informazioni per contattare altri produttori.
Proprietà

ID articolo: 923247 - Ultima revisione: 31 gen 2017 - Revisione: 1

Feedback