web-dev-qa-db-ja.com

PostgreSQLでデータベースのスナップショットをすばやく作成/復元することは可能ですか?

まず、私は開発者であり、DBAやsysadminではありません。優しくしてください:)

単一のユーザーアクションがデータベースで複雑な変更をトリガーするアプリケーションワークフローに取り組んでいます-一部のテーブルで数百のレコードを作成し、他のテーブルで数百のレコードを更新するなど。 )は、このアクションに影響を受けます。複雑なため、別のテストを実行する前にすべての変更を手動で元に戻すのは非常に困難です。ほとんどの開発期間中、ワークフローの終わり近くに "ROLLBACK"ステートメントを挿入するだけで済みますが、変更のコミットが近づいたら、本物をテストする必要があります。

使用する運用データベースのローカルコピーがあります。私の場合、テスト間のダ​​ンプと復元は、すべての変更を元に戻すスクリプトを書くよりも高速です。それはより高速ですが、それでも私はかなり遅くなっています(私の古いラップトップでの復元には約20分かかります)。データベースの現在の状態のスナップショットを保存して、すぐに復元する方法はありますか?

私はシステム上の唯一のユーザーであることが保証されており、rootアクセス権を持っています。 tar圧縮およびgzip圧縮された場合、データベースダンプは約100MBです。 PostgreSQLのバージョンは8.3です。

役立つアイデアをお寄せいただきありがとうございます。

54
Zilk

ファイルシステムレベルのスナップショットを使用することもできますが、多くの場合かなり面倒で、特別なファイルシステムが必要であり、特に古いラップトップでは常に利用できるとは限りません。 ;-)

では、データベースとして基本状態を作成してから、CREATE DATABASE ... TEMPLATE機能を使用して、テスト実行用にデータベースから新しいデータベースを作成します。テスト後、そのデータベースを破棄します。その場合、速度の制約は、基本的にはデータベースディレクトリをcp -Rする時間だけです。これは、ファイルシステムスナップショットの魔法がなくても実現できる速度とほぼ同じです。

36

Stellar を使用すると、データベースの場合はgitのようになります。

Stellarを使用すると、データベースをすばやく復元できます。データベースの移行の記述、ブランチの切り替え、SQLの使用。 PostgreSQLとMySQL(一部)がサポートされています。

12

データベースが Virtualbox で実行されている場合、スナップショットを簡単に保存し、データベースの状態とOS自体の両方のスナップショットを数秒(または実際にはデータベースまたはOS内の大量のデータ、または仮想マシンに割り当てられているメモリが非常に少ない)。

ほとんどの場合、ラップトップで使用できるリソースがほとんどないことを考えると、データベースがホストされている仮想マシンを実行するには、Windowsサーバーよりも軽量のLinuxをインストールするのが最適です。


本番サイトでは、 MediaTemple のスナップショットバックアップを使用して同じ結果を達成しています(ただし、バックアップスロットごとに20ドルで、そのWebホスティングサービスに固有なので、あなたに合わない場合があります)。

5
wildpeaks

おそらくあなたが望んでいる答えではありませんが、より低いレベルのスナップショット-たとえばLVMを検討しましたか?

同じことをしようとしたときにこの質問を見つけ、postgresqlデータディレクトリでgitを使用することになりました。変更の破棄は次のように簡単です。

git reset --hard
2
user92843

Stellargit reset --hardは興味深いソリューションであると言わざるを得ませんが、より大きなデータベースとテストで問題が発生し、Virtualboxなどのソリューションを使用します。ただし、より大きなテストでは、ベアメタルなどのソリューションを使用している場合、これらは少し「問題のある」ものになります。

したがって、@ Peter Eisentrautも言及した次の理由により、ZFSをこれらについて今後検討するファイルシステムとして言及する必要があります。

  1. スナップショット-特にProdからQA/DRへのレプリケーションを行う場合、テストと同じ「ファイルシステム」を使用できます。
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. テストを実行するには、テストの直前に上記のようにpostgresqlを停止し、zfs snapshot $SNAPSHOT postgresqlを開始してから、ロールバックしてpostgresqlを停止し、zfs rollback $SNAPSHOT

  2. 圧縮-Postgresqlは私のデータベースで典型的な3:1圧縮を取得するため、さらに多くのテストを実行できます;)

0
Hvisage

実験できるもう1つのオプションは、実際にpostgresqlデータディレクトリのコピーを保存し、それを復元するときに、既存のディレクトリをコピーで書き換えることです。ディスクにはより多くのスペースが必要ですが、バックアップから復元するよりも確実に高速です。ただし、これがテンプレートメソッドよりも高速かどうかはわかりません。そのため、最初にいくつかのテストを行うことをお勧めします。

0
Haroldo_OK