Die Datenbankgröße wurde nach dem Sichern unter PostgreSQL 8.3 und dem Wiederherstellen in PostgreSQL 9.4 reduziert

8

Ich habe eine pg_dumpJIRA-Datenbank erstellt, die ich auf einem PostgreSQL 8.3-Server gehostet habe. Größe der Datenbank nach vacuum fullwar 217132652(ca. 207 MB).

Dann habe ich diese JIRA-Datenbank auf einem PostgreSQL 9.4-Server mit dem folgenden Befehl wiederhergestellt:

$ psql -X -v ON_ERROR_STOP=1 -d jira2 -U jira -h localhost < jiradb2017_03_12.sql

Ich gehe davon aus, dass die Wiederherstellung bei jedem Fehler beendet wird, seit ich sie verwendet habe ON_ERROR_STOP=1, aber das SQL-Skript wurde korrekt beendet (trotz einiger Warnungen, die nicht mit der Datenwiederherstellung zusammenhängen).

Am Ende hatte ich eine Datenbank mit einer Größe von 158019348(ungefähr 151 MB).

Also, was ist die Geschichte hier? Kann ich einfach davon ausgehen, dass die Datenbank erfolgreich wiederhergestellt wurde und PostgreSQL die Speicher-Engine (irgendwo zwischen 8.3 und 9.4) optimiert hat und den Speicherplatz effizienter nutzt?

Pablo Santa Cruz
quelle
3
Pablo, haben Sie versucht, auf 8.3 wiederherzustellen und die Größe zu überprüfen? Das würde jeden Effekt der Version cahnge bestätigen oder beseitigen
Jack sagt, versuchen Sie topanswers.xyz

Antworten:

10

Wenn Sie eine Datenbank wiederherstellen, werden alle Informationen gepackt , ohne Leerzeichen zwischen den Zeilen (oder in Indizes), es sei denn, es sind bestimmte Einstellungen vorhanden (im Grunde: FILLFACTORfür Tabellen und FILLFACTORfür Indizes ).

Wenn Ihre Datenbank jedoch seit einiger Zeit verwendet wird und Sie Ihren Anteil an Einfügungen, Aktualisierungen und Löschungen hatten, wird freier, nicht verwendeter Speicherplatz angezeigt . Dies liegt an der Funktionsweise von PostgreSQL und Multiversion Concurrency Control, auch bekannt als MVCC . MVCC ermöglicht weniger Sperren, was im Grunde bedeutet, dass Sie Zeit sparen . Aber Sie zahlen einen Preis in Form von Raum :

  1. Jedes UPDATEentspricht einem INSERTzusammen mit einem DELETE, wobei der Overhead (zumindest in Bezug auf den verwendeten Platz) beiden zugeordnet ist.
  2. Wenn mehrere Transaktionen ausgeführt werden und jede ausgeführt INSERT, ausgeführt UPDATEoder ausgeführt wird DELETE, haben Sie gleichzeitig mehrere Kopien jeder beteiligten Zeile.
  3. Der diesen Zeilenversionen zugewiesene Speicherplatz wird nicht sofort nach dem Festschreiben freigegeben und für eine Weile nicht verwendeter Speicherplatz in den Dateien, in denen Ihre Tabellendaten (und Indizes) gespeichert sind.

Autovacuum sorgt dafür, dass dieser Raum standardmäßig wiederverwendbar wird, oder Sie haben ein spezielles Verfahren für das routinemäßige Staubsaugen .

Diese Tatsache kann bereits die Größenänderung erklären.

Wahrscheinlich fanden auch Optimierungen zwischen den Versionen statt. und kann weitere Verbesserungen erklären. Optimierungen könnten auch für die Geschwindigkeit und nicht für die Größe vorgenommen worden sein, und die tatsächliche Größe könnte tatsächlich von einer Version zur nächsten wachsen . Ich kenne die Einzelheiten wirklich nicht, um sie sagen zu können; Obwohl der Kommentar von @Erwin besagt, dass sowohl Änderungen, die Ihre Tabellen verkleinern, als auch Änderungen, die Ihre Tabellen aufblähen (wachsen), seit Version 8.3 vorgenommen wurden.

Um zwischen den beiden Effekten zu unterscheiden, können Sie, wenn Sie neugierig sind, einfach, wie @Jack Douglas vorschlägt, Ihre Datenbank auf 8.3 wiederherstellen. Es wird höchstwahrscheinlich kleiner. Wenn es auf weniger als 151 MB verkleinert wird (eine Größe, die kleiner ist als die Version 9.4), hat das Entfernen von nicht verwendetem Speicherplatz Ihre Datenbank verkleinert, und die Versionsänderung hat Ihre Datenbank tatsächlich wachsen lassen.


Schauen Sie sich zum besseren Verständnis von MVCC die Präsentation von Bruce Momjian an .

joanolo
quelle
1
Dies ist sehr auf den Punkt. Und ja, seit Postgres 8.3 haben sich sowohl die Größe der schrumpfenden als auch die aufgeblähten Grundtabelle geändert.
Erwin Brandstetter