web-dev-qa-db-ja.com

MySQL DBをバックアップするためのベストプラクティス

私は最近、MySQLで実行される本番Webサーバーが定期的に(またはまったく)バックアップされていないことを発見しました。私はSQL Server DBのバックアップに慣れていますが、MySQL DBの経験はあまりありません。 「mysqldump」またはその他のDBバックアップツールを使用するためのベストプラクティスはありますか?

おそらく、スケジュールをcronジョブで実行し、夜間に完了するようにして、バックアップシステムでファイルをバックアップします。

ありがとう。

24
Valien

MySQLサーバーバックアップを取るためのベストプラクティス:

MySQLレプリケーション

MySQLでレプリケーションをセットアップします。マスターサーバーとスレーブサーバーを設定する必要があります。 DBへのすべての読み取り/書き込みは、スレーブサーバーに送信できます。レプリケーションを使用する利点は、マスターサーバーを中断せずにスレーブサーバーからバックアップを取得できることです。アプリケーションは、ダウンタイムなしでマスターで動作し続けます。

MySQLダンプの使用

データセットが小さい場合( "小さい"は相対的な用語であることに気づきます。これを修飾するには、<10 GBとしましょう)、mysqldumpはおそらくうまく機能します。簡単で、オンラインで、非常に柔軟です。 mysqldumpで実行できるいくつかのこと:すべてをバックアップするか、特定のデータベースまたはテーブルのみをバックアップしてDDLのみをバックアップし、より高速な復元のためにダンプを最適化して、結果のsqlファイルを他のRDBMSとより互換性のあるものにします。

ただし、最も重要なオプションは、バックアップの一貫性に関連しています。私のお気に入りのオプションは次のとおりです。--single-transaction:このオプションは、テーブルがInnoDBストレージエンジンを使用している場合(かつその場合のみ)に一貫したバックアップを提供します。読み取り専用でないMyISAMテーブルがある場合は、バックアップ時にこのオプションを使用しないでください。 --master-data = 2:このオプションは、(-single-transactionオプションを追加していない限り、all-all-tablesを実行することにより)ダンプが一貫していることを確認します。 --master-dataオプションは、結果のダンプファイルにバイナリログの位置も記録します(= 2を指定すると、この行がダンプファイルのコメントになります)。

Mysqldumpに関する最後の注意:復元時間はバックアップ時間より大幅に長くなる可能性があることに注意してください。インデックスの数など、いくつかの要因によって異なります。

LVMスナップショット

より大きなデータセットを持っている場合は、物理的なバックアップが適しています。コールドバックアップ(つまり、MySQLサービスのシャットダウン、データディレクトリのコピー、サービスの再起動)を行うことはできますが、多くの人はダウンタイムを望んでいません。私のお気に入りのソリューションはスナップショットです。これは、ホットな場合(InnoDBの場合)または短いロックが必要な場合(MyISAMの場合)です。すべてのデータを含めることを忘れないでください(ib_logfilesを含めます)。 Lenzはこれに役立つ素敵なユーティリティを提供しています: http://www.lenzg.net/mylvmbackup/

MySQL Enterprise Backupの使用

MySQL Enterprise Backupを使用する利点:

  • InnoDBテーブルの「ホット」バックアップは、特定のテーブルまたはテーブルスペースのみのバックアップをブロックすることなく、完全にオンラインで行われます。
  • 前回のバックアップ以降に変更されたデータのみをバックアップします
  • 圧縮バックアップ-ストレージを最大90%節約します。

リファレンス: http://www.mysql.com/products/enterprise/backup/features.htmlhttp://www.mysql.com/products/enterprise/backup.html

30

バックアップに使用する 専用レプリカ を設定することをお勧めします。これにより、プライマリに影響を与えることなくバックアップタスクを実行できます。これによりアーキテクチャが複雑になるため、レプリケーションラグを監視して、すべてが機能していることを確認する必要があります。

実際のプロセスについては、サードパーティのツールを使用せずにいくつかのオプションがあります。スナップショットはmysqldumpコマンドを使用して取得できます(InnoDBを使用している場合):mysqldump --all-databases --single-transaction > all_databases.sql。データサイズによっては、MySQLをシャットダウンし、データファイルを直接バックアップする方が望ましい場合があります。レプリカが再起動されると、プライマリがダウンしていた間にプライマリが受信したすべてのイベントが再生されます。 MySQL Enterpriseを使用している場合、mysqlbackupユーティリティがこれを行います。

レプリカで バイナリログ を有効にすると、増分バックアップを取得できます。明らかに、これはデータを変更するイベントのみを記録するため、これを上記のスナップショットと組み合わせる必要があります。

7
Rich Schumacher