Erstellt das Wiederherstellen einer SQL-Datenbank aus dem Backup ihre Indizes neu?

10

Erstellt das Wiederherstellen einer SQL-Datenbank aus einer Sicherung ihre Tabellen und Indizes von Grund auf neu? Oder wird es in derselben internen physischen Reihenfolge gehalten, in der es sich zum Zeitpunkt der Sicherung befand?

Wir verwenden SQL 2000 mit komprimiertem Quest Lightspeed-Backup, wenn dies einen Unterschied macht.

BradC
quelle

Antworten:

16

Die Antwort lautet Nein, unabhängig davon, welche Sicherungssoftware verwendet wird.

Eine Sicherung ist eine physische Operation, keine logische Operation. Es liest alle Bereiche, die zugewiesene Seiten enthalten (dh obwohl nur eine einzige Seite von einem 8-Seiten-Bereich zugewiesen ist, wird der gesamte 64-KB-Bereich gesichert), und dies in physischer Reihenfolge.

Eine Wiederherstellung ist eine physische Operation, keine logische Operation. Es legt die Ausmaße an ihren rechtmäßigen Stellen in den Datendateien fest.

Das Neuerstellen eines Index (oder eines ähnlichen Index) ist eine logische Operation, die protokolliert werden muss. Durch Sichern und Wiederherstellen werden die Datendateien direkt bearbeitet, ohne den Pufferpool zu durchlaufen. Dies ist ein Grund, warum dies nicht möglich ist. Ein weiterer Grund, warum dies nicht möglich ist, besteht darin, dass beim Sichern und Wiederherstellen nicht verstanden wird, was in den zu sichernden Daten enthalten ist.

Der Hauptgrund dafür ist jedoch, dass das Verschieben von Seiten während eines Wiederherstellungsvorgangs die B-Tree-Zeiger beschädigen würde. Wenn Seite A auf Seite B zeigt, Seite A jedoch durch den Wiederherstellungsprozess verschoben wird, wie wird Seite B aktualisiert, um auf Seite A zu verweisen? Wenn es sofort aktualisiert wird, wird es möglicherweise vom Rest des Wiederherstellungsprozesses überschrieben. Was ist, wenn der Wiederherstellungsprozess ein Transaktionsprotokoll wiederhergestellt hat, das Seite A oder Seite B entfernt hat? Das geht einfach nicht.

Fazit: Backup und Restore sind physische Vorgänge, die die Daten niemals ändern.

Hoffe das hilft!

PS Obwohl diese Frage nicht direkt behandelt wird, lesen Sie den Artikel, den ich für das TechNet-Magazin im Juli geschrieben habe, in dem erläutert wird, wie die verschiedenen Sicherungen intern funktionieren: Grundlegendes zu SQL Server-Sicherungen . Das September-Magazin wird das nächste in der Reihe zum Verständnis von Wiederherstellungen haben.

Paul Randal
quelle
2
Ich finde es toll, dass Sie erklärt haben, dass die Indizierung eine logische Operation ist.
Jim B
Ah, das macht Sinn. Backup erfasst 64.000 physische Speicherbereiche, nicht 8.000 Datenseiten.
BradC
Das ist Unsinn. Sicherungsvorgänge komprimieren häufig die Daten, die sie sichern, und das ist die Art von "Änderung", von der wir sprechen: Schließlich können die Indizes aus den Tabellen neu erstellt werden, es handelt sich um redundante Daten (vorausgesetzt, das Schema wird gesichert , Na sicher). Der wahre Grund ist die Faulheit der Datenbankentwickler.
John
1
@ John Was sagst du ist Unsinn? Die Komprimierung wird hier nirgendwo erwähnt - nur das Neuerstellen der Indizes, was in keiner Weise mit der Komprimierung identisch ist (wodurch die Seiten oder ihr Speicherort in der Datenbank während einer Wiederherstellung nicht geändert werden, während dies bei einer Neuerstellung der Fall ist). Das Neuerstellen von Indizes von Grund auf während einer Wiederherstellung wäre unglaublich langsam, verglichen mit dem Wiederherstellen von Indizes aus der Sicherung. Ich denke, Sie verstehen hier etwas falsch.
Paul Randal
Das Löschen und Neuerstellen von Indizes ist eine Art der Komprimierung, und die Komprimierung kann je nach Art der Komprimierung alles ändern. Eine verlustbehaftete Komprimierung in der Bildverarbeitung wird immer noch als Komprimierung bezeichnet. Jeder Mechanismus, der bestimmte Informationen auf kleinerem Raum darstellt, ist eine Form der Komprimierung, und das Löschen von Indizes ist ein triviales Beispiel dafür. Die langsame Wiederherstellungszeit kann jedoch in der Tat ein echtes Argument sein, zumindest gegen die Implementierung, die sich lohnt.
John
6

Eine native SQL-Sicherung ist nur ein seitenweiser Speicherauszug der Sicherungsdateien, daher lautet die Antwort dort "Nein". Bei einer Quest-Sicherung mit Lichtgeschwindigkeit wird wahrscheinlich eine Art Komprimierungskomprimierungsalgorithmus verwendet, die Datendateien oder Indizes werden jedoch nicht "neu erstellt", was in einer großen Datenbank enorm viel Zeit in Anspruch nehmen würde.

Aaron Alton
quelle
Ja, aber es muss trotzdem jede Seite auf die Festplatte schreiben. Warum nicht in logischer Reihenfolge statt in fragmentierter Reihenfolge schreiben? (Vielleicht ist dies eher eine Sicherungsfrage als eine Wiederherstellungsfrage :
Schreibt
Angenommen, es gibt ein Produkt, das die Daten in Indexreihenfolge ausgeschrieben hat. In welcher Reihenfolge soll die Tabelle gespeichert werden? Nehmen wir an, ich habe eine Tabelle mit 3 Spalten product_id, productname und price. In welcher Spalte können Sie sortieren, um die Seiten in der indizierten Reihenfolge zu speichern? Übrigens hindert Sie nichts daran, die gesamte Tabelle (ein Clustered-Index) oder jede der Zeilen (Composite-Index) zu indizieren.
Jim B
@ Jim B: Das ist einfach. Tabellen werden in gruppierter Indexreihenfolge gespeichert. Nicht gruppierte Indizes werden in Schlüsselreihenfolge gespeichert. Haufen würden in der ursprünglichen (nicht sortierten) Reihenfolge aufbewahrt. (Aaron und Paul haben gültige Gründe genannt, warum das Sichern / Wiederherstellen dies nicht tut. Die "bevorzugte Reihenfolge" nicht herauszufinden, ist keiner dieser Gründe. Andernfalls hätte eine vollständige Indexwiederherstellung das gleiche Problem. )
BradC
Die Daten werden in genau derselben physischen Seitenreihenfolge gesichert, in der sie in den Datenbankdateien gespeichert sind. Wenn die Daten wiederhergestellt werden, werden sie in derselben Seitenreihenfolge wiederhergestellt, in der sie gesichert wurden. SQL verschiebt Daten aus verschiedenen Gründen nicht. Einschließlich der Probleme bei Transaktionen, bei denen Protokolle wiederhergestellt werden, und bei Problemen mit der Seitenverkettung, ganz zu schweigen von der enormen zusätzlichen Zeit, die zum Mischen der Daten in Multi-TB-Datenbanken erforderlich ist.
Mrdenny
2

Das Backup wird regelmäßig und sehr oft durchgeführt (hoffe ich). Deshalb haben die Designer dafür gesorgt, dass die Sicherung so schnell wie möglich erfolgt. Was ist die schnellste E / A? Sequentiell. Wenn Sie Blöcke von Datenträgern in exakter physischer Reihenfolge lesen, haben Sie die beste Leistung.

Warum um alles in der Welt sollte die Datenbank jede Nacht umständliche zufällige E / A-Operationen durchführen und die Köpfe der Festplatten überall wegwerfen? Der Unterschied würde bei zwei Größenordnungen liegen. Darin liegt kein möglicher Gewinn.

kubanczyk
quelle
Ich stimme Ihrem allgemeinen Standpunkt zu, aber abhängig von der zugrunde liegenden Speicherkonfiguration sind zufällige E / A möglicherweise nicht um Größenordnungen schlechter als sequentielle E / A (ein SAN-Laufwerk, das beispielsweise über Dutzende von Spindeln verteilt ist). Wenn die Datendatei auf der Festplatte fragmentiert ist, ist selbst "sequentielle" E / A überhaupt nicht wirklich sequentiell. Aber Pauls Punkte überschreiben dies trotzdem (das Problem beim Aktualisieren von Zeigern und die Defragmentierung sollte eine protokollierte Operation sein)
BradC
0

Hmmm. BradC, haben Sie schon einmal mit Firebird / Interbase gearbeitet - wo das Hauptdienstprogramm / die API zum Sichern / Wiederherstellen der "Datenbank kopieren ..." des SSMS / EM ähnlicher ist? Wenn ja, wissen Sie, dass MS SQL Server NICHT so ist.

Eine SQLServer-Sicherung ist eher ein Datenbankspeicherauszug, der "wie besehen" wiederhergestellt wird. Es handelt sich also eher um eine komfortable Online-Verknüpfung für eine Operation "Trennen, Kopieren und erneutes Anhängen an einem anderen Ort". Die wiederhergestellte Datenbank ist fast eine exakte Kopie der ursprünglichen Datenbankdatei (fast, weil Sie die Platzierung der Datenbankdateien einer wiederhergestellten Datenbank ändern können) ...

Fabricio Araujo
quelle