web-dev-qa-db-ja.com

最近の変更を元に戻すためのMySQLデータベースの高速バックアップと復元

私はまともな大きなMySQL DB(InnoDB)でサイズは約400 MBです。したがって、dumping mysqldumpを使用したDB全体および復元それを元に戻します永久にかかります(15分以上、これは許容できません)。

デバッグの目的で、コードを実行する必要があります特定の「バージョン」に対して DBの次にすべての変更を元に戻す(ある場合)および再試行(おそらく複数回)。バグを再現するには、常に同じバージョンのDBから開始する必要があります。

手動でDBにポイントインタイムスナップショットを作成してからオンデマンドで復元するように指示する方法はありますか?これは理想的には数秒しかかからないはずです(私はいくつかのコピーオンライト方式が使用されると思います)。

最終アプリケーションから独立したソリューションを探しています。ロボットテストを実行する必要があるWebアプリケーション(複数の要求/応答サイクルを含む)を想像してください。さらに、アプリケーションをバグの可能性があるものとして扱う場合、トランザクションのロールバックを確実に管理することも信頼できません。

バックアップしようとしたところです/var/lib/mysql with rsync。復元後にMySQLを起動することもできません。おそらく、整合性を損なうファイルがどこかに残っています。とにかく、私は最後の希望としてのみFSレベルのバックアップに頼って、より高いレベルのソリューションを探していました。

4
Jozef

あなたが述べたように、データディレクトリをコピーすることはあなたが必要とするものを達成するための一つの方法です。手順は次のとおりです。エラーが発生した場合は投稿してください。

  1. MySQLサーバーをシャットダウンします。またはターミナルでロックテーブルをフラッシュFLUSH TABLES WITH READ LOCK [重要:ターミナルを開いたままにします]
  2. データディレクトリをコピーします:cp、またはrsync
  3. シャットダウンした場合はサーバーを再起動します。またはターミナルに戻り、テーブルのロックを解除します:UNLOCK TABLES
  4. すでに作成したコピーの複数のコピーを作成します
  5. 新しく作成したディレクトリの所有者をmysqlに変更します:chown mysql:mysql dir_name(これはchown -rなので、再帰的に実行されます)

これまでのところ、必要な時点でデータの複数のコピーがあります。

コピーを「復元」するには、次のいずれかを実行します。

  • My.cfg(またはmy.ini)のdatadirの値をデータコピーの1つの場所に変更し、サーバーを再起動します。または
  • サーバーをシャットダウンし、データのコピーの内容を元のデータディレクトリにコピーして戻し、サーバーを再起動します。
1
Jehad Keriaki

ファイルシステムにLVMを確立します。その後、データセットのサイズに関係なく、スナップショットにかかる時間は1秒未満です。 diskの個別のコピーを取得しますが、変更されていないブロックは共有されます。変更されたブロックは「コピーオンライト」であるため、スナップショットが大きくなりすぎる前に、スナップショットを一掃する必要があります。 (問題ないようにお願いします。)

基本的にnoデータのコピーがあるため(mysqldumpまたはファイルダンプのように)、非常に高速です。同じマシンで2つのインスタンスが実行されているが、別々の「論理ボリューム」を指しているため、それらは独立して実行できます。 (注:インスタンスごとに異なるポートを使用してください。)

0
Rick James