SQL SERVER - ERROS NOS DADOS

FUTURA 20/11/2015 15:06:09
#454254
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 ?

DS2T 20/11/2015 16:03:59
#454263
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/
FUTURA 20/11/2015 16:19:09
#454264
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...
FUTURA 30/11/2015 22:48:23
#454623
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?
KERPLUNK 30/11/2015 23:07:50
#454624
Resposta escolhida
Você não vai gerar [Ô]Selects[Ô], vai gerar um dump.
FUTURA 30/11/2015 23:13:25
#454625
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...
KERPLUNK 30/11/2015 23:21:37
#454626
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
FUTURA 30/11/2015 23:28:34
#454627
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?
KERPLUNK 30/11/2015 23:55:05
#454628
O Script gerado fica mais ou menos assim:

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...
FUTURA 01/12/2015 00:06:30
#454629
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.
KERPLUNK 01/12/2015 00:16:54
#454630
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