{"id":4528,"date":"2015-06-23T12:34:05","date_gmt":"2015-06-23T19:34:05","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/paul\/?p=4528"},"modified":"2015-10-26T06:53:39","modified_gmt":"2015-10-26T13:53:39","slug":"disaster-recovery-101-fixing-a-broken-boot-page","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/","title":{"rendered":"Disaster recovery 101: fixing a broken boot page"},"content":{"rendered":"<p>One of the corruptions that can stymie all efforts at disaster recovery is broken boot page. If the boot page can&#8217;t be processed, the database can&#8217;t be brought online or even put into emergency mode. I first demonstrated how to work around this in my session on Advanced Data Recovery Techniques at PASS in 2014 and here I&#8217;d like to walk through the steps of what to do.<\/p>\n<p>First of all, I&#8217;ll create a broken boot page in a test database:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\n-- Drop old database\r\nUSE &#x5B;master];\r\nGO\r\n\r\nIF DATABASEPROPERTYEX (N'Company', N'Version') != 0\r\nBEGIN\r\n\tALTER DATABASE &#x5B;Company] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;\r\n\tDROP DATABASE &#x5B;Company];\r\nEND\r\n\r\n-- Create database and table\r\nCREATE DATABASE &#x5B;Company] ON PRIMARY (\r\n    NAME = N'Company',\r\n    FILENAME = N'D:\\SQLskills\\Company.mdf')\r\nLOG ON (\r\n    NAME = N'Company_log',\r\n    FILENAME = N'D:\\SQLskills\\Company_log.ldf');\r\nGO\r\n\r\nUSE &#x5B;Company];\r\nGO\r\n\r\nCREATE TABLE &#x5B;Sales] (\r\n\t&#x5B;SalesID] INT IDENTITY,\r\n\t&#x5B;CustomerID] INT DEFAULT CONVERT (INT, 100000 * RAND ()),\r\n\t&#x5B;SalesDate] DATETIME DEFAULT GETDATE (),\r\n\t&#x5B;SalesAmount] MONEY DEFAULT CONVERT (MONEY, 100 * RAND ()));\r\n\r\nCREATE CLUSTERED INDEX &#x5B;SalesCI] ON &#x5B;Sales] (&#x5B;SalesID]);\r\nGO\r\n\r\n-- Populate the table\r\nSET NOCOUNT ON;\r\nGO\r\n\r\nINSERT INTO &#x5B;Sales] DEFAULT VALUES;\r\nGO 5000\r\n\r\n-- Create some nonclustered indexes\r\nCREATE NONCLUSTERED INDEX &#x5B;SalesNCI_CustomerID] ON &#x5B;Sales] (&#x5B;CustomerID]);\r\n\r\nCREATE NONCLUSTERED INDEX &#x5B;SalesNCI_SalesDate_SalesAmount] ON &#x5B;Sales] (&#x5B;SalesDate]) INCLUDE (&#x5B;SalesAmount]);\r\nGO\r\n\r\n-- Create a good backup\r\nBACKUP DATABASE &#x5B;Company] TO DISK = N'C:\\SQLskills\\OldCompany.bck'\r\nWITH INIT;\r\n\r\n-- And detach it\r\nUSE &#x5B;master]\r\nGO\r\n\r\nEXEC sp_detach_db N'Company';\r\nGO\r\n<\/pre>\n<p>Now I&#8217;ll corrupt it using a hex editor. The one I like to use is called HxD and it&#8217;s a freeware tool you can download from <a href=\"http:\/\/mh-nexus.de\/en\/hxd\/\" target=\"_blank\">here<\/a>.<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-4529\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg\" alt=\"image1\" width=\"620\" height=\"501\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg 620w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1-300x242.jpg 300w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>And then go to the offset of the boot page. It&#8217;s page 9 always, so the offset is 8192 x 9 = 73728.<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image2.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-4530\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image2.jpg\" alt=\"image2\" width=\"630\" height=\"286\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image2.jpg 630w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image2-300x136.jpg 300w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>And make sure to select the &#8216;dec&#8217; option to input the number in decimal, offset from beginning of the file:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image3.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-4531\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image3.jpg\" alt=\"image3\" width=\"239\" height=\"242\" \/><\/a><\/p>\n<p>You&#8217;ll see the boot page contents, including the name of the database:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image4.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4532\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image4.jpg\" alt=\"image4\" width=\"631\" height=\"329\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image4.jpg 631w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image4-300x156.jpg 300w\" sizes=\"(max-width: 631px) 100vw, 631px\" \/><\/a><\/p>\n<p>Highlight all the lines down to the database name, and then right-click and select Fill selection&#8230;<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image5.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4533\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image5.jpg\" alt=\"image5\" width=\"636\" height=\"491\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image5.jpg 636w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image5-300x232.jpg 300w\" sizes=\"(max-width: 636px) 100vw, 636px\" \/><\/a><\/p>\n<p>And then select the default to fill that area with zeroes:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image6.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4534\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image6.jpg\" alt=\"image6\" width=\"407\" height=\"282\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image6.jpg 407w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image6-300x208.jpg 300w\" sizes=\"(max-width: 407px) 100vw, 407px\" \/><\/a><\/p>\n<p>Which will make it look like this:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image7.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4535\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image7.jpg\" alt=\"image7\" width=\"637\" height=\"336\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image7.jpg 637w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image7-300x158.jpg 300w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/><\/a><\/p>\n<p>Then hit the disk icon to save the file. Ignore any security errors you get about the ownership of the backup file.<\/p>\n<p>Throughout the rest of these steps, if you get &#8220;Access is denied&#8221; from SQL Server, you need to change the security in the directory you&#8217;re using so the SQL Server service account has the correct file permissions.<\/p>\n<p>You will also see different messages through some of these steps depending on which version of SQL Server you&#8217;re using &#8211; I&#8217;m using SQL Server 2014.<\/p>\n<p>Exit from HxD.<\/p>\n<p>Now we&#8217;re ready to try to salvage this database.<\/p>\n<p>First I&#8217;ll try to attach it:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nUSE &#x5B;master];\r\nGO\r\n\r\n-- Try attaching it again\r\nEXEC sp_attach_db @dbname = N'Company', \r\n    @filename1 = N'D:\\SQLskills\\Company.mdf', \r\n    @filename2 = N'D:\\SQLskills\\Company_log.ldf';\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nMsg 1813, Level 16, State 2, Line 5\r\nCould not open new database 'Company'. CREATE DATABASE is aborted.\r\nMsg 824, Level 24, State 2, Line 5\r\nSQL Server detected a logical consistency-based I\/O error: incorrect pageid (expected 1:9; actual 0:0). It occurred during a read of page (1:9) in database ID 6 at offset 0x00000000012000 in file 'D:\\SQLskills\\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>The attach failed. You can verify this yourself by looking in <em>sys.databases<\/em> for the database &#8211; it&#8217;s not there.<\/p>\n<p>I&#8217;ll try a hack-attach. I copied off the corrupt database files, and then create the dummy database and set it offline (to release SQL Server&#8217;s locks on the files):<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nCREATE DATABASE &#x5B;Company] ON PRIMARY (\r\n    NAME = N'Company',\r\n    FILENAME = N'D:\\SQLskills\\Company.mdf')\r\nLOG ON (\r\n    NAME = N'Company_log',\r\n    FILENAME = N'D:\\SQLskills\\Company_log.ldf');\r\nGO\r\n\r\nALTER DATABASE &#x5B;Company] SET OFFLINE;\r\nGO\r\n<\/pre>\n<p>Then delete the dummy database files, and copy in the original corrupt database files. And then try to bring the database online again, completing the hack-attach:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET ONLINE;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nMsg 5181, Level 16, State 5, Line 33\r\nCould not restart database &quot;Company&quot;. Reverting to the previous status.\r\nMsg 5069, Level 16, State 1, Line 33\r\nALTER DATABASE statement failed.\r\nMsg 824, Level 24, State 2, Line 33\r\nSQL Server detected a logical consistency-based I\/O error: incorrect pageid (expected 1:9; actual 0:0). It occurred during a read of page (1:9) in database ID 6 at offset 0x00000000012000 in file 'D:\\SQLskills\\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>Hmmm&#8230; but did it work?<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSELECT DATABASEPROPERTYEX (N'Company', N'STATUS');\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nSUSPECT\r\n<\/pre>\n<p>Yes! Now let&#8217;s try doing an emergency-mode repair:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET EMERGENCY;\r\nGO\r\nALTER DATABASE &#x5B;Company] SET SINGLE_USER;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nMsg 824, Level 24, State 2, Line 43\r\nSQL Server detected a logical consistency-based I\/O error: incorrect pageid (expected 1:9; actual 0:0). It occurred during a read of page (1:9) in database ID 6 at offset 0x00000000012000 in file 'D:\\SQLskills\\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>Nope &#8211; it&#8217;s not going to work because the broken boot page won&#8217;t allow the database to be accessed at all.<\/p>\n<p>Now we&#8217;ll fix it, again using a hex editor.<\/p>\n<p>First off I&#8217;ll set the database offline again, copy off the broken files, and drop the database so it&#8217;s gone from SQL Server.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET OFFLINE;\r\nGO\r\n\r\n-- ***** Copy off the corrupt files\r\n\r\nDROP DATABASE &#x5B;Company];\r\nGO\r\n<\/pre>\n<p>Now I&#8217;ll restore an older copy of the database and set it offline so I can open the files with HxD:<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nRESTORE DATABASE &#x5B;Company] FROM\r\nDISK = N'C:\\SQLskills\\OldCompany.bck'\r\nWITH REPLACE;\r\nGO\r\n\r\nALTER DATABASE &#x5B;Company] SET OFFLINE;\r\nGO\r\n<\/pre>\n<p>In HxD, I then open the restored copy of the database AND the corrupt database, and go to the boot page offset in both, just as I did in the setup phase above:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image8.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4536\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image8.jpg\" alt=\"image8\" width=\"635\" height=\"326\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image8.jpg 635w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image8-300x154.jpg 300w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><\/a><\/p>\n<p>And you can see that the boot page is intact in the restored copy.<\/p>\n<p>Next, I&#8217;ll highlight from 12000 (hexadecimal) down to, but not including, 14000, and then right-click and hit Copy to copy\u00a0the whole 8192 bytes. These offsets are the same in every database.<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image9.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4537\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image9.jpg\" alt=\"image9\" width=\"646\" height=\"278\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image9.jpg 646w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image9-300x129.jpg 300w\" sizes=\"(max-width: 646px) 100vw, 646px\" \/><\/a><\/p>\n<p>Then go to the corrupt file, at offset 12000 (same in every database), right-click and select Paste Write to overwrite the broken boot page:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image10.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4538\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image10.jpg\" alt=\"image10\" width=\"626\" height=\"410\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image10.jpg 626w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image10-300x196.jpg 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/a><\/p>\n<p>And you&#8217;ll see everything between 12000 and 14000 (same in every database) go red:<\/p>\n<p><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image11.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4539\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image11.jpg\" alt=\"image11\" width=\"643\" height=\"283\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image11.jpg 643w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image11-300x132.jpg 300w\" sizes=\"(max-width: 643px) 100vw, 643px\" \/><\/a><\/p>\n<p>Now save the file and exit HxD.<\/p>\n<p>Delete the restored files, and rename the corrupt files to their correct names. You&#8217;ll notice that HxD created a backup copy of the file we just changed &#8211; you can ignore it.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET ONLINE;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nMsg 5181, Level 16, State 5, Line 79\r\nCould not restart database &quot;Company&quot;. Reverting to the previous status.\r\nMsg 5069, Level 16, State 1, Line 79\r\nALTER DATABASE statement failed.\r\nMsg 9003, Level 20, State 9, Line 79\r\nThe log scan number (45:16:0) passed to log scan in database 'Company' is not valid. This error may indicate data corruption or that the log file (.ldf) does not match the data file (.mdf). If this error occurred during replication, re-create the publication. Otherwise, restore from backup if the problem results in a failure during startup.\r\nMsg 3414, Level 21, State 1, Line 79\r\nAn error occurred during recovery, preventing the database 'Company' (6:0) from restarting. Diagnose the recovery errors and fix them, or restore from a known good backup. If errors are not corrected or expected, contact Technical Support.\r\n<\/pre>\n<p>Good &#8211; the 824 message is gone, but now you can see we have another issue: all the LSNs in the boot page are incorrect now as we&#8217;re now using an older boot page that doesn&#8217;t match the more recent transaction log. Emergency mode and\/or emergency-mode repair is necessary to either access the data or repair the corrupt database.<\/p>\n<pre class=\"brush: sql; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nALTER DATABASE &#x5B;Company] SET EMERGENCY;\r\nGO\r\nALTER DATABASE &#x5B;Company] SET SINGLE_USER;\r\nGO\r\nDBCC CHECKDB (N'Company', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS;\r\nGO\r\n<\/pre>\n<pre class=\"brush: plain; gutter: false; title: ; toolbar: true; wrap-lines: true; notranslate\" title=\"\">\r\nWarning: The log for database 'Company' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.\r\n<\/pre>\n<p>In this case there were no other corruptions, so all emergency-mode repair had to do is rebuild the transaction log.<\/p>\n<p>Now we can get in to the database and access the data.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Note: the data is likely to be transactionally inconsistent. If you continue to use the database in production following this procedure, you do so entirely at your own risk.<\/strong><\/span><\/p>\n<p>If you don&#8217;t have a backup of the original database, you can use any database as a source for a good\u00a0boot page &#8211; just make sure it has the same name as the one you&#8217;re trying to fix. Bear in mind that the further away from a recent backup of the original database, the more trouble you&#8217;ll have trying to get crash recovery to work.<\/p>\n<p>And there you have it &#8211; no longer do broken boot pages have to curtail data recovery efforts.<\/p>\n<p>Enjoy!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the corruptions that can stymie all efforts at disaster recovery is broken boot page. If the boot page can&#8217;t be processed, the database can&#8217;t be brought online or even put into emergency mode. I first demonstrated how to work around this in my session on Advanced Data Recovery Techniques at PASS in 2014 [&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],"tags":[],"class_list":["post-4528","post","type-post","status-publish","format-standard","hentry","category-corruption","category-disaster-recovery"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Disaster recovery 101: fixing a broken boot page - 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\/disaster-recovery-101-fixing-a-broken-boot-page\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Disaster recovery 101: fixing a broken boot page - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"One of the corruptions that can stymie all efforts at disaster recovery is broken boot page. If the boot page can&#8217;t be processed, the database can&#8217;t be brought online or even put into emergency mode. I first demonstrated how to work around this in my session on Advanced Data Recovery Techniques at PASS in 2014 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2015-06-23T19:34:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-10-26T13:53:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg\" \/>\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=\"9 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\/disaster-recovery-101-fixing-a-broken-boot-page\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/\",\"name\":\"Disaster recovery 101: fixing a broken boot page - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg\",\"datePublished\":\"2015-06-23T19:34:05+00:00\",\"dateModified\":\"2015-10-26T13:53:39+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#primaryimage\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg\",\"contentUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg\",\"width\":620,\"height\":501},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Disaster recovery 101: fixing a broken boot page\"}]},{\"@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":"Disaster recovery 101: fixing a broken boot page - 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\/disaster-recovery-101-fixing-a-broken-boot-page\/","og_locale":"en_US","og_type":"article","og_title":"Disaster recovery 101: fixing a broken boot page - Paul S. Randal","og_description":"One of the corruptions that can stymie all efforts at disaster recovery is broken boot page. If the boot page can&#8217;t be processed, the database can&#8217;t be brought online or even put into emergency mode. I first demonstrated how to work around this in my session on Advanced Data Recovery Techniques at PASS in 2014 [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/","og_site_name":"Paul S. Randal","article_published_time":"2015-06-23T19:34:05+00:00","article_modified_time":"2015-10-26T13:53:39+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg","type":"","width":"","height":""}],"author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/","name":"Disaster recovery 101: fixing a broken boot page - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg","datePublished":"2015-06-23T19:34:05+00:00","dateModified":"2015-10-26T13:53:39+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#primaryimage","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg","contentUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2015\/06\/image1.jpg","width":620,"height":501},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/disaster-recovery-101-fixing-a-broken-boot-page\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"Disaster recovery 101: fixing a broken boot page"}]},{"@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\/4528","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=4528"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/4528\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=4528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=4528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=4528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}