SQL SERVER - ERROS NOS DADOS
Pessoal, tive um problema em um cliente, que não estou acostumado, que é corrupção de dados e indÃces, ja havia ocorrido neste mesmo cliente ha cerca de 1 ano atras, e agora ocorreu de novo,
fiz um (DBCC CHECKDB ), e acusou erros, após fiz um dbcc checkdb (banco, REPAIR_FAST), e corrigiu alguns problemas, porém ao testar de novo, o erro abaixo permanece:
Resultados do DBCC para [ô]PRODUTOS[ô].
Mensagem 8936, NÃvel 16, Estado 1, Linha 1
Erro de tabela: ID de objeto 1504724413, ID de Ãndice 1, ID de partição 72057594060472320, ID de unidade de alocação 72057594070892544 (tipo In-row data). Incompatibilidade na vinculação da cadeia de árvore B. (1:66273)->next = (1:28468), mas (1:28468)->Prev = (1:72865).
Mensagem 8978, NÃvel 16, Estado 1, Linha 1
Erro de tabela: ID de objeto 1504724413, ID de Ãndice 1, ID de partição 72057594060472320, ID de unidade de alocação 72057594070892544 (tipo In-row data). Na página (1:72865) falta uma referência da página anterior (1:66273). PossÃvel problema de vÃnculo de cadeia.
Existem 41434 linhas em 3535 páginas para o objeto [Ô]PRODUTOS[Ô].
CHECKDB encontrou 0 erros de alocação e 2 erros de consistência na tabela [ô]PRODUTOS[ô] (ID de objeto 1504724413).
tentei fazer um reindex desta tabela, e me retorna:
A instrução CREATE UNIQUE INDEX foi encerrada porque foi encontrada uma chave duplicada para o nome de objeto [ô]dbo.PRODUTOS[ô] e o nome de Ãndice [ô]PRODUTOS$codigo[ô]. O valor da chave duplicada é (39600).
não sei se entendi bem, mas não tenho este código duplicado no cadastro, e pra variar o arquivo de log, não é nada especÃfico.. alguém teria uma dica ?
fiz um (DBCC CHECKDB ), e acusou erros, após fiz um dbcc checkdb (banco, REPAIR_FAST), e corrigiu alguns problemas, porém ao testar de novo, o erro abaixo permanece:
Resultados do DBCC para [ô]PRODUTOS[ô].
Mensagem 8936, NÃvel 16, Estado 1, Linha 1
Erro de tabela: ID de objeto 1504724413, ID de Ãndice 1, ID de partição 72057594060472320, ID de unidade de alocação 72057594070892544 (tipo In-row data). Incompatibilidade na vinculação da cadeia de árvore B. (1:66273)->next = (1:28468), mas (1:28468)->Prev = (1:72865).
Mensagem 8978, NÃvel 16, Estado 1, Linha 1
Erro de tabela: ID de objeto 1504724413, ID de Ãndice 1, ID de partição 72057594060472320, ID de unidade de alocação 72057594070892544 (tipo In-row data). Na página (1:72865) falta uma referência da página anterior (1:66273). PossÃvel problema de vÃnculo de cadeia.
Existem 41434 linhas em 3535 páginas para o objeto [Ô]PRODUTOS[Ô].
CHECKDB encontrou 0 erros de alocação e 2 erros de consistência na tabela [ô]PRODUTOS[ô] (ID de objeto 1504724413).
tentei fazer um reindex desta tabela, e me retorna:
A instrução CREATE UNIQUE INDEX foi encerrada porque foi encontrada uma chave duplicada para o nome de objeto [ô]dbo.PRODUTOS[ô] e o nome de Ãndice [ô]PRODUTOS$codigo[ô]. O valor da chave duplicada é (39600).
não sei se entendi bem, mas não tenho este código duplicado no cadastro, e pra variar o arquivo de log, não é nada especÃfico.. alguém teria uma dica ?
Confesso que felizmente nunca passei por esse problema, mas fiquei curioso.
Encontrei esse post, vê se te ajuda:
http://forum.imasters.com.br/topic/457332-resolvidorecuperacao-de-base-corrompida/
Encontrei esse post, vê se te ajuda:
http://forum.imasters.com.br/topic/457332-resolvidorecuperacao-de-base-corrompida/
Realmente, problemas com a base é critico, prefiro que de pau de servidor, problema de rede, mas base corrompida é triste.,,,a única diferença deste cliente para todos os outros, é que o windows server 2008 esta montado em um micro intel I5 com disco SSD... Mas olha ta estranho...como reparou a maioria dos erros, o cliente esta usando normal, mas eu peguei uma cópia e to quebrando cabeça, deletei o item que o sql dizia ter chave duplicada, e qdo rodei a checagem no banco, ele retornou o código seguinte com erro de chave...ai eu exclui todos os produtos maior ou igual ao código em questão, fiz nova chegagem, não retornou erros, então fiz um reindex da tabela, tbm não retornou mais erros...( isso no banco de testes)...acho que vou ter que fazer uma query com insert dos dados pelo manager, deletar no banco do cliente, para após inserir novamente...
Pessoal, ainda nesta questão acima, como tive perda de dados em uma tabela e acabei localizando as informações em um banco de backup, preciso fazer alguns selects de todos os campos de uma tabela para inserir na tabela do banco oficial. Como posso gerar selects das informações e jogar em um script de insert para inserção posterior ? Alguma dica ou outra idéia?
Você não vai gerar [Ô]Selects[Ô], vai gerar um dump.
Kerplunk e como faço esse dump ?, fiz uma conferência e achei os números dos pedidos que não estão na tabela. A idéia era fazer vários selects passando os pedidos como parâmetros...
Se for um banco SQL Server:
1 - Abra o SQL Server Management Studio
2 - Clique com o botão direito no banco desejado
3 - Clique em [Ô]Tasks -> Generate Scripts[Ô]
4 - Siga no assistente até ver um botão [Ô]Advanced[Ô] e clique nele
5 - Na propriedade [Ô]Types of data to Script[Ô], selecione [Ô]Schema and Data[Ô] e avance o assistente
Abra o script gerado e corra pro abraço
1 - Abra o SQL Server Management Studio
2 - Clique com o botão direito no banco desejado
3 - Clique em [Ô]Tasks -> Generate Scripts[Ô]
4 - Siga no assistente até ver um botão [Ô]Advanced[Ô] e clique nele
5 - Na propriedade [Ô]Types of data to Script[Ô], selecione [Ô]Schema and Data[Ô] e avance o assistente
Abra o script gerado e corra pro abraço
Ja fiz isso outras vezes para atualizar nos clientes algumas tabelas novas com dados. Tabela de ncm por exemplo.....mas neste caso seria apenas dados e não schemas da tabela...mas será que consigo pelo manager aplicar filtro ? Para pegar dados apenas dos pedidos que preciso?
O Script gerado fica mais ou menos assim:
Então você pode aplicar operadores condicionais:
Sei que pode dar um trabalhão fazer, porque pelo que vejo você tem muitas linhas, mas você pode usar um editor bom como o notepad++ e fazer substituições adequadamente em massa. Em último caso, até usar o excel com suas funções milagrosas para fazer as substituições de todas as linhas.
Mas recuperar bases de dados é mesmo complicado e trabalhoso...
INSERT [dbo].[Clientes] ([Codigo], [Nome]) VALUES (1, N[ô]Paty[ô])
GO
INSERT [dbo].[Clientes] ([Codigo], [Nome]) VALUES (2, N[ô]Fabio[ô])
GO
INSERT [dbo].[Clientes] ([Codigo], [Nome]) VALUES (3, N[ô]Leonel[ô])
GO
INSERT [dbo].[Clientes] ([Codigo], [Nome]) VALUES (4, N[ô]Ba[ô])
GO
INSERT [dbo].[Clientes] ([Codigo], [Nome]) VALUES (5, N[ô]Cleber[ô])
GO
Então você pode aplicar operadores condicionais:
IF ((SELECT count(0) from clientes Where codigo = 1) = 0)
INSERT [dbo].[Clientes] ([Codigo], [Nome]) VALUES (1, N[ô]Paty[ô])
GO
Sei que pode dar um trabalhão fazer, porque pelo que vejo você tem muitas linhas, mas você pode usar um editor bom como o notepad++ e fazer substituições adequadamente em massa. Em último caso, até usar o excel com suas funções milagrosas para fazer as substituições de todas as linhas.
Mas recuperar bases de dados é mesmo complicado e trabalhoso...
Seria melhor se não tivesse corrompido....mas em cerca de 8 anos usando sqlexpress nos clientes...este foi o primeiro caso...vou tentar fazer algo em cima de suas dicas.
Grato.
Grato.
Eu já tive casos de banco corrompido com SQL Server também. Acontece. Apesar de ser um excelente banco, nunca está completamente livre de acontecer. O uso de transações ajuda a prevenir e quanto mais granularizado melhor. Já tive corrupção até mesmo de banco de dados Oracle, que na teoria é praticamente impossÃvel de acontecer, mas acontece. Seja Oracle ou SQL Server, corrupção de dados é bastante raro, mas quando acontece a recuperação não costuma ser simples. Existem até mesmo empresas especializadas nisso e que fazem somente isso.
Tópico encerrado , respostas não são mais permitidas