PostgreSQL: Verbesserung der Leistung von pg_dump und pg_restore


80

Als ich anfing, habe ich pg_dumpdas Standardformat verwendet. Ich war nicht erleuchtet.

Nachforschungen haben mir Zeit- und Dateigrößenverbesserungen mit ergeben pg_dump -Fc | gzip -9 -c > dumpfile.gz. Ich wurde erleuchtet.

Wenn es an der Zeit war, die Datenbank neu zu erstellen,

# create tablespace dbname location '/SAN/dbname';
# create database dbname tablespace dbname;
# alter database dbname set temp_tablespaces = dbname;

% gunzip dumpfile.gz              # to evaluate restore time without a piped uncompression
% pg_restore -d dbname dumpfile   # into a new, empty database defined above

Ich fühlte mich nicht aufgeklärt: Die Wiederherstellung dauerte 12 Stunden, um die Datenbank zu erstellen, die nur einen Bruchteil dessen darstellt, was daraus werden wird:

# select pg_size_pretty(pg_database_size('dbname'));
47 GB

Da es Vorhersagen gibt, dass diese Datenbank einige Terabyte groß sein wird, muss ich mich jetzt mit der Verbesserung der Leistung befassen.

Bitte erleuchte mich.

Antworten:


58

Überprüfen Sie zunächst, ob Sie von Ihrem Festplatten-Setup eine angemessene E / A-Leistung erhalten. Überprüfen Sie anschließend, ob Ihre PostgreSQL-Installation ordnungsgemäß optimiert ist. Insbesondere shared_bufferssollte richtig eingestellt sein, maintenance_work_memsollte während der Wiederherstellung erhöht werden, sollte während der Wiederherstellung ausgeschaltet sein, full_page_writessollte während der Wiederherstellung wal_buffersauf 16 MB erhöht werden, sollte während der Wiederherstellung checkpoint_segmentsauf etwa 16 MB erhöht werden, sollten Sie keine unangemessene Anmeldung haben (wie das Protokollieren jeder ausgeführten Anweisung), auto_vacuumsollte während der Wiederherstellung deaktiviert werden.

Wenn Sie unter 8.4 auch mit paralleler Wiederherstellung experimentieren, verwenden Sie die Option --jobs für pg_restore.


Wenn Sie einen Slave angeschlossen haben und die Belastung des Masters bereits beträchtlich ist, möchten Sie möglicherweise stattdessen nur die Sicherung des Slaves durchführen. Zumal der Slave schreibgeschützt ist, kann ich mir vorstellen, dass dies auch bis zu einem gewissen Grad helfen kann. In einem großen Cluster kann es hilfreich sein, einen oder mehrere Slaves für gestaffelte Backups zu haben, wenn die Backups lange dauern. Damit Sie nichts verpassen, möchten Sie, dass diese Standby-Geräte über eine Streaming-Replikation verbunden sind, damit sie vom WAL auf dem Master beschrieben werden.
StartupGuy

13
shared_buffers should be set correctlywas soll das heißen
Juan Carlos Oropeza

1
@JuanCarlosOropeza - Ich bin auf das folgende Dokument gestoßen shared_buffers, das hilfreich sein könnte.
Darragh Enright

25

Verbessern Sie pg dump & restore

PG_DUMP | Verwenden Sie immer das Formatverzeichnis und die -jOptionen

time pg_dump -j 8 -Fd -f /tmp/newout.dir fsdcm_external

PG_RESTORE | Verwenden Sie immer die Optimierung für postgres.conf und das Formatverzeichnis und die -jOptionen

work_mem = 32MB
shared_buffers = 4GB
maintenance_work_mem = 2GB
full_page_writes = off
autovacuum = off
wal_buffers = -1

time pg_restore -j 8 --format=d -C -d postgres /tmp/newout.dir/

1
Die hier verwendeten Konfigurationsparameter verbesserten die Leistung erheblich
Ramnar

3
Die Verbindung ist unterbrochen
Hamed

Beeindruckend! Das hat mir sehr geholfen! Vielen Dank!
stasdeep

14

Zwei Themen / Ideen:

  1. Durch Angabe von -Fc wird die Ausgabe von pg_dump bereits komprimiert. Die Komprimierung ist nicht maximal, daher können Sie durch die Verwendung von "gzip -9" einige Platzersparnisse erzielen. Ich würde jedoch wetten, dass dies nicht ausreicht, um die zusätzliche Zeit (und E / A) für das Komprimieren und Dekomprimieren der -Fc-Version des Backups zu gewährleisten .

  2. Wenn Sie PostgreSQL 8.4.x verwenden, können Sie die Wiederherstellung aus einer -Fc-Sicherung möglicherweise mit der neuen Befehlszeilenoption "-j n" von pg_restore beschleunigen, wobei n = Anzahl der für die Wiederherstellung zu verwendenden parallelen Verbindungen ist. Dadurch kann pg_restore mehr als die Daten einer Tabelle laden oder mehr als einen Index gleichzeitig generieren.


Wir sind derzeit bei 8,3; neuer Grund für ein Upgrade.
Joe Creighton

Sie können die 8.4-Version von pg_restore mit einer 8.3-Version des Servers verwenden. Stellen Sie einfach sicher, dass Sie pg_dump ab 8.3 verwenden.
Magnus Hagander

Bah. Wir stecken bei 8.3 fest, weil wir die Solaris10-Paketinstallation von Postgres verwenden und "derzeit ist nicht geplant, PG8.4 in S10 zu integrieren". [Ref. mail-archive.com/pgsql-general@postgresql.org/msg136829.html] Ich müsste die Installation und Wartung der Open-Source-Postgres übernehmen. Unsicher, ob wir das hier schaffen können ... Feh.
Joe Creighton

10

Ich gehe davon aus, dass Sie ein Backup benötigen, kein größeres Upgrade der Datenbank.

Für die Sicherung großer Datenbanken sollten Sie stattdessen eine kontinuierliche Archivierung einrichten pg_dump.

  1. Richten Sie die WAL-Archivierung ein .


  2. psql template1 -c "select pg_start_backup('Erstellen Sie Ihre Basissicherungen beispielsweise jeden Tag mit `date +% F-% T`` ')" rsync -a --delete / var / lib / pgsql / data / / var / backups / pgsql / base / psql template1 - c "wähle pg_stop_backup ()" `

Eine Wiederherstellung ist so einfach wie das Wiederherstellen von Datenbank- und WAL-Protokollen, die nicht älter als die pg_start_backupZeit vom Sicherungsspeicherort sind, und das Starten von Postgres. Und es wird viel schneller sein.


1
Wir haben uns PITR (WAL-Archivierung) nicht angesehen, da das System nicht sehr transaktionsintensiv ist, sondern stattdessen viele historische Aufzeichnungen aufbewahrt. Jetzt, wo ich darüber nachdenke, kann eine "inkrementellere" Sicherung hilfreich sein. Ich werde nachforschen. Vielen Dank.
Joe Creighton

7
zcat dumpfile.gz | pg_restore -d db_name

Entfernt das vollständige Schreiben der nicht komprimierten Daten auf die Festplatte, was derzeit Ihr Engpass ist.


3

Wie Sie vielleicht einfach aufgrund der Tatsache erraten haben, dass das Komprimieren des Backups zu einer schnelleren Leistung führt, ist Ihr Backup an die E / A gebunden. Dies sollte nicht überraschen, da Backups so gut wie immer an E / A gebunden sind. Durch das Komprimieren der Daten wird die E / A-Last gegen die CPU-Last ausgetauscht. Da die meisten CPUs während der Monsterdatenübertragung im Leerlauf sind, wird die Komprimierung als Nettogewinn gewertet.

Um die Sicherungs- / Wiederherstellungszeiten zu verkürzen, benötigen Sie schnellere E / A. Abgesehen davon, dass die Datenbank so umstrukturiert wird, dass sie keine einzige Instanz ist, können Sie so ziemlich alles tun.


Wenn Sie nur die pg_dump-Zeit mit parallelem Dump ab Version 9.3 optimieren, kann eine Komprimierung> 0 sehr schaden! Dies liegt daran, dass pg_dump- und Postmaster-Prozesse die CPU bereits so stark belasten, dass durch Hinzufügen von Komprimierung> = 1 die Gesamtaufgabe erheblich CPU-gebunden statt E / A-gebunden wird. Grundsätzlich ist die ältere Annahme, dass die CPUs ohne Komprimierung im Leerlauf sind, beim parallelen Speicherauszug ungültig.
Acumenus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.