web-dev-qa-db-ja.com

PostgreSQL:pg_dump、pg_restoreのパフォーマンスの改善

始めたとき、pg_dumpデフォルトのプレーン形式。私は無知でした。

調査により、pg_dump -Fc | gzip -9 -c > dumpfile.gz。私は悟りました。

データベースを新たに作成するときが来たとき、

# 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

私は無知だと感じました:復元がデータベースの作成に12時間かかりましたが、データベースはほんの一部に過ぎません:

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

このデータベースは数テラバイトになると予測されているため、パフォーマンスの改善を検討する必要があります。

教えてください.

68
Joe Creighton

最初に、ディスクセットアップから適切なIOパフォーマンスを得ていることを確認します。次に、PostgreSQLインストールが適切に調整されていることを確認します。特にshared_buffersは正しく設定する必要があります、maintenance_work_memは復元中に増やす必要があります、full_page_writesは復元中はオフにする必要があり、wal_buffersは復元中に16MBに増やす必要があります、checkpoint_segmentsは、復元中に16のような値に増やす必要があります。不当なログオン(実行されたすべてのステートメントのログなど)をしないでください、auto_vacuumは、復元中は無効にする必要があります。

8.4を使用している場合は、pg_restoreの--jobsオプションを使用して並列復元を試してください。

49
Ants Aasma

2つの問題/アイデア:

  1. -Fcを指定すると、pg_dump出力はすでに圧縮されています。圧縮は最大ではないため、「gzip -9」を使用することでスペースを節約できますが、バックアップの-Fcバージョンの圧縮と圧縮解除に使用される余分な時間(およびI/O)を保証するには不十分です。 。

  2. PostgreSQL 8.4.xを使用している場合、新しいpg_restoreコマンドラインオプション「-j n」を使用して、-Fcバックアップからの復元を高速化できます。n=復元に使用する並列接続の数。これにより、pg_restoreは複数のテーブルのデータをロードしたり、同時に複数のインデックスを生成したりできます。

14
Matthew Wood

Pg dump&restoreを改善する

PG_DUMP |常に-jオプションでフォーマットディレクトリを使用する

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

PG_RESTORE | -jオプションを使用して、フォーマットディレクトリでpostgres.confのチューニングを常に使用する

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/`

詳細については

https://github.com/YanarAssaf/PostgreSQL/wiki/Improve-pg-dump%7Crestore

12
Yanar Assaf

データベースのメジャーアップグレードではなく、バックアップが必要だと思います。

大規模データベースのバックアップでは、pg_dumpの代わりに 連続アーカイブ を設定する必要があります。

  1. WALアーカイブのセットアップ

  2. を使用して、たとえば毎日ベースバックアップを作成します
    psql template1 -c "select pg_start_backup('`date +%F-%T '' ') "rsync -a --delete/var/lib/pgsql/data// var/backups/pgsql/base/psql template1- c "pg_stop_backup()を選択" `

復元は、バックアップ場所からpg_start_backup時間より古いデータベースとWALログを復元し、Postgresを起動するのと同じくらい簡単です。そして、それははるかに高速になります。

9
Tometzky
zcat dumpfile.gz | pg_restore -d db_name

現在のボトルネックであるディスクへの非圧縮データの完全な書き込みを削除します。

7
richo

バックアップを圧縮するとパフォーマンスが向上するという事実だけで推測しているかもしれませんが、バックアップはI/Oバウンドです。バックアップはほとんど常にI/Oバウンドになるため、これは驚くことではありません。データを圧縮すると、I/O負荷がCPU負荷と引き換えになります。また、ほとんどのCPUはモンスターのデータ転送中にアイドル状態になるため、圧縮は最終的な成果として現れます。

したがって、バックアップ/復元時間を短縮するには、より高速なI/Oが必要です。データベースを再編成して、1つの巨大な単一インスタンスにならないようにする以外に、できることはほとんどすべてです。

3
Will Hartung