始めたとき、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
このデータベースは数テラバイトになると予測されているため、パフォーマンスの改善を検討する必要があります。
教えてください.
最初に、ディスクセットアップから適切なIOパフォーマンスを得ていることを確認します。次に、PostgreSQLインストールが適切に調整されていることを確認します。特にshared_buffers
は正しく設定する必要があります、maintenance_work_mem
は復元中に増やす必要があります、full_page_writes
は復元中はオフにする必要があり、wal_buffers
は復元中に16MBに増やす必要があります、checkpoint_segments
は、復元中に16のような値に増やす必要があります。不当なログオン(実行されたすべてのステートメントのログなど)をしないでください、auto_vacuum
は、復元中は無効にする必要があります。
8.4を使用している場合は、pg_restoreの--jobsオプションを使用して並列復元を試してください。
2つの問題/アイデア:
-Fcを指定すると、pg_dump出力はすでに圧縮されています。圧縮は最大ではないため、「gzip -9」を使用することでスペースを節約できますが、バックアップの-Fcバージョンの圧縮と圧縮解除に使用される余分な時間(およびI/O)を保証するには不十分です。 。
PostgreSQL 8.4.xを使用している場合、新しいpg_restoreコマンドラインオプション「-j n」を使用して、-Fcバックアップからの復元を高速化できます。n=復元に使用する並列接続の数。これにより、pg_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
データベースのメジャーアップグレードではなく、バックアップが必要だと思います。
大規模データベースのバックアップでは、pg_dump
の代わりに 連続アーカイブ を設定する必要があります。
を使用して、たとえば毎日ベースバックアップを作成します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を起動するのと同じくらい簡単です。そして、それははるかに高速になります。
zcat dumpfile.gz | pg_restore -d db_name
現在のボトルネックであるディスクへの非圧縮データの完全な書き込みを削除します。
バックアップを圧縮するとパフォーマンスが向上するという事実だけで推測しているかもしれませんが、バックアップはI/Oバウンドです。バックアップはほとんど常にI/Oバウンドになるため、これは驚くことではありません。データを圧縮すると、I/O負荷がCPU負荷と引き換えになります。また、ほとんどのCPUはモンスターのデータ転送中にアイドル状態になるため、圧縮は最終的な成果として現れます。
したがって、バックアップ/復元時間を短縮するには、より高速なI/Oが必要です。データベースを再編成して、1つの巨大な単一インスタンスにならないようにする以外に、できることはほとんどすべてです。