Ist es möglich, sql-server bak wiederherzustellen und gleichzeitig das Protokoll zu verkleinern?

26

Wir haben eine BAK-Datei von einem Kunden, die wir zur Problemermittlung an unsere Entwicklerbüros weitergeleitet haben. Das Backup hat derzeit 25 GB und die wiederhergestellte Datenbank hat ungefähr die gleiche Größe, benötigt jedoch 100 GB, um wiederhergestellt zu werden. Ich glaube, das liegt daran, dass die Datenbank so eingerichtet ist, dass sie eine Transaktionsprotokollgröße von 75 GB hat. Nach der Wiederherstellung der Datenbank können wir die Protokolldatei verkleinern. Gibt es eine Möglichkeit, dies bei der Wiederherstellung zu tun?

Adam Butler
quelle
3
Mir ist bekannt, dass Sie die Datenbank erst ändern können, wenn die Wiederherstellung abgeschlossen ist.
Shawn Melton
3
Ich war in der gleichen Situation und freue mich auf die Antwort. Nur um es zu kommentieren, es gibt ein Produkt: die virtuelle SQL-Wiederherstellung von red-gate. Ich habe dies nie verwendet, aber laut der Website: "Die gemountete Datenbank erfordert fast null zusätzlichen Speicherplatz über die Sicherungsdatei".
StanleyJohns

Antworten:

16

Es gibt keine Möglichkeit, das Backup als Teil des Wiederherstellungsprozesses zu verkleinern. Die wiederhergestellte Datenbank muss genau wie die Quelldatenbank aussehen, mit der einzigen Ausnahme, dass Sie die Laufwerksbuchstaben und Ordner ändern können.

mrdenny
quelle
34

Es gibt einen Hack, den Sie niemals in einer Live-Umgebung ausführen sollten, wenn der Speicherplatz begrenzt ist, indem Sie die Protokolldatei in einem komprimierten Ordner wiederherstellen. Wenn Sie dies versuchen, indem Sie einen vorhandenen Ordner komprimieren und wiederherstellen, wird dies zu einem Fehler führen, sodass Sie mit einem symbolischen Link cheaten müssen.

  1. Erstellen Sie einen komprimierten Ordner D:\LogCompressed\
  2. Erstellen Sie eine symbolische Verknüpfung zum komprimierten Ordner mklink /D /J D:\Log\ D:\LogCompressed\

  3. Stellen Sie Ihre Datenbank mit der ldf-Datei wieder her, die auf zeigt D:\Log\

  4. Verkleinern Sie die Protokolldatei auf eine geeignete Größe

  5. Trennen Sie die Datenbank, verschieben Sie die Protokolldatei in einen nicht komprimierten Ordner und hängen Sie sie an

Es ist schmutzig, es betrügt, macht es nie live , aber es funktioniert. Ein schneller Test einer neu erstellten Datenbank mit einer 32-MB-Protokolldatei zeigt, dass sie beim Komprimieren 330 KB auf der Festplatte belegt, den Ordner dekomprimiert und auf der Festplatte wieder 32 MB groß ist.

Mark Storey-Smith
quelle
2
@Mark: Dieser Hack funktioniert, ist aber nicht perfekt. Selbst wenn die Protokolldatei viel weniger Speicherplatz beansprucht als die tatsächliche Größe, können Sie die Datenbank nur wiederherstellen, wenn auf dem Datenträger tatsächlich so viel freier Speicherplatz vorhanden ist wie in der tatsächlichen Größe der Datenbank. Während der Wiederherstellung verringert sich die tatsächliche Größe der Protokolldatei langsam von der tatsächlichen Größe, was schmerzhaft ist. Es ist jedoch immer noch ein sehr guter Hack. Vielen Dank.
Chenwq
9

Ich glaube, dass der Grund, warum Ihr Backup 25 GB beträgt und die wiederhergestellte Datenbank 100 GB beträgt, nicht in Ihrem Transaktionsprotokoll liegt. Ich vermute, Ihre Datenbankdateien haben 100 GB zugewiesenen Speicherplatz und es befinden sich 25 GB tatsächliche Daten in der Datenbank.

Es gibt einen Unterschied zwischen dem zugewiesenen Datenbankdateibereich und dem genutzten Datenbereich . In diesem Fall beträgt die erstere 100 GB und die letztere 25 GB.

Thomas Stringer
quelle
1
Der Client weist seinem Transaktionsprotokoll 75 GB zu. Nach der Wiederherstellung ändere ich derzeit die Protokollzuordnung auf 1 GB. Wenn möglich, möchte ich diese Datenbank auf einem Server wiederherstellen, auf dem Laufwerke weniger als 100 GB freien Speicherplatz haben. Kürzen, sichern und erneut wiederherstellen, ohne auf einem anderen Server wiederherstellen zu müssen.
Adam Butler
@Adam Butler, ist es möglich, vorübergehend auf dem ersten Server wiederherzustellen, um die Dateigröße zu verringern, dann eine Sicherungskopie der Kopie zu erstellen und diese auf dem Zielserver wiederherzustellen?
DForck42,