Solução de problemas erro DBCC 2570 no SQL Server 2005 e versões posteriores

Traduções de Artigos Traduções de Artigos
Artigo: 923247 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

INTRODUÇÃO

Este artigo descreve o erro SQL Server 2570, o que causa o erro e como resolver o problema.

Mais Informação

Verificações DATA_PURITY

SQL Server 2005, foi adicionada uma nova opção, DATA_PURITY, para os comandos DBCC CHECKDB e DBCC CHECKTABLE. Quando você executar um DBCC CHECKDB ou o comando DBCC CHECKTABLE com essa opção ativada, o comando executará validações de "pureza de dados" em cada valor de coluna de todas as linhas da tabela ou tabelas no banco de dados. Essas novas verificações são executadas para garantir que o valores armazenados nas colunas são válidas (isto é, que os valores não são fora do intervalo para o domínio associado ao tipo de dados de coluna). O a natureza da validação executada depende do tipo de dados da coluna. O lista parcial a seguir fornece alguns exemplos:
Reduzir esta tabelaExpandir esta tabela
Tipo de dados de colunaTipo de validação de dados
Caractere UnicodeO comprimento de dados deve ser um múltiplo de 2.
Data e horaO campo dias deve estar entre 1º de janeiro de 1753 e 31 de dezembro 9999. O campo de tempo deve ser anterior a '11:59:59:999 PM'.
Real e FloatVerificar a existência de inválido valores de ponto flutuante como SNAN, QNAN, NINF, ND, PD, PINF.
Nem todos os tipos de dados são verificados para a validade da coluna dados. Apenas aqueles onde é possível ter um valor armazenado fora do intervalo são verificados. Por exemplo, o tipo de dados tinyint possui um intervalo válido de 0 a 255 e é armazenado em um byte único (que só pode armazenar valores de 0 a 255), então, verificar o valor não é necessário.

As verificações de validação de pureza de dados não estão ativadas automaticamente para todos os bancos de dados. As verificações são habilitadas dependendo de vários fatores:
  • Bancos de dados criados no SQL Server 2005 e versões posteriores, essas verificações são ativadas por padrão e não podem ser desabilitadas para que o uso da opção DATA_PURITY ao executar um comando DBCC CHECKDB ou DBCC CHECKTABLE é irrelevante.
  • Bancos de dados que foram criados em versões anteriores do SQL Servidor, como SQL Server 2000, SQL Server 7.0 e versões atualizadas para SQL Server 2005, essas verificações não estão ativadas por padrão. Para que essas verificações para ser executada, você deve especificar a opção DATA_PURITY no DBCC CHECKDB ou Comando DBCC CHECKTABLE. Isso pode resultar em duas coisas:
    • O comando DBCC termina e relata que o banco de dados está limpo, incluindo todas as verificações de pureza de dados. Esse fato é registrado na cabeçalho do banco de dados. Todos os comando DBCC CHECKDB ou DBCC CHECKTABLE subseqüentes execuções perceberá essas informações e executarão automaticamente os dados verificações de pureza, como aconteceria bancos de dados criados no SQL Server 2005. Em outras palavras, quando um banco de dados é conhecido como "limpa" as verificações de pureza de dados são sempre executado.
    • O comando DBCC termina mas relatórios de problemas sobre inconsistência de dados. Se for esse o caso, você terá que limpar o banco de dados remover as inconsistências e tentar executar o comando DBCC novamente. Você terá que especificar a opção DATA_PURITY para o comando DBCC até o banco de dados é relatado para ser limpo.
  • Se a opção PHYSICAL_ONLY for especificada quando o DBCC Comando CHECKDB ou DBCC CHECKTABLE é executado, as verificações de pureza de dados não são executada.

SINTOMAS

Dados inválidos ou fora do intervalo tem foi armazenados na SQL Banco de dados de servidor em versões anteriores pelos seguintes motivos:
  • Dados inválidos estavam presentes na fonte enquanto estiver usando em massa Inserir métodos, como o utilitário bcp.
  • Dados inválidos foi passados por meio de RPC evento chamadas feitas SQL Server.
  • Outras possíveis causas de corrupção de dados físicos à esquerda o valor da coluna em um estado inválido.
Se você tiver dados inválidos em uma coluna de uma tabela, você poderá ter problemas dependendo do tipo de operação é executada contra dados inválidos. No entanto, também é possível que nenhum problema será exibida e os dados inválidos não serão descobertos até que você executa um comando DBCC CHECKDB ou DBCC CHECKTABLE no SQL Server 2005 e versões posteriores.

Alguns dos sintomas pode notar devido à presença de dados inválidos incluem (mas não estão limitados a) o:
  • Violações de acesso ou outros tipos de exceções ao executar consultas em relação a coluna afetada.
  • Resultados incorretos retornados por consultas executadas em relação a coluna afetada.
  • Erros ou problemas quando as estatísticas estão sendo construídas colunas afetadas.
  • Mensagens de erro semelhante à seguinte:
    MSG 9100, Nível 23, estado 2, linha 1 possível corrupção do índice detectada. Execute DBCC CHECKDB.

Relatório de problema DATA_PURITY

Quando você executa um comando DBCC CHECKDB ou DBCC CHECKTABLE com a opção DATA_PURITY ativada (ou a pureza dados verificações são executadas automaticamente) e dados inválidos existem nas tabelas verificadas pelo DBCC comandos, a saída do DBCC inclui mensagens adicionais que indicam o problemas com os dados. Algumas mensagens de erro de exemplo que indicam a pureza de dados problemas são mostrados abaixo:
Resultados do DBCC para "account_history".
MSG 2570, nível 16, estado 2, linha 1
Página (1:1073) slot 33 no objeto 1977058079 ID, ID de índice 0, partição ID 129568478265344, unidade de alocação 129568478265344 de identificação (tipo "dados na linha"). Coluna "account_name_japan" valor está fora do intervalo para tipo de dados "nvarchar". Coluna de atualização para um valor válido.
MSG 2570, nível 16, estado 2, linha 1
Página (1:1156), slot 120 no objeto 1977058079 ID, ID de índice 0, partição ID 129568478265344, ID de unidade de alocação 129568478265344 (digite "Na linha dados"). O valor da coluna "account_name_japan" está fora do intervalo para tipo de dados "nvarchar". Coluna de atualização para um valor válido.
Há são 153137 linhas nas páginas 1080 de objeto "account_history".
CHECKDB encontrado 0 erros de alocação e erros de consistência 338 na tabela "account_history" (objeto 1977058079 ID).
CHECKDB encontrado erros de alocação de 0 e 338 erros de consistência no banco de dados 'BadUnicodeData'.
Execução de DBCC foi concluída. Se o DBCC imprimiu mensagens de erro, contate o administrador do sistema.
Resultados do DBCC para 'table1'.
MSG 2570, nível 16, Estado 3, linha 1
Página (1:154), slot 0 em objeto 2073058421 ID, ID de índice 0, partição ID 72057594038321152, unidade de alocação identificação 72057594042318848 (tipo "Na linha dados"). O valor da coluna "col2" está fora do intervalo para tipo de dados "real". Coluna de atualização para um valor válido.
Há 4 linhas em 2 páginas de objeto "table1".
CHECKDB encontrado erros de alocação de 0 e 1 consistência erros tabela 'table1' (objeto 2073058421 ID).
CHECKDB encontrado 0 erros de alocação e 1 consistência erros no banco de dados 'realdata'. Execução de DBCC foi concluída. Se DBCC imprimiu erro mensagens, contate o administrador do sistema.
Resultados do DBCC para 'table2'.
MSG 2570, nível 16, Estado 3, linha 1
Página (1:155), slot 0 em objeto 2105058535 ID, ID de índice 0, partição ID 72057594038452224, unidade de alocação identificação 72057594042449920 (tipo "Na linha dados"). O valor da coluna "col2" está fora do intervalo para tipo de dados "decimal". Coluna de atualização para um valor válido.
Há 4 linhas em páginas de 1 objeto "tabela2".
CHECKDB encontrado erros de alocação de 0 e 1 consistência erros tabela 'table2' (objeto 2105058535 ID).
CHECKDB encontrado 0 erros de alocação e 1 consistência erros no banco de dados 'realdata'. Execução de DBCC foi concluída. Se DBCC imprimiu erro mensagens, contate o administrador do sistema.
Resultados do DBCC para 'Tabela3'.
MSG 2570, nível 16, Estado 3, linha 1
Página (1:157), slot 0 em objeto 2121058592 ID, ID de índice 0, partição ID 72057594038517760, unidade de alocação identificação 72057594042515456 (tipo "Na linha dados"). O valor da coluna "col2" está fora do intervalo para tipo de dados "datetime". Coluna de atualização para um valor válido.
Existem 3 linhas nas páginas 1 objeto "Tabela3".
CHECKDB encontrado erros de alocação de 0 e 1 consistência erros tabela 'Tabela3' (objeto 2121058592 ID).
CHECKDB encontrado 0 erros de alocação e 1 consistência erros no banco de dados 'realdata'. Execução de DBCC foi concluída. Se DBCC imprimiu erro mensagens, contate o administrador do sistema.
Para cada linha contém um valor de coluna inválido, um erro 2570 é gerada.

Corrigindo o problema de pureza de dados

Os erros 2570 não podem ser reparados usando qualquer DBCC repair opções. Isso ocorre porque é impossível para DBCC determinar qual valor deve ser usado para substituir o valor de coluna inválido. Assim, o valor da coluna deve ser atualizado manualmente.

Para executar uma atualização manual, você precisa encontrar a linha que tem o problema. Há duas maneiras de fazer isso.
  • Executar uma consulta a tabela que contém o valores inválidos para localizar linhas que contêm valores inválidos.
  • Use as informações de erro 2570 para identificar o linhas que possuem um valor inválido.
Nós abordaremos esses dois métodos em detalhes abaixo, usando exemplos para localizar linhas que contêm dados inválidos.

Depois de encontrar o linha correta, uma decisão precisa ser feita no novo valor que será usado para Substitua os dados inválidos existentes. Essa decisão deve ser feito com muito cuidado com base no intervalo de valores que funcionam para o aplicativo, bem como o que faz sentido lógico dessa linha específica de dados. As opções disponíveis são:
  • Se você souber que ele deve ser de valor, defina-o para que valor específico.
  • Defina-o como um valor aceitável.
  • Defina o valor da coluna como NULL.
  • Defina o valor de coluna para o valor máximo ou mínimo para que tipo de dados da coluna.
  • Se você achar que não é a linha específica de qualquer uso sem um valor válido para a coluna, você pode excluir essa linha completamente.

Localizando linhas com valores inválidos usando consultas T-SQL

O tipo de consulta que você precisa executar para localizar linhas que possuem valores inválidos depende do tipo de dados da coluna que relatou um problema. Se você examinar a mensagem de erro 2570, você irá notar duas partes importantes da informações que irão ajudá-lo com isso. No exemplo a seguir, a coluna valor "account_name_japan" está fora do intervalo para tipo de dados "nvarchar". Podemos facilmente identificar a coluna que tem o problema, bem como o tipo de dados do coluna envolvida. Assim, depois de conhecer os dados digite e a coluna envolvidas, você pode formular a consulta para localizar linhas que contêm valores inválidos para que coluna, selecionando as colunas necessárias para identificar a linha (como predicados em uma cláusula WHERE) para qualquer posteriormente atualizar ou excluir.

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

Tipo de dados 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 de dados 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 numérico tipo de dados:
SELECT col1 FROM table2
WHERE col2 > 9999999999.99999 
OR col1 < -9999999999.99999
Tenha em mente que será necessário ajustar os valores com base na precisão e escala com a qual você definiu a coluna decimal ou numérica. No exemplo acima, a coluna foi definida como col2 decimal(15,5).

Data dados tipo:
Você precisará executar duas consultas diferentes para identificar as linhas que contêm valores inválidos para coluna de hora de data.
SELECT col1 FROM table3
WHERE 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

Localizando linhas com um valor inválido usando o local físico:

Você pode usar esse método se você não conseguir encontrar as linhas de interesse usando o método T SQL discutido acima. Na mensagem de erro 2570, o local físico da linha que contém o valor inválido é impresso. Para exemplo, examine a seguinte mensagem:
Página (1:157) slot 0 em objeto 2121058592 ID, identificação de índice 0, partição ID 72057594038517760, unidade de alocação identificação 72057594042515456 (tipo "dados na linha"). É o valor da coluna "col2" fora do intervalo para tipo de dados "datetime". Coluna de atualização para um legal valor.
Esta mensagem, você observará as informações: página (1:157) slot 0. Isso é que as informações necessárias identificar a linha. FileId é 1, o PageInFile é 157 e a SlotId é 0. Depois que você tiver essas informações, você será necessário executar o comando, da seguinte maneira:
DBCC TRACEON ( 3604 )
DBCC PAGE ( realdata , 1 , 157 , 3 )
Esse comando irá imprimir todo o conteúdo de uma página. Parâmetros para o Comando DBCC PAGE são:
  • nome do banco de dados
  • FileId
  • PageInFile
  • opção de impressão
Depois de executar este comando, você irá notar saída que contém informações semelhantes ao seguinte 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 = 1Slot 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 
Nesta saída você pode ver claramente os valores da coluna para a linha de seu interesse. Nesse caso, você preciso da linha armazenada no slot 0 da página. Da mensagem de erro, você sabe que col2 é aquele com o problema. Portanto, você pode tirar o valor de col1 para Slot 0 e usá-lo como o predicado da cláusula WHERE da instrução update ou a instrução delete.

Aviso Recomendamos que você use o primeiro método (ou seja, usar SQL T consultas para localizar as informações necessárias). Uso do comando DBCC PAGE somente como um último recurso. Tome um cuidado máximo enquanto você usar esse comando em uma produção ambiente. É recomendável restaurar o banco de dados de produção em um teste servidor, em seguida, obter todas as informações necessárias usando DBCC PAGE e faça o atualizações no servidor de produção. Como sempre, certifique-se de manter um backup pronto no caso de algo der errado e precisar reverter para uma cópia anterior do banco de dados.

Referências

Para obter mais informações sobre a instrução DBCC CHECKDB, consulte o tópico "DBCC CHECKDB (Transact-SQL)" no Microsoft Developer seguinte Site da Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms176064.aspx
Para obter mais informações sobre conhecidos problemas no SQL Server 2000, clique no número abaixo para visualizar o artigo na Base de dados de Conhecimento da Microsoft:
900335CORREÇÃO: A operação de recuperação de banco de dados automático SQL Server 2000 pode não ter êxito se um índice contém um tipo de dados FLOAT ou um tipo de dados REAL e esse tipo de dados contém um valor NaN
Para obter mais informações sobre eventos RPC, consulte o Tópico "Chamando um procedimento armazenado (OLE DB)" no seguinte site da MSDN:
. aspx http://msdn2.microsoft.com/en-us/library/aa198358 (SQL.80)
Para obter mais informações sobre os tipos de dados diferentes, consulte o Tópico "Chamando um procedimento armazenado (OLE DB)" no seguinte site da MSDN:
http://msdn2.microsoft.com/en-us/library/ms187752.aspx
Para obter mais informações sobre convenções de valor de ponto flutuante, visite o seguinte site da Intel:
http://www.Intel.com/design/PentiumII/manuals/243191.htm
Microsoft Fornece informações de contato de terceiros para ajudá-lo a encontrar suporte técnico. Informações de contato podem ser alteradas sem aviso prévio. Microsoft não garante a precisão dessas informações de contato de terceiros.

Propriedades

Artigo: 923247 - Última revisão: 22 de março de 2012 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Express Edition with Advanced Services
  • Microsoft SQL 2005 Server Workgroup
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Standard Edition for Small Business
Palavras-chave: 
kbtshoot kbexpertiseadvanced kbsql2005engine kbinfo kbmt KB923247 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 923247

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com