{"id":2858,"date":"2014-03-10T07:43:49","date_gmt":"2014-03-10T09:43:49","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=2858"},"modified":"2016-07-23T13:29:25","modified_gmt":"2016-07-23T16:29:25","slug":"como-descobrir-a-pagina-fisica-dos-registros-de-uma-tabela-com-apenas-um-select","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2014\/03\/10\/como-descobrir-a-pagina-fisica-dos-registros-de-uma-tabela-com-apenas-um-select\/","title":{"rendered":"Como descobrir a p\u00e1gina f\u00edsica dos registros de uma tabela com apenas um SELECT"},"content":{"rendered":"<p>Ol\u00e1 Pessoal,<\/p>\n<p>Continuando os cursos do Paul Randal na PluralSight, muitas ideias de posts v\u00e3o surgindo e com o tempo permitindo, colocarei aqui no Blog.<\/p>\n<p>Hoje vou falar de duas fun\u00e7\u00f5es n\u00e3o documentadas que nunca tinha ouvido falar:\u00a0<strong>%%PHYSLOC%%<\/strong> e\u00a0<strong>fn_PhysLocCracker<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Criei uma tabela e populei com mil registros para a realiza\u00e7\u00e3o dos testes:<\/p>\n<p>CREATE TABLE TesteLocalizacaoRegistros(<br \/>\nCod INT IDENTITY,<br \/>\nData DATETIME DEFAULT(GETDATE()),<br \/>\nTexto CHAR(1000) DEFAULT(&#8216;FABRICIO LIMA CONSULTORIA SQL SERVER&#8217;))<\/p>\n<p>INSERT INTO TesteLocalizacaoRegistros DEFAULT VALUES<br \/>\nGO 1000<\/p>\n<p>A fun\u00e7\u00e3o\u00a0<em>%%PHYSLOC%%<\/em> mostra de uma forma n\u00e3o entend\u00edvel para n\u00f3s meros mortais, a localiza\u00e7\u00e3o f\u00edsica de cada registro de uma tabela. A utiliza\u00e7\u00e3o dela \u00e9 muito simples conforme abaixo:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2859 aligncenter\" title=\"PHYSLOC\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC.png\" alt=\"\" width=\"500\" height=\"430\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-300x257.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-100x86.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-275x236.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PHYSLOC-20x17.png 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Como podem ver, essa fun\u00e7\u00e3o sozinha n\u00e3o nos ajudaria em nada. Entretanto, algum camarada dos DBAs SQL Server tamb\u00e9m criou uma fun\u00e7\u00e3o chamada\u00a0<em>fn_PhysLocCracker<\/em> que traduz essa informa\u00e7\u00e3o para o nosso dialeto SQL Server.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2860 aligncenter\" title=\"PhysLocCracker\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker.png\" alt=\"\" width=\"500\" height=\"420\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker-100x85.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/PhysLocCracker-20x17.png 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>Como \u00e9 poss\u00edvel perceber na figura acima, as linhas com a coluna <em>Cod<\/em> de 1 \u00e0 7 da minha tabela est\u00e3o na p\u00e1gina 177, as linhas de 8 \u00e0 14 est\u00e3o na p\u00e1gina 179 e etc&#8230;<\/p>\n<p>At\u00e9 hoje, a forma onde eu via essa informa\u00e7\u00e3o era atrav\u00e9s do comando DBCC PAGE. Segue abaixo um print do Slot 0 da p\u00e1gina 177:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2861 aligncenter\" title=\"DBCC PAGE\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE.png\" alt=\"\" width=\"600\" height=\"350\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE-100x59.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/DBCC-PAGE-20x12.png 20w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Essa informa\u00e7\u00e3o pode ser \u00fatil de v\u00e1rias maneiras no nosso dia a dia.<\/p>\n<p>Um exemplo de como essa informa\u00e7\u00e3o pode nos ajudar \u00e9 na investiga\u00e7\u00e3o de uma corrup\u00e7\u00e3o, que \u00e9 um dos problemas que mais me assustam em um banco de dados.<\/p>\n<p>Imagina que voc\u00ea passou a receber o erro de uma p\u00e1gina corrompida. At\u00e9 hoje eu utilizava o comando DBCC PAGE para descobrir o que tinha dentro dessa p\u00e1gina.<\/p>\n<p>Caso essa p\u00e1gina corrompida seja uma p\u00e1gina de dados, com a informa\u00e7\u00e3o do objeto dono da p\u00e1gina em m\u00e3os, podemos com apenas um SELECT simples descobrir as informa\u00e7\u00f5es envolvidas na corrup\u00e7\u00e3o.<\/p>\n<p>Caso n\u00e3o seja poss\u00edvel realizar esse select na p\u00e1gina corrompida (n\u00e3o fiz esse teste com uma corrup\u00e7\u00e3o de verdade), conseguimos atrav\u00e9s de um backup da base tentar buscar essa informa\u00e7\u00e3o.<\/p>\n<p>Para testar isso, fiz um restore da minha base de dados chamada <em>ConsultoriaSQLServe<\/em>r em uma base chamada <em>ConsultoriaSQLServer_Report<\/em>, exemplo que muitos ambientes j\u00e1 possuem com bases D-1 sendo restauradas diariamente para relat\u00f3rios, e fiz o mesmo select para conferir se as p\u00e1ginas dados s\u00e3o as mesmas ou se existiria alguma altera\u00e7\u00e3o:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2862 aligncenter\" title=\"Base_Report\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report.png\" alt=\"\" width=\"500\" height=\"530\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report.png 595w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-283x300.png 283w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-410x434.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-100x106.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-275x291.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2014\/03\/Base_Report-20x20.png 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u00c9 poss\u00edvel verificar que o resultado foi id\u00eantico. Como tenho bases D-1 em meu ambiente, posso utilizar essa base para rapidamente descobrir o que tem dentro de uma p\u00e1gina corrompida na base de produ\u00e7\u00e3o.<\/p>\n<p>Claro que a base de produ\u00e7\u00e3o pode sofrer altera\u00e7\u00f5es, mas em grande partes dos casos esse teste nos ajudar\u00e1.<\/p>\n<p>Como se trata de uma fun\u00e7\u00e3o n\u00e3o documentada, ela pode desaparecer nas pr\u00f3ximas edi\u00e7\u00f5es do SQL Server, o que seria uma pena.<\/p>\n<p>Realmente um comando para n\u00e3o esquecer. Tanto que estou guardando aqui bem destacado no Blog.<\/p>\n<p><b>Gostou desse Post?<\/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>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>Ol\u00e1 Pessoal, Continuando os cursos do Paul Randal na PluralSight, muitas ideias de posts v\u00e3o surgindo e com o tempo permitindo, colocarei aqui no Blog. Hoje vou falar de duas fun\u00e7\u00f5es n\u00e3o documentadas que nunca tinha ouvido falar:\u00a0%%PHYSLOC%% e\u00a0fn_PhysLocCracker.<\/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":"","jetpack_post_was_ever_published":false},"categories":[3,942,991,33,280],"tags":[1113,69,85,1012,1011,1115,1114,373,422,1009,1010,21,23,261,1013,1112,1008,1111,33],"class_list":["post-2858","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-consultoria-sql-server","category-dba-remoto","category-sql-server","category-virtual-pass-br","tag-physloc","tag-administracao-de-banco-de-dados","tag-alter-database","tag-base-corrompida","tag-checkdb","tag-como-ler-uma-pagina-de-dados","tag-corrupcao","tag-corrupcao-de-dados","tag-corruption","tag-database-offline","tag-database-pendente-recovery","tag-database-suspect","tag-dba","tag-dbcc-page","tag-emergency-mode","tag-fn_physloccracker","tag-lun","tag-pluralsight","tag-sql-server"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":959,"url":"https:\/\/fabriciolima.net\/blog\/2011\/09\/07\/querys-do-dia-a-dia-monitoramento-do-status-das-databases-e-de-paginas-corrompidas\/","url_meta":{"origin":2858,"position":0},"title":"Querys do Dia a Dia: Monitoramento do Status das Databases e de P\u00e1ginas Corrompidas","author":"Fabr\u00edcio Lima","date":"7 de setembro de 2011","format":false,"excerpt":"Fala Pessoal, Depois de ter algumas p\u00e1ginas corrompidas e uma database em modo Suspect (Casos do Dia a Dia: Corrup\u00e7\u00e3o de Dados e Database Suspect), resolvi criar uma procedure que realiza um monitoramento desse tipo de problema a cada\u00a01 minuto e me envia um e-mail e um torpedo em caso\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3714,"url":"https:\/\/fabriciolima.net\/blog\/2015\/12\/17\/corrupcao-de-dados-incorrect-pfs-free-space-information\/","url_meta":{"origin":2858,"position":1},"title":"Corrup\u00e7\u00e3o de Dados: Incorrect PFS free space information","author":"Fabr\u00edcio Lima","date":"17 de dezembro de 2015","format":false,"excerpt":"Ol\u00e1 Pessoal, Essa semana iniciei mais uma Consultoria Remota em um cliente e uma das atividades mais importante desse servi\u00e7o \u00e9 criar uma rotina para validar diariamente se existe corrup\u00e7\u00e3o nos bancos. Na grande maioria das vezes o banco est\u00e1 abandonado e n\u00e3o tem uma rotina dessa. Ao executar essa\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3022,"url":"https:\/\/fabriciolima.net\/blog\/2014\/06\/16\/cliente-diz-tenho-backups-e-meu-banco-esta-seguro-sera\/","url_meta":{"origin":2858,"position":2},"title":"Cliente diz: &#8220;Tenho Backups e meu banco est\u00e1 seguro&#8221;. Ser\u00e1???","author":"Fabr\u00edcio Lima","date":"16 de junho de 2014","format":false,"excerpt":"Ol\u00e1 Pessoal, O objetivo desse post \u00e9 fazer um alerta a todos voc\u00eas que s\u00e3o respons\u00e1veis por um banco de dados SQL Server, seja voc\u00ea um desenvolvedor, um analista de banco de dados, um coordenador ou gerente de TI. J\u00e1 atendi muitos clientes na minha Consultoria SQL Server que contrataram\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":77,"url":"https:\/\/fabriciolima.net\/blog\/2010\/10\/08\/casos-do-dia-a-dia-database-em-modo-suspect\/","url_meta":{"origin":2858,"position":3},"title":"Casos do Dia a Dia: Database em modo Suspect","author":"Fabr\u00edcio Lima","date":"8 de outubro de 2010","format":false,"excerpt":"Gostaria de compartilhar com voc\u00eas uma experi\u00eancia que tive no ambiente de banco de dados que administro. Realizando um boot em um dos meus servidores SQL Server devido as atualiza\u00e7\u00f5es de seguran\u00e7a do windows, uma de minhas databases subiu em modo Suspect. Como essa database \u00e9 restaurada diariamente do servidor\u2026","rel":"","context":"Em &quot;Casos do Dia a Dia&quot;","block_context":{"text":"Casos do Dia a Dia","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/casos-do-dia-a-dia\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3305,"url":"https:\/\/fabriciolima.net\/blog\/2015\/03\/11\/casos-do-dia-a-dia-mais-um-caso-real-de-perdas-de-dados-em-uma-empresa\/","url_meta":{"origin":2858,"position":4},"title":"Casos do Dia a Dia: Mais um caso real de perdas de dados em uma Empresa","author":"Fabr\u00edcio Lima","date":"11 de mar\u00e7o de 2015","format":false,"excerpt":"Ol\u00e1 Pessoal, Um cliente me procurou dizendo que precisava muito da minha ajuda pois estava com um problema grave no SQL Server. Ele teve um problema com o servidor e s\u00f3 conseguiu salvar os arquivos .mdf e .ldf da base de dados. Contudo, ao tentar dar um attach nesses arquivos,\u2026","rel":"","context":"Em &quot;Administra\u00e7\u00e3o de Banco de Dados&quot;","block_context":{"text":"Administra\u00e7\u00e3o de Banco de Dados","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/administracao-de-bd\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2015\/03\/Attach.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":942,"url":"https:\/\/fabriciolima.net\/blog\/2011\/08\/15\/casos-do-dia-a-dia-corrupcao-de-dados-e-database-suspect\/","url_meta":{"origin":2858,"position":5},"title":"Casos do Dia a Dia: Corrup\u00e7\u00e3o de Dados e Database Suspect","author":"Fabr\u00edcio Lima","date":"15 de agosto de 2011","format":false,"excerpt":"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\u2026","rel":"","context":"Em &quot;Casos do Dia a Dia&quot;","block_context":{"text":"Casos do Dia a Dia","link":"https:\/\/fabriciolima.net\/blog\/category\/sql-server\/casos-do-dia-a-dia\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2858","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=2858"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/2858\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=2858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=2858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=2858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}