{"id":4575,"date":"2015-12-03T12:20:10","date_gmt":"2015-12-03T20:20:10","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/paul\/?p=4575"},"modified":"2015-12-03T12:20:10","modified_gmt":"2015-12-03T20:20:10","slug":"data-recovery-investigating-weird-select-failures-around-corruption","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/","title":{"rendered":"Data recovery: investigating weird SELECT failures around corruption"},"content":{"rendered":"<p>An interesting corruption problem cropped up on the MCM distribution list yesterday and after I figured it out, I thought it would make a good blog post in case anyone hits a similar problem.<\/p>\n<p>In a nutshell, the problem was corruption such that a simple <em>SELECT *<\/em> query failed, but a <em>SELECT *<\/em> query with an <em>ORDER BY<\/em> clause worked.<\/p>\n<p>Let&#8217;s investigate!<\/p>\n<h2>Creating the scenario<\/h2>\n<p>First I&#8217;ll create the specific corruption. I&#8217;m going to create a simple table with a clustered index, and sizing the rows so there&#8217;s only one per page.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nCREATE DATABASE &#x5B;Company];\r\nGO\r\n\r\nUSE &#x5B;Company];\r\nGO\r\n\r\nCREATE TABLE &#x5B;test] (\r\n\t&#x5B;c1] INT IDENTITY,\r\n\t&#x5B;c2] UNIQUEIDENTIFIER DEFAULT NEWID (),\r\n\t&#x5B;c3] CHAR (4100) DEFAULT 'a');\r\nGO\r\nCREATE CLUSTERED INDEX &#x5B;test_cl] ON &#x5B;test] (&#x5B;c1], &#x5B;c2]);\r\nGO\r\n\r\nSET NOCOUNT ON;\r\nGO\r\n\r\nINSERT INTO &#x5B;test] DEFAULT VALUES;\r\nGO 10000\r\n<\/pre>\n<p>Now I&#8217;ll delete one of the rows, creating a page with a single ghost record on it, which I can see using <em>DBCC PAGE<\/em> on the first PFS page in the database.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nDELETE FROM &#x5B;test] WHERE &#x5B;c1] = 150;\r\nGO\r\n\r\nDBCC TRACEON (3604);\r\nDBCC PAGE (&#x5B;Company], 1, 1, 3);\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\n&lt;snip output for brevity&gt;\r\n(1:289)      - (1:295)      =     ALLOCATED   0_PCT_FULL                     Mixed Ext\r\n(1:296)      - (1:437)      =     ALLOCATED   0_PCT_FULL                              \r\n(1:438)      -              =     ALLOCATED   0_PCT_FULL Has Ghost                    \r\n(1:439)      - (1:8087)     =     ALLOCATED   0_PCT_FULL                              \r\n<\/pre>\n<p>So page (1:438) is the one that had the row with key value 150 on it. It&#8217;s still allocated and linked into the clustered index structure though, so I&#8217;ll force the Access Methods code to &#8216;see&#8217; it by doing a scan that&#8217;ll include it, and that will queue the page up for cleaning by the Ghost Cleanup Task.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT COUNT (*) FROM &#x5B;test] WHERE &#x5B;c1] &amp;amp;lt; 200;\r\nGO\r\n<\/pre>\n<p>And now if I wait 10 seconds and look at the PFS page again, I can see it&#8217;s been cleaned and deallocated &#8211; it&#8217;s no longer part of the clustered index. (You&#8217;ll notice that the PFS byte still says that the page has a ghost record; that&#8217;s because when a page is deallocated, the only PFS bits that are changed are the allocation status.)<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nDBCC PAGE (&#x5B;Company], 1, 1, 3);\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\n&lt;snip output for brevity&gt;\r\n(1:289)      - (1:295)      =     ALLOCATED   0_PCT_FULL                     Mixed Ext\r\n(1:296)      - (1:437)      =     ALLOCATED   0_PCT_FULL                              \r\n(1:438)      -              = NOT ALLOCATED   0_PCT_FULL Has Ghost                    \r\n(1:439)      - (1:8087)     =     ALLOCATED   0_PCT_FULL                              \r\n<\/pre>\n<p>Nothing&#8217;s corrupt at this point, so let&#8217;s cause some problems.<\/p>\n<h2>Creating the corruption<\/h2>\n<p>First off I&#8217;m going to zero out page (1:438) using <em>DBCC WRITEPAGE<\/em>:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET SINGLE_USER;\r\nGO\r\n\r\nDECLARE @offset INT;\r\nSELECT @offset = 0;\r\n\r\nWHILE (@offset &lt; 8185)\r\nBEGIN\r\n\tDBCC WRITEPAGE (N'Company', 1, 438, @offset, 8, 0x0000000000000000, 1);\r\n\tSELECT @offset = @offset + 8;\r\nEND;\r\nGO\r\n\r\nALTER DATABASE &#x5B;Company] SET MULTI_USER;\r\nGO\r\n<\/pre>\n<p>And there&#8217;s still no corruption here, because page (1:438) is a deallocated page.<\/p>\n<p>So now I&#8217;ll corrupt it by forcing it to be allocated again. For this I need to find the offset of the PFS byte for page (1:438) using a hex dump of the PFS page and looking for a page that has the PFS bits matching the PFS output for page (1:438) above. The page only has the &#8216;Has Ghost&#8217; bit set, which is 0x08.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nDBCC PAGE (&#x5B;Company], 1, 1, 2);\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\n&lt;snip&gt;\r\nMemory Dump @0x00000000185EA000\r\n\r\n00000000185EA000:   010b0000 00000000 00000000 00000000 00000000  ....................\r\n00000000185EA014:   00000100 63000000 0200fc1f 01000000 01000000  ....c.....\u00fc.........\r\n00000000185EA028:   12010000 fd000000 01000000 00000000 00000000  ....\u00fd...............\r\n00000000185EA03C:   7944876a 01000000 00000000 00000000 00000000  yD\u0087j................\r\n00000000185EA050:   00000000 00000000 00000000 00000000 00009c1f  ..................\u009c.\r\n00000000185EA064:   44444444 00004444 60647060 74706070 60607060  DDDD..DD`dp`tp`p``p`\r\n00000000185EA078:   60707060 40404040 40404040 61706070 60606070  `pp`@@@@@@@@ap`p```p\r\n00000000185EA08C:   60706060 60706060 60706060 60606070 40404040  `p```p```p`````p@@@@\r\n00000000185EA0A0:   40404040 40404040 40404030 60706060 70607060  @@@@@@@@@@@0`p``p`p`\r\n00000000185EA0B4:   70706070 70606060 70607060 70607060 70607060  pp`pp```p`p`p`p`p`p`\r\n00000000185EA0C8:   70607060 70607060 70606060 60607060 60706070  p`p`p`p`p`````p``p`p\r\n00000000185EA0DC:   60706070 60706070 60707070 60607060 60706060  `p`p`p`p`ppp``p``p``\r\n00000000185EA0F0:   60706060 70606060 60606060 70607060 60706060  `p``p```````p`p``p``\r\n00000000185EA104:   60606060 60606060 40000000 00000000 60606060  ````````@.......````\r\n00000000185EA118:   60606060 60606060 60606060 60606060 60606060  ````````````````````\r\n00000000185EA12C:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA140:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA154:   60606060 64646260 40404040 40404040 40404040  ````ddb`@@@@@@@@@@@@\r\n00000000185EA168:   40404040 40400000 00000000 40400000 00000000  @@@@@@......@@......\r\n00000000185EA17C:   40404040 00000000 70606060 60606060 40404040  @@@@....p```````@@@@\r\n00000000185EA190:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA1A4:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA1B8:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA1CC:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA1E0:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA1F4:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA208:   40404040 40404040 40404040 40404040 40400840  @@@@@@@@@@@@@@@@@@.@\r\n00000000185EA21C:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n00000000185EA230:   40404040 40404040 40404040 40404040 40404040  @@@@@@@@@@@@@@@@@@@@\r\n&lt;snip&gt;\r\n<\/pre>\n<p>Can you spot the 0x08 byte? It&#8217;s at offset 0x21a on the page.<\/p>\n<p>I can force page (1:438) to become allocated again by setting that byte offset in the PFS page to 0x40, again using <em>DBCC WRITEPAGE<\/em>.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nDBCC WRITEPAGE (N'Company', 1, 1, 538, 1, 0x40);\r\nGO\r\n<\/pre>\n<p>And now if I run <em>DBCC CHECKDB<\/em>, I can see some corruption:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nDBCC CHECKDB (N'Company') WITH NO_INFOMSGS;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nMsg 8909, Level 16, State 1, Line 68\r\nTable error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (1:438) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).\r\nCHECKDB found 0 allocation errors and 1 consistency errors not associated with any single object.\r\nMsg 8928, Level 16, State 1, Line 68\r\nObject ID 245575913, index ID 1, partition ID 72057594040614912, alloc unit ID 72057594045857792 (type In-row data): Page (1:438) could not be processed.  See other errors for details.\r\nCHECKDB found 0 allocation errors and 1 consistency errors in table 'test' (object ID 245575913).\r\nCHECKDB found 0 allocation errors and 2 consistency errors in database 'Company'.\r\nrepair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (Company).\r\n<\/pre>\n<p>And the final step is to make the database read-only:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET READ_ONLY;\r\nGO\r\n<\/pre>\n<h2>Investigating the corruption<\/h2>\n<p>In the case described in the DL, there was no backup and so the client wanted to extract as much data as possible.<\/p>\n<p>Running a simple <em>SELECT *<\/em> didn&#8217;t work, like so:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM &#x5B;test];\r\nGO\r\n<\/pre>\n<p>The query will start to give results and then fail with:<\/p>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nMsg 824, Level 24, State 2, Line 74\r\nSQL Server detected a logical consistency-based I\/O error: incorrect pageid (expected 1:438; actual 0:0). It occurred during a read of page (1:438) in database ID 10 at offset 0x0000000036c000 in file 'C:\\Program Files\\Microsoft SQL Server\\MSSQL12.SQL2014\\MSSQL\\DATA\\Company.mdf'.  Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.\r\n<\/pre>\n<p>But if I run a SELECT * that has ordering, it works fine:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT * FROM &#x5B;test] ORDER BY &#x5B;c1];\r\nGO\r\n<\/pre>\n<p>What&#8217;s going on?<\/p>\n<h2>Explanation<\/h2>\n<p>The explanation is to do with how the two scans work for the <em>SELECT<\/em> statements.<\/p>\n<p>The first scan\u00a0is doing what&#8217;s called an <em>allocation order scan<\/em>. This is where the Access Methods decides not to use the index structure to give back the records. An allocation order scan has three requirements:<\/p>\n<ul>\n<li>The query plan must allow for an unordered scan of the index<\/li>\n<li>The index must be bigger than 64 pages<\/li>\n<li>The data in the index must be guaranteed not to change<\/li>\n<\/ul>\n<p>The allocation order scan uses the IAM pages to load a scanning object and then zip through the extents in allocation order, using the PFS pages to determine which pages in the extents are allocated and should be read and processed by the scan.<\/p>\n<p>The second scan\u00a0is doing a normal ordered scan, which navigates down to the left-hand side of the leaf level in the index and then follows the leaf-level page linkages to scan through the index.<\/p>\n<p>So where does the corruption come in?<\/p>\n<p>The page that I corrupted and then forced to be allocated again isn&#8217;t linked in to the leaf-level of the index, and so the ordered scan doesn&#8217;t attempt to read it. However, because it&#8217;s allocated, the allocation order scan thinks it&#8217;s a valid part of the extent that contains it and so tried to read it, resulting in the 823 error.<\/p>\n<p>The key to having this scenario is that the database is set to read-only, which satisfies the third requirement for an allocation order scan. If you set the database back to read-write, and then run the first <em>SELECT<\/em> statement, it will work perfectly because the allocation order scan requirements aren&#8217;t being met any longer.<\/p>\n<p>You can read more about allocation order scans in <a href=\"http:\/\/sqlperformance.com\/2015\/01\/t-sql-queries\/allocation-order-scans\" target=\"_blank\">this great post<\/a> from Paul White.<\/p>\n<h2>Summary<\/h2>\n<p>A lot of the time when dealing with database corruption and trying to effect comprehensive data recovery without backups, you&#8217;ll run into weird situations like this. When you do, step back, look at the query plan for what you&#8217;re doing, and think about what the Access Methods is doing under the covers to implement the query plan. And then think about how to work around that so you can continue getting more data back.<\/p>\n<p>Hope this helps!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>An interesting corruption problem cropped up on the MCM distribution list yesterday and after I figured it out, I thought it would make a good blog post in case anyone hits a similar problem. In a nutshell, the problem was corruption such that a simple SELECT * query failed, but a SELECT * query with [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,35,48,62],"tags":[],"class_list":["post-4575","post","type-post","status-publish","format-standard","hentry","category-corruption","category-disaster-recovery","category-inside-the-storage-engine","category-on-disk-structures"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Data recovery: investigating weird SELECT failures around corruption - Paul S. Randal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data recovery: investigating weird SELECT failures around corruption - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"An interesting corruption problem cropped up on the MCM distribution list yesterday and after I figured it out, I thought it would make a good blog post in case anyone hits a similar problem. In a nutshell, the problem was corruption such that a simple SELECT * query failed, but a SELECT * query with [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-03T20:20:10+00:00\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/\",\"name\":\"Data recovery: investigating weird SELECT failures around corruption - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"datePublished\":\"2015-12-03T20:20:10+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data recovery: investigating weird SELECT failures around corruption\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Data recovery: investigating weird SELECT failures around corruption - Paul S. Randal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/","og_locale":"en_US","og_type":"article","og_title":"Data recovery: investigating weird SELECT failures around corruption - Paul S. Randal","og_description":"An interesting corruption problem cropped up on the MCM distribution list yesterday and after I figured it out, I thought it would make a good blog post in case anyone hits a similar problem. In a nutshell, the problem was corruption such that a simple SELECT * query failed, but a SELECT * query with [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/","og_site_name":"Paul S. Randal","article_published_time":"2015-12-03T20:20:10+00:00","author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/","name":"Data recovery: investigating weird SELECT failures around corruption - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"datePublished":"2015-12-03T20:20:10+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/data-recovery-investigating-weird-select-failures-around-corruption\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"Data recovery: investigating weird SELECT failures around corruption"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=4575"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4575\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=4575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=4575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=4575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}