{"id":2548,"date":"2009-04-12T12:39:39","date_gmt":"2009-04-12T10:39:39","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/?p=2548"},"modified":"2009-08-14T19:33:13","modified_gmt":"2009-08-14T17:33:13","slug":"mdf-datei-vor-dem-anhaengen-analysieren","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2009\/04\/12\/sql-talk\/sql-server\/mdf-datei-vor-dem-anhaengen-analysieren","title":{"rendered":"MDF-Datei vor dem Anh&#228;ngen analysieren"},"content":{"rendered":"<p>Wenn man eine Datenbank mittels des &quot;SQL Server Management Studios&quot; anh&#228;ngt, dann bekommt man bereits vor dem eigentlichen Anh&#228;ngen an der Oberfl&#228;che angezeigt, aus wie vielen Dateien die Datenbank besteht und wo die Dateien zuletzt lagen. Nun gibt es aber Anwendungen, die f&#252;r Endanwender gedacht ist, die mit der Bedienung des Management-Studios durchaus &#252;berfordert sein k&#246;nnten. <\/p>\n<p>Wenn man das Anh&#228;ngen &#8211; z.B. nach einer R&#252;cksicherung aus einer Datei-Vollsicherung &#8211; nicht den Anwender manuell durchf&#252;hren lassen will, sondern automatisch aus der eigenen Anwendung, dann muss man auch irgendwie an diese Infos ran kommen. <\/p>\n<p>Zu diesem Zweck bietet Microsoft die undokumentiere DBCC-Funktion &quot;checkprimaryfile&quot;. Damit kann man sich die wichtigsten Infos herausholen ohne die Datenbank vorher anh&#228;ngen zu m&#252;ssen. <\/p>\n<h2>Ist die Datei tats&#228;chlich eine MDF-Datei?<\/h2>\n<p><code>dbcc checkprimaryfile ('C:\\temp\\Test_data.mdf', 0)<\/code><br \/>\nMit der Option &quot;0&quot; &#252;berpr&#252;ft &quot;checkprimaryfile&quot;, ob die Datei eine MDF-Datei ist: &quot;0&quot; hei&#223;t &quot;Nein&quot;, &quot;1&quot; hei&#223;t &quot;ja&quot;. Beispiel:<\/p>\n<table class=\"sqltable\">\n<tr>\n<th>IsMDF<\/th>\n<\/tr>\n<tr>\n<td>1<\/td>\n<\/tr>\n<\/table>\n<h2>Welche Version hat die Datenbank?<\/h2>\n<p><code>dbcc checkprimaryfile ('C:\\temp\\Test_data.mdf', 2)<\/code><br \/>\nMit der Option &quot;2&quot;  ermittelt &quot;checkprimaryfile&quot; die Version, den Namen und die Default-Collation der Datenbank:<\/p>\n<table class=\"sqltable\">\n<tr>\n<th>property<\/th>\n<th>value<\/th>\n<\/tr>\n<tr>\n<td>Database name<\/td>\n<td>Test<\/td>\n<\/tr>\n<tr>\n<td>Database version<\/td>\n<td>655<\/td>\n<\/tr>\n<tr>\n<td>Collation<\/td>\n<td>53256<\/td>\n<\/tr>\n<\/table>\n<p>Das ist deswegen relevant, weil man an einen SQL-Server-2005 keine 2008er Datenbank anh&#228;ngen kann. Umgekehrt zwar schon, aber dann ist das fortan eine 2008er Datenbank. Die Versionen sind folgende:<\/p>\n<table class=\"sqltable\">\n<tr>\n<th>SQL Server Version<\/th>\n<th>Datenbankversion<\/th>\n<\/tr>\n<tr>\n<td>SQL Server 2000<\/td>\n<td>539<\/td>\n<\/tr>\n<tr>\n<td>SQL Server 2005<\/td>\n<td>611<\/td>\n<\/tr>\n<tr>\n<td>SQL Server 2008<\/td>\n<td>655<\/td>\n<\/tr>\n<\/table>\n<h2>Aus welchen Dateien besteht die Datenbank?<\/h2>\n<p><code>dbcc checkprimaryfile ('C:\\temp\\Test_data.mdf', 3)<\/code><br \/>\nMit der Option &quot;3&quot;  ermittelt &quot;checkprimaryfile&quot; die Liste der Datenbank-Dateien und gibt an, wo die Dateien zuletzt lagen als sie noch angeh&#228;ngt waren:<\/p>\n<table class=\"sqltable\">\n<tr>\n<th>status<\/th>\n<th>fileid<\/th>\n<th>name<\/th>\n<th>filename<\/th>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>1<\/td>\n<td>Test_data<\/td>\n<td>C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\Test_data.mdf<\/td>\n<\/tr>\n<tr>\n<td>1048642<\/td>\n<td>2<\/td>\n<td>Test_log<\/td>\n<td>C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\Test_log.ldf<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>3<\/td>\n<td>Test_data2<\/td>\n<td>C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\Test_data2.ndf<\/td>\n<\/tr>\n<\/table>\n<p>Im Beispiel sieht man, dass die Datenbank-Dateien zuletzt im Verzeichnis &quot;C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\&quot; lagen. Jetzt stehen sie im Verzeichnis &quot;C:\\temp&quot;. Daher muss man die Dateien zum Anh&#228;ngen entweder wieder an den Ursprungsort verschieben oder beim Anh&#228;ngen die neuen Pfade aller Dateien angeben.<\/p>\n<h2>Details zu den Datenbank-Dateien<\/h2>\n<p><code>dbcc checkprimaryfile ('C:\\temp\\Test_data.mdf', 1)<\/code><br \/>\nMit der Option &quot;1&quot; wird die Datenbank wird kurzzeitig angeh&#228;ngt, Details zu den Dateien analysiert und dann wieder getrennt. Das geht freilich nur, wenn die Log und Secobdary-Files unter dem Pfad ansprechbar sind unter dem sie in der MDF-Datei stehen.<\/p>\n<table class=\"sqltable\">\n<tr>\n<th>fileid<\/th>\n<th>groupid<\/th>\n<th>size<\/th>\n<th>maxsize<\/th>\n<th>growth<\/th>\n<th>status<\/th>\n<th>perf<\/th>\n<th>name<\/th>\n<th>filename<\/th>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>1<\/td>\n<td>384<\/td>\n<td>-1<\/td>\n<td>128<\/td>\n<td>2<\/td>\n<td>0<\/td>\n<td>Test_data<\/td>\n<td>C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\Test_data.mdf<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>0<\/td>\n<td>128<\/td>\n<td>268435456<\/td>\n<td>10<\/td>\n<td>1048642<\/td>\n<td>0<\/td>\n<td>Test_log<\/td>\n<td>C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\Test_log.ldf<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>1<\/td>\n<td>384<\/td>\n<td>-1<\/td>\n<td>128<\/td>\n<td>2<\/td>\n<td>0<\/td>\n<td>Test_data2<\/td>\n<td>C:\\Programme\\Microsoft SQL Server\\MSSQL10.SQL2008SE\\MSSQL\\DATA\\Test_data2.ndf<\/td>\n<\/tr>\n<\/table>\n<p>Dazu kann man die Datenbank auch gleich selber anh&#228;ngen und dann angeh&#228;ngt lassen.<\/p>\n<h2>Risiken und Nebenwirkungen<\/h2>\n<p>Diese DBCC-Funktion ist undokumentiert und daher in zuk&#252;nftigen Versionen m&#246;glicherweise nicht mehr lauff&#228;hig oder bringt andere Ausgaben. Ich fand leider nirgends Angaben zu der Funktion. Daher fand ich obige Angaben durch Ausprobieren raus. Sie k&#246;nnen daher falsch sein. Interessanterweise klappten die Optionen 0,2,3 auch wenn ich an einem SQL-Server-2005 eine 2008er Datenbank analysierte. Die Option 1 nicht, weil da die Datenbank angeh&#228;ngt werden soll.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man eine Datenbank mittels des &quot;SQL Server Management Studios&quot; anh&#228;ngt, dann bekommt man bereits vor dem eigentlichen Anh&#228;ngen an der Oberfl&#228;che angezeigt, aus wie vielen Dateien die Datenbank besteht und wo die Dateien zuletzt lagen. Nun gibt es aber Anwendungen, die f&#252;r Endanwender gedacht ist, die mit der Bedienung des Management-Studios durchaus &#252;berfordert sein [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16],"tags":[463,464,465,462],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/2548"}],"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=2548"}],"version-history":[{"count":19,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/2548\/revisions"}],"predecessor-version":[{"id":3452,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/2548\/revisions\/3452"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=2548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=2548"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=2548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}