pg_restoreはpg_dumpよりもはるかに時間がかかります


9

私は定期的に、テストに使用される小さなPostgreSQLデータベースを保存して後で復元しています。テストの結果、そのデータは定期的に更新されます。その後、新しいダンプを作成する必要があります。ダンプは、明確に定義された状態でデータベースを再作成するために定期的に使用されます。

ダンプ(を使用pg_dump -Fc database)には数秒しかかかりませんが、復元(pg_restore -d database)には約1分かかります。これは奇妙なようです。両方にほぼ同じ時間がかかると予想していました(両方のタスクがI / Oバウンドであると仮定した場合)。

復元に問題がありますか?もっと速くできますか?あるいは、ダンプよりもリストアに時間がかかるのは正常ですか?(もしそうなら、なぜですか?)

ダンプファイルには通常約3〜4 MiBがあります。DBMSはPostgreSQL V8.4であり、Ubuntu Linuxの下で1GiB RAMを搭載したPentium4 3GHzで実行されます。

回答:


9

インデックスの内容はバックアップの一部ではなく、インデックスの定義のみです。そして、それは数バイトしかかかりません。インデックスが復元中に作成され、すべてのデータにインデックスが付けられると、それははるかに大きくなります。これには時間がかかりますが、状況によって異なります。

pg_restoreには同時復元のオプションがあります(バージョン8.4以降)。--jobs=number-of-jobs


興味深い、ありがとう。インデックスをダンプして、リストアを高速化する方法はありますか(大きなダンプファイルを犠牲にして)?
sleske

いいえ、インデックスのコンテンツをバックアップの一部にすることはできません。あなたのような非常に小さなデータベース(3-4 MiB)の場合は、とにかく問題にはなりません。
フランク・ヘイケンズ

追加情報:pg_dumpはインデックスのコンテンツにアクセスできません。pg_dumpはSELECTステートメントを使用して、テーブルのすべてのコンテンツとシステムテーブルのコンテンツを取得し、バックアップを作成します。これは、一部のSELECTステートメントと結果をディスクに書き込むためのいくつかの関数の「単なる」ラッパーです。
フランク・ハイケンズ

@フランク:ありがとう。pg_dumpの実装について知りませんでした。私たちのケースでは、自動テストの一部として繰り返し実行する必要があるため、復元を高速化すると役立ちます。そのため、1分から10秒に下げておくと効果的です。しかし、明らかにそれは現実的ではありません。別の解決策を見つける必要があります...
sleske

2
@sleskeあなたはファイルシステムのバックアップアプローチで試すかもしれません。これにより、インデックスが保持され、さらにバックアップと復元の両方で少し高速に実行されるはずです
Stefano

4

復元の場合、データベースは多くの追加作業を行う必要があります。

すぐに頭に浮かぶことがいくつかあります。

  • 書き込みは読み取りより遅い
  • 入力の解析には時間がかかります
  • インデックスおよびその他の内部構造の更新
  • 参照整合性の維持

ただし、これがその時間差に相当するかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.