pg_restore dauert viel länger als pg_dump

9

Ich speichere regelmäßig eine kleinere PostgreSQL-Datenbank, die zum Testen verwendet wird, und stelle sie später wieder her. Die Daten werden regelmäßig als Ergebnis von Tests aktualisiert, dann muss ein neuer Speicherauszug erstellt werden, und die Speicherauszüge werden regelmäßig verwendet, um die Datenbank in einem genau definierten Zustand neu zu erstellen.

Ich habe festgestellt, dass der Speicherauszug (using pg_dump -Fc database) nur einige Sekunden dauert, die Wiederherstellung ( pg_restore -d database) jedoch ungefähr eine Minute. Das scheint komisch. Ich hätte erwartet, dass beide ungefähr dieselbe Zeit in Anspruch nehmen (vorausgesetzt, beide Aufgaben sind E / A-gebunden).

Gibt es ein Problem mit der Wiederherstellung? Könnte ich es vielleicht schneller machen? Oder dauert die Wiederherstellung normalerweise viel länger als der Speicherauszug? (Und wenn ja, warum dann?)

Die Dump-Datei hat normalerweise ungefähr 3-4 MiB; Das DBMS ist PostgreSQL V8.4 und läuft auf einem Pentium4 3 GHz mit 1 GB RAM unter Ubuntu Linux.

sleske
quelle

Antworten:

9

Der Inhalt eines Index ist nicht Teil der Sicherung, sondern nur die Definition des Index. Und das dauert nur ein paar Bytes. Wenn der Index während der Wiederherstellung erstellt und alle Daten indiziert werden, ist er viel größer. Dies wird einige Zeit dauern, hängt jedoch von Ihrer Situation ab, wie viel Zeit Sie benötigen.

pg_restore bietet eine Option für die gleichzeitige Wiederherstellung (ab Version 8.4)--jobs=number-of-jobs

Frank Heikens
quelle
Interessant, danke. Gibt es eine Möglichkeit, den Index auch zu sichern, um die Wiederherstellung zu beschleunigen (auf Kosten einer größeren Speicherauszugsdatei)?
Sleske
Nein, der Inhalt des Index kann nicht Teil der Sicherung sein. Für eine sehr kleine Datenbank wie Ihre (3-4 MiB) sollte dies sowieso kein Problem sein.
Frank Heikens
Zusätzliche Informationen: pg_dump hat keinen Zugriff auf den Inhalt eines Index. pg_dump verwendet SELECT-Anweisungen, um den gesamten Inhalt der Tabellen und den Inhalt der Systemtabellen zum Erstellen der Sicherung abzurufen. Es ist "nur" ein Wrapper um einige SELECT-Anweisungen und einige Funktionen, um die Ergebnisse auf die Festplatte zu schreiben.
Frank Heikens
@ Frank: Danke. Ich wusste nichts über die Implementierung von pg_dump. In unserem Fall wäre es hilfreich, die Wiederherstellung zu beschleunigen, da sie im Rahmen automatisierter Tests wiederholt ausgeführt werden muss. Daher wäre es hilfreich, sie von 1 Minute auf 10 Sekunden zu reduzieren. Aber anscheinend ist das nicht machbar. Ich muss eine andere Lösung finden ...
Sleske
2
@sleske könnten Sie mit dem Dateisystem-Backup-Ansatz versuchen . Dies sollte die Indizes erhalten und außerdem wahrscheinlich sowohl für die Sicherung als auch für die Wiederherstellung etwas schneller ausgeführt werden
Stefano,
4

Für eine Wiederherstellung muss die Datenbank viel zusätzliche Arbeit leisten:

Einige Dinge fallen mir sofort ein:

  • Schreiben ist langsamer als Lesen
  • Das Parsen der Eingabe braucht Zeit
  • Aktualisieren von Indizes und anderen internen Strukturen
  • Aufrechterhaltung der referenziellen Integrität

Ich bin mir jedoch nicht sicher, ob dies dieser Zeitunterschied entspricht.

Sven
quelle