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


52

まず、私はDBAやシステム管理者ではなく、開発者です。優しくしてください:)

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

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

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

役立つアイデアを事前に感謝します。


データベースダンプがあると言いますが、それで十分ではありませんか?システムをテストし、何か問題が発生した場合は、ダンプを使用してDBを元の状態に戻し、開発を続けます。
-DrColossos

1
変更されたテーブルのみを復元していますか?
ジャックダグラス

1
@Jack Douglas:ダンプから完全なDBを復元しています。問題のテーブルはデータの約3分の2を占めていますが、正しい復元順序と外部キーの制限について心配する必要があります。
ジルク

1
@DrColossus:はい、ダンプは以前の状態を復元するには十分ですが、作成と適用は非常に遅くなります。
ジルク

回答:


35

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

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


それは非常に良い考えです。データベーステンプレートについてはまったく考えていませんでした。ありがとうございました!
ジルク

1
これは優れたソリューションで、ドロップ復元よりも5倍高速ですが、欠点が1つあります。これを行う前に現在の接続をドロップする必要があります。そうしないと、実行に失敗します。
ソリン

更新:これは、ソースデータベースに接続されているため、運用環境では機能しません。別のソリューションが必要です。
ソリン14年

11

Stellarを使用します。これはデータベースのgitのようなものです。

Stellarを使用すると、データベース移行の作成、ブランチの切り替え、またはSQLの操作などを行っているときにデータベースをすばやく復元できます。PostgreSQLおよびMySQL(部分的に)がサポートされています。



liquibaseはStellarのようにサポートしていません。Stellarでは、データベースを操作することができ(ユニットテストなど)、以前のタグ付けされた状態または時間にロールバックする必要があります。
アンドレアスディートリッヒ

ステラは素晴らしいアイデアのように聞こえますが、私に
オーランド

5

データベースがVirtualboxで実行されている場合、スナップショットを簡単に保存し、データベースの状態とOS自体の両方のスナップショットを数秒(またはデータベースまたはOSに大量のデータがある場合は1〜2分)で簡単に復元できます仮想マシンに割り当てられるメモリはほとんどありません)。

あなたのほとんどの場合、データベースがホストされている仮想マシンを実行するために、軽量のLinux(Windowsサーバーよりも)をインストールするのがベストです。


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


ああ、気にしないで、virtualboxについてすでに知っているというコメントは見ませんでした。
ワイルドピーク

3

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


はい、それは思い浮かびました。残念ながら、ファイルシステムのスナップショットは、現在使用しているFS(ext3)ではサポートされていません。別のオプションは、テスト実行用にVirtualboxのようなVMをセットアップすることです。
ジルク

2

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

git reset --hard

6
これは、大規模なデータベースには役立ちません。さらに、さまざまなサイズのバイナリファイルでgitを拷問するのはなぜですか?
RolandoMySQLDBA

0

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


0

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

したがってZFS、@ Peter Eisentrautが言及した次の理由から、これらを将来考慮するファイルシステムとして言及する必要があります。

  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を停止し、postgresqlをzfs snapshot $SNAPSHOT開始してから、ロールバックしてpostgresqlを停止し、zfs rollback $SNAPSHOT

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

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