{"id":942,"date":"2011-08-15T23:42:34","date_gmt":"2011-08-16T01:42:34","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=942"},"modified":"2016-07-23T23:22:13","modified_gmt":"2016-07-24T02:22:13","slug":"casos-do-dia-a-dia-corrupcao-de-dados-e-database-suspect","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2011\/08\/15\/casos-do-dia-a-dia-corrupcao-de-dados-e-database-suspect\/","title":{"rendered":"Casos do Dia a Dia: Corrup\u00e7\u00e3o de Dados e Database Suspect"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>Gostaria de fazer deste post como se fosse uma thread de um f\u00f3rum com uma discus\u00e3o sobre alta disponibilidade no SQL Server.<\/p>\n<p>S\u00e1bado, dia 13\/08 eu tive um problema em uma database que deixa qualquer DBA com o cora\u00e7\u00e3o disparado(DBA n\u00e3o pode ter problema card\u00edaco!!!). Uma database de 110GB que \u00e9 muito utilizada ficou com o status <strong>Suspect<\/strong>. No meu caso n\u00e3o foi t\u00e3o grave pois o problema ocorreu em uma database de um servidor D-1 que recebe restore di\u00e1rio do servidor de produ\u00e7\u00e3o.<\/p>\n<p>A database ficou Suspect durante a cria\u00e7\u00e3o de um \u00edndice muito grande que \u00e9 criado diariamente nesse servidor D-1.<\/p>\n<p>A primeira coisa que fiz para tentar deixar a database online novamente foi seguir os passos desse meu outro artigo, onde j\u00e1 havia recuperado uma database em modo Suspect: <a title=\"Database Suspect\" href=\"https:\/\/www.fabriciolima.net\/blog\/2010\/10\/08\/casos-do-dia-a-dia-database-em-modo-suspect\/\" target=\"_blank\">Casos do Dia a Dia: Database em modo Suspect<\/a>.<\/p>\n<p>Ent\u00e3o, executei os comandos:<br \/>\n<strong>ALTER DATABASE XXXXXX SET EMERGENCY<\/strong> &#8212; Foi alterada com sucesso<\/p>\n<p><strong>ALTER DATABASE XXXXXX SET ONLINE<\/strong><\/p>\n<p>Entretanto, ao tentar deixar a database ONLINE, ela entrou em modo SUSPECT novamente e o erro abaixo foi gerado:<\/p>\n<p><span style=\"color: #ff0000;\">Msg 926, Level 14, State 1, Line 1<br \/>\nDatabase NOMEDATABASE cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server errorlog for more information.Msg 5069, Level 16, State 1, Line 1. ALTER DATABASE statement failed. Msg 824, Level 24, State 2, Line 1<br \/>\nSQL Server detected a logical consistency-based I\/O error: incorrect pageid (expected 1:1175999; actual 1:12045999). It occurred during a read of page (1:11751999) in database ID 99 at offset 0x0000166a370000 in file &#8216;X:\\XXXXXX.mdf&#8217;.<br \/>\nThis is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). <\/span><\/p>\n<p>Fiz um select na tabela <strong>Msdb.dbo.Suspect_Pages<\/strong> e encontrei 2 p\u00e1ginas com problema. As duas possu\u00edam na coluna Event_Type o valor 1 que significa:<\/p>\n<p><span style=\"color: #0000ff;\">1 = An 823 error that causes a suspect page (such as a disk error) or an 824 error other than a bad checksum or a torn page (such as a bad page ID).<\/span><\/p>\n<p>Novamente deixei a database em modo de emergencia para fazer alguns select na database:<\/p>\n<p><strong>ALTER DATABASE XXXXXX SET EMERGENCY<\/strong><\/p>\n<p><strong>ALTER DATABASE XXXXXX SET SINGLE_USER WITH ROLLBACK IMMEDIATE<\/strong><\/p>\n<p>Em seguida, eu tentei rodar o comando abaixo para verificar qual seria o objeto que estava com problema, mas o DBCC PAGE retornava um erro e n\u00e3o me mostrava a informa\u00e7\u00e3o dos objetos:<\/p>\n<p><strong>DBCC TRACEON ( 3604 )<br \/>\nDBCC PAGE ( XXXXXX, 1 , 1175999 , 3 )<\/strong><br \/>\nou<br \/>\n<strong>DBCC PAGE ( XXXXXX, 1 , 1175999 , 1 )<\/strong><\/p>\n<p>Nesse momento, tentei rodar o comando DBCC CHECKDB nessa database, mas o mesmo tamb\u00e9m n\u00e3o funcionou retornando o seguinte erro com 5 segundos de execu\u00e7\u00e3o:<\/p>\n<p><span style=\"color: #ff0000;\">Msg 8921, Level 16, State 1, Line 2. Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors.<\/span><\/p>\n<p>Pela mensagem de erro, como a letra do TempDB estava com 30 GB de espa\u00e7o dispon\u00edvel, acredito que uma tabela de sistema dessa database estava inconsistente.<\/p>\n<p>Como eu n\u00e3o iria voltar um Backup Full pois j\u00e1 estava quase na hora da atualiza\u00e7\u00e3o di\u00e1ria dessa database(o que foi executado com sucesso), fui tentar uma \u00faltima op\u00e7\u00e3o para recuperar a database mesmo com uma poss\u00edvel perda de dados:<\/p>\n<p><strong>DBCC CHECKDB (NOME_DATABASE, REPAIR_ALLOW_DATA_LOSS) <\/strong><\/p>\n<p>Todavia, esse comando tamb\u00e9m me retornava um erro:<\/p>\n<p><span style=\"color: #ff0000;\">Msg 8921, Level 16, State 1, Line 2. Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors.<br \/>\n<span style=\"color: #ff0000;\">CHECKDB found 78 allocation errors and 0 consistency errors not associated with any single object.<br \/>\nCHECKDB found 78 allocation errors and 0 consistency errors in database &#8216;XXXXXX&#8217;.<\/span><\/span><\/p>\n<p>No log do SQL foi registrada a seguinte informa\u00e7\u00e3o:<span style=\"color: #ff0000;\"> <\/span><\/p>\n<p><span style=\"color: #ff0000;\">DBCC CHECKDB(XXXXXXX) WITH no_infomsgs executed by LOGIN found 78 errors and repaired 0 errors.<\/span><\/p>\n<p>Ou seja, n\u00e3o foi poss\u00edvel corrigir o problema dessa database. Eu apenas consegui deixar a database dispon\u00edvel para uso novamente executando:<\/p>\n<p><strong>ALTER DATABASE XXXXXX SET MULTI_USER<\/strong><\/p>\n<p>Alguns jobs que acessam essa database at\u00e9 executaram com sucesso, mas eu n\u00e3o consegui criar o \u00edndice que gerou o problema de corrup\u00e7\u00e3o e acredito outras procedimentos falhariam ao acessar os dados corrompidos.<\/p>\n<p>Eu n\u00e3o consegui encontrar outra solu\u00e7\u00e3o que n\u00e3o fosse voltar o restore completo dessa database, o que demoraria mais de 1 hora e causaria um grande transtorno se fosse em produ\u00e7\u00e3o.<\/p>\n<p>Se eu tivesse toda uma solu\u00e7\u00e3o de cluster do SQL Server, n\u00e3o adiantaria nada nesse caso pois ela garante a disponibilidade do Hardware do servidor.<\/p>\n<p>Minha replica\u00e7\u00e3o de dados entre 2 Storages tamb\u00e9m n\u00e3o resolveria pois os dados iriam corrompidos de um Storage para o outro.<\/p>\n<p>Conforme j\u00e1 tinha verificado na tabela Suspect_Pages, ele me indicou que o erro gerado era de n\u00famero 823 ou 824:<br \/>\n<span style=\"color: #0000ff;\">EventType = 1 :An 823 error that causes a suspect page (such as a disk error) or an 824 error other than a bad checksum or a torn page (such as a bad page ID).<\/span><\/p>\n<p>Na solu\u00e7\u00e3o de Database Mirroring do SQL Serve 2008, temos uma \u00f3tima funcionalidade de corre\u00e7\u00e3o de p\u00e1ginas corrompidas, conforme podemos ver nesse artigo do Paul Randal:<a title=\"Paul Randal\" href=\"http:\/\/www.sqlskills.com\/BLOGS\/PAUL\/post\/SQL-Server-2008-Automatic-Page-Repair-with-Database-Mirroring.aspx\" target=\"_blank\">SQL Server 2008: Automatic Page Repair with Database Mirroring<br \/>\n<\/a><\/p>\n<p>Nesse artigo podemos ver os n\u00fameros dos erros que a solu\u00e7\u00e3o de Automatic Page Repair soluciona:<\/p>\n<p><span style=\"color: #0000ff;\">&#8220;The feature works for pages that have 824 errors, 823 errors where the OS returns a CRC error while reading the page (to prevent resource issues triggering a page repair), and pages that have 829 errors (where the page is marked as restore pending).&#8221; <\/span><\/p>\n<p>Logo, se eu tivesse um Database Mirroring configurado ele resolveria esse meu problema de corrup\u00e7\u00e3o de forma transparente.<\/p>\n<p>Contudo, a solu\u00e7\u00e3o de Database Mirroring tamb\u00e9m tem alguns problemas:<\/p>\n<ul>\n<li>S\u00f3 faria o failover autom\u00e1tico dessa database, mas muitos procedimentos dessa DB dependem de outras DB para funcionar.<\/li>\n<li>Ele n\u00e3o faz o mirror de Logins, Linked Server e Jobs que s\u00e3o alterados no servidor Principal.<\/li>\n<li>Tem um impacto na performance j\u00e1 que os dados s\u00e3o escritos no mirror antes de serem escritos na database principal.<\/li>\n<li>Nem todas as p\u00e1ginas podem ser reparadas com o Page Repair, conforme disse o Paul Randal: <span style=\"color: #0000ff;\">&#8220;Not all pages can be repaired &#8211; the file header page, database boot page, and allocation bitmap pages (GAM, SGAM, PFS) cannot be repaired this way.&#8221;<\/span><\/li>\n<\/ul>\n<p>N\u00f3s que trabalhamos como DBA Full Time de uma empresa, vamos sempre dormir preocupados pois a qualquer momento pode acontecer um problema em que sua solu\u00e7\u00e3o de alta disponibilidade n\u00e3o consiga tratar 100% dos poss\u00edveis problemas e voc\u00ea precise voltar um backup completo da base, o que dependendo do tamanho da database, causaria um alto tempo de parada (perda de $$) e muitas explica\u00e7\u00f5es teriam que ser dadas a diretoria.<\/p>\n<p>Algu\u00e9m tentaria fazer algo diferente para resolver esse problema espec\u00edfico de corrup\u00e7\u00e3o?<\/p>\n<p>Qual  solu\u00e7\u00e3o de High Availability e Desaster Recovery voc\u00ea utilizaria para  deixar seu BD (&gt;500 GB de dados) preparado para problemas de hardware  e de Corrup\u00e7\u00e3o e com um Failover Autom\u00e1tico? N\u00e3o importando o valor do  investimento($$) necess\u00e1rio.<\/p>\n<p>Conto com a opini\u00e3o da comunidade SQL Server.<\/p>\n<p><b>Gostou dessa dica?<\/b><\/p>\n<p>Cadastre seu e-mail para receber novos Posts e curta minha <a href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\">P\u00e1gina no Facebook<\/a> para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>Confira mais experi\u00eancias do Dia a Dia de um DBA no meu <a href=\"https:\/\/www.fabriciolima.net\/cursos-online\/treinamento-tarefas-do-dia-a-dia-de-um-dba-online\/\" target=\"_blank\">Treinamento de Tarefas do Dia a Dia de um DBA<\/a>.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>MCITP \u2013 Database Administrator<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, Gostaria de fazer deste post como se fosse uma thread de um f\u00f3rum com uma discus\u00e3o sobre alta disponibilidade no SQL Server. S\u00e1bado, dia 13\/08 eu tive um problema em uma database que deixa qualquer DBA com o cora\u00e7\u00e3o disparado(DBA n\u00e3o pode ter problema card\u00edaco!!!). Uma database de 110GB que \u00e9 muito utilizada [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[6,280],"tags":[388,85,380,395,373,250,374,391,376,21,23,24,390,261,260,375,393,392,372,383,378,384,379,381,387,377,389,382,394,386,385],"class_list":["post-942","post","type-post","status-publish","format-standard","hentry","category-casos-do-dia-a-dia","category-virtual-pass-br","tag-a-failure-was-detected-while-collecting-facts","tag-alter-database","tag-alter-database-statement-failed","tag-automatic-page-repair","tag-corrupcao-de-dados","tag-database-corruption","tag-database-emergency","tag-database-mirroring","tag-database-online","tag-database-suspect","tag-dba","tag-dbcc-checkdb","tag-dbcc-checkdb-repair_allow_data_loss","tag-dbcc-page","tag-dbcc-traceon","tag-desaster-recovery","tag-desastre","tag-failove-clustering","tag-high-availability","tag-incorrect-pageid","tag-it-has-been-marked-suspect-by-recovery","tag-it-occurred-during-a-read-of-page","tag-msg-5069","tag-msg-824","tag-msg-8921","tag-msg-926","tag-possibly-tempdb-out-of-space-or-a-system-table-is-inconsistent","tag-ql-server-detected-a-logical-consistency-based-io-error","tag-recuperacao-de-desastre","tag-single_user-with-rollback-immediate","tag-suspect_pages"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/942","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=942"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/942\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}