web-dev-qa-db-ja.com

InnoDBおよびMyISAMテーブルを使用した*一貫性のある**オンライン* MySQLバックアップの作成

1か月前に作成したmysqldumpファイルから2台の故障したサーバーを置き換える新しいデータベースサーバーを構築するのに何時間も費やし、サーバーのbin-logsを使用してそのmysqldumpを最新の状態にしました。この新しいデータベースサーバーをオンラインにし、数日間実行したので、サーバーのセットアップを完了し、バックアップ戦略を再実装する必要があります。

新しいサーバー用に(少なくとも)1つのMySQLレプリケーションスレーブをオンラインにする必要があります。また、問題が再び発生した場合に備えて、使用可能なバックアップの作成を開始する必要があります。

先に進む前に:

  • 古い論理バックアップをインポートして古いbinログを実行する前に、新しいMySQLサーバーでbin-logを有効にするのを忘れました(深い)(その時点で24時間起動していると非難します)。

  • 私のデータはいくつかのデータベースで構成されており、そのすべてにMyISAMテーブルとInnoDBテーブルが混在しています。

  • また、新しいサーバーでbinログを有効にするのと同じように、すべてのデータをインポートする前に、innodb-file-per-tablemy.cnfオプションをオンにするのを忘れました。新しいMySQLサーバーでバイナリログが有効になりましたが、別の論理バックアップをインポートできるようになるまで、[テーブルごとのファイルなし]オプションはほとんど修正されていません(おそらく2番目のスレーブを起動し、最初のスレーブを昇格させることになります)現在のマスターをマスターして破棄する-構成が必要な場所にないため)。

だから、問題:
MySQLサーバーのバックアップを取る必要がありますが、新しいMySQLサーバーをオフラインにすることができません。書き込みを継続し、ダウンタイムをほとんどまたはまったく発生させずに読み取りを提供する必要があります。この「ダウンタイムがほとんどない」という要件は、10分未満と定義されています。私のデータは現在サーバー上で約100GBのスペース(mysqlデータファイル)を使用しており、論理バックアップは約50GBです(これは多くのインデックスです..haha)。このバックアップが論理的であること、またはMySQLデータディレクトリからのデータファイルのコピーであることは気にしません。オンラインにした後、スレーブから論理バックアップを作成できます。

そして、質問:
この必要なバックアップをどのように作成しますか?それは簡単ではないことを私は知っています、多くの人々はそれが不可能であると言うでしょう。しかし、私はそれが不可能であると信じることを拒否します、それを成し遂げる方法がなければなりません。

サーバーに関する注意:Ubuntu 10.04、MySQL 5.1.41を実行しており、データが保存されているファイルシステムはext3です。サーバーはRackspaceCloudで実行されているため、ルートデバイスを再パーティション化し、別のFS(XFSかもしれませんか?))で再パーティション化できない限り、ファイルシステムはほぼ「それが何であるか」です。スナップショットを作成します。

Perconas XtraBackup Tool について読みましたが、InnoDBテーブルでのみ機能します。 MyISAMツールがありますが、XtraBackupと組み合わせて完全に一貫性のあるバックアップを作成する方法がわかりません(または機能する場合でも)。

mysqlhotcopy について読みましたが、MyISAMテーブルでのみ機能します。

明らかに私はmysqldumpについて知っていますが、(また、明らかに)ここでの問題は、SQLバックアップファイル全体を出力するのにかかる時間数の間、データベースサーバー全体をロックせずに一貫したバックアップを作成することです。

6
Jim Rubenstein

XtraBackup、より具体的にはinnobackupexに関しては、これをチェックしてください 説明

抜粋:

Innobackupexプログラムは、MyISAMテーブルと.frmファイルのバックアップも可能にすることで、より便利で機能的な機能を追加します。 xtrabackupを開始し、ファイルのコピーが完了するまで待機してから、FLUSH TABLES WITH READ LOCKを発行して、MySQLのデータがさらに変更されないようにし、すべてのMyISAMテーブルをディスクにフラッシュします。このロックを保持し、MyISAMファイルをコピーしてから、ロックを解除します。

バックアップされたMyISAMテーブルとInnoDBテーブルは、準備(リカバリ)プロセスの後、バックアップが開始された時点にロールバックされるのではなく、バックアップが完了した時点にロールフォワードされるため、最終的には相互に整合性が保たれます。この時点は、FLUSH TABLES WITH READ LOCKが取得された場所と一致するため、MyISAMデータと準備されたInnoDBデータは同期しています。

お役に立てれば。

乾杯

4
HTTP500

この「ダウンタイムがほとんどない」という要件は、10分未満と定義されています。

OK 2つの明白な解決策:

1)mysqlデータテーブルを保持するためにミラーリングされたファイルシステムをセットアップします。バックアップを実行する場合は、mysqldをシャットダウンし、セットからミラーの1つを削除してから、mysqldを再度起動してから、ミラーから取り出したばかりのドライブを別の場所に再マウントして、rawファイルをコピーするか開始します。 mysldの2番目のインスタンス(異なるポート、ファイルへの異なるパス)を起動し、そこでmysqldumpを実行します。終了したら、2番目のmysqldインスタンスをシャットダウンし、ドライブをミラーセットに戻します(RAIDシステムは、ミラーのprtとして読み取られる前にドライブの更新を処理する必要があるため、この時点で最初のインスタンスをシャットダウンする必要はありません)。

2)1と同様ですが、アプリケーションレベルでミラーリングを実装します。現在のmysqldインスタンスをマスターとして設定し、2番目のインスタンスをスレーブとして構成します。バックアップを作成する場合は、スレーブでレプリケーションを停止し、バックアップを実行してからレプリケーションを再開します(ダウンタイム0)。

1
symcbean

これはクラウドインフラストラクチャであり、専用サーバーで実行できる多くのこと(ファイルシステムの再パーティション化/変更/ lvmの使用など)を実行できないため、クラウドサービスプロバイダーからスナップショット/バックアップソリューションを探してください。

クイックグーグルは私にこれを指摘しました: http://www.rackspace.com/cloud/blog/2010/06/16/introducing-cloud-servers-snapshots-to-cloud-files/

これをチェックしてください、それはあなたの問題のための最良の解決策かもしれません。

0
rvs