{"id":119,"date":"2006-08-07T12:30:31","date_gmt":"2006-08-07T10:30:31","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/2006\/08\/07\/sql-talk\/db-defekte\/vorgehen-bei-datenbank-reparaturen-teil-2a-2"},"modified":"2006-08-07T12:36:51","modified_gmt":"2006-08-07T10:36:51","slug":"vorgehen-bei-datenbank-reparaturen-teil-2a-2","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2006\/08\/07\/sql-talk\/db-defekte\/vorgehen-bei-datenbank-reparaturen-teil-2a-2","title":{"rendered":"Vorgehen bei Datenbank-Reparaturen (Teil 2b)"},"content":{"rendered":"<p>Im <a href=\"http:\/\/www.glorf.it\/blog\/2006\/07\/31\/sql-talk\/db-defekte\/vorgehen-bei-datenbank-reparaturen-teil-2a\">vorherigen Teil<\/a> der Serie zum Vorgehen bei Datenbank-Reparaturen am SQL Server 2000 wurde erkl&#228;rt, wie man vorgeht, wenn das Tranlog defekt ist und die Datenbank ordentlich geschlossen wurde, d.h. das Transaktionslog im Prinzip leer ist. Trotz Urlaub will ich daran ankn&#252;pfen:<br \/>\nWas macht man aber, wenn die Datenbank nicht geschlossen wurde, sondern der Server abst&#252;rzte, weil die Festplatte langsam schrottet und just da auch noch das Tranlog r&#252;ber rudert? Das ist ein h&#228;ufiges Szenario, weil das Tranlog sehr oft zugegriffen wird. Und deswegen besonders oft von Festplattenproblemen betroffen ist.<\/p>\n<p>In diesem Fall muss wird die &quot;Reparatur&quot; etwas fummelig. Wenn man Gl&#252;ck hat, dann ist die Datenbank noch am SQL Server angeh&#228;ngt, aber als suspekt markiert. Wenn man den <a href=\"http:\/\/www.glorf.it\/blog\/2006\/07\/31\/sql-talk\/db-defekte\/vorgehen-bei-datenbank-reparaturen-teil-2a\">vorherigen Tipp<\/a> ausprobiert hat ohne vorher die Master-Datenbank zu sichern oder einem die DB-Dateien zur Untersuchung zugeschickt wurden, dann muss man der <a href=\"http:\/\/www.glorf.it\/blog\/2006\/07\/24\/sql-talk\/db-defekte\/vorgehen-bei-datenbank-reparaturen-teil-1\">SQL-Server erst mal austricksen, um die defekte Datenbank an den Server angeh&#228;ngt zu bekommen<\/a>. Wenn man dann soweit ist, dass die Datenbank angeh&#228;ngt, aber suspekt ist, dann ist es nicht mehr so schwierig. Mit beiliegendem Statement bekommt man &#252;brigens eine Liste aller Datenbanken mit deren Status:<\/p>\n<p><code lang=\"SQL\">select name, databasepropertyex(name, 'status')<br \/>\n\tfrom master.dbo.sysdatabases<\/code><\/p>\n<p>Im Folgenden wird erkl&#228;rt, wie man das Tranlog l&#246;scht und vom SQL Srever ein Neues anlegen l&#228;sst. Da im Tranlog aber eventuell wichtige Daten standen, erzeugt man dadurch m&#246;glicherweise einen inkonsistenten Datenbestand.<\/p>\n<p>(1) Datenbank in den &quot;Emergency-Mode&quot; schalten. Beim n&#228;chsten Start wird f&#252;r die Datenbank kein Recovery versucht:<\/p>\n<p><code lang=\"SQL\">-- &#196;nderungen in den Systemtabellen erlauben<br \/>\nexec sp_configure &#x0027;allow update&#x0027;, 1<br \/>\nreconfigure with override<br \/>\ngo<br \/>\n&#8211; Datenbank in den Emergency mode setzen<br \/>\nupdate master..sysdatabases<br \/>\n\tset status = status | 32768<br \/>\n\twhere name = &#x0027;MyCrashDB&#x0027;<br \/>\ngo<br \/>\n&#8211; &#196;nderungen in den Systemtabellen verbieten<br \/>\nexec sp_configure &#x0027;allow update&#x0027;, 0<br \/>\nreconfigure with override<\/code><\/p>\n<p>(2) SQL-Server-Dienst stoppen und neu starten. Erst danach ist die Datenbank im Emergency-Mode. <\/p>\n<p>(3) Jetzt kann ein neues Transaktionslog angelegt werden. Vorher muss man die alte Tranlog-Datei noch schnell umbenennen (oder l&#246;schen, denn man hat ja vorher eine Kopie gemacht, oder?)<\/p>\n<p><code lang=\"SQL\">-- Log neu erzeugen lassen:<br \/>\nDBCC rebuild_log (&#x0027;MyCrashDB&#x0027;)<\/code><\/p>\n<p>Das Ergebnis sieht etwa so aus:<\/p>\n<p><code>Warning: The log for database 'MyCrashDB' has been rebuilt. Transactional consistency has been lost. DBCC CHECKDB should be run to validate physical consistency. Database options will have to be reset, and extra log files may need to be deleted.<br \/>\nDBCC execution completed. If DBCC printed error messages, contact your system administrator.<\/code><\/p>\n<p>(4) Jetzt muss man die DB nur wieder auf &quot;normal&quot; schalten:<\/p>\n<p><code lang=\"SQL\">alter database MyCrashDB<br \/>\nset online<\/code><\/p>\n<p>Und schon hat man es geschafft.<br \/>\nDie gute Nachricht ist, dass man beim SQL Server 2005 nicht mehr in den Systemtabellen rumpfuschen muss. Die schlechte ist, dass immer noch viel Handarbeit notwendig ist. Naja, aber so arme Hunde wie ich m&#252;ssen ja auch leben&#8230; \ud83d\ude09<\/p>\n<p>Im dritten Teil geht es dann um Reparaturen rund um DBCC CHECKDB.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im vorherigen Teil der Serie zum Vorgehen bei Datenbank-Reparaturen am SQL Server 2000 wurde erkl&#228;rt, wie man vorgeht, wenn das Tranlog defekt ist und die Datenbank ordentlich geschlossen wurde, d.h. das Transaktionslog im Prinzip leer ist. Trotz Urlaub will ich daran ankn&#252;pfen: Was macht man aber, wenn die Datenbank nicht geschlossen wurde, sondern der Server [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/119"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":0,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}