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


23

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

スケジュールをcronジョブにして夜間に実行し、その後、バックアップシステムでファイルをバックアップします。

ありがとう。

回答:


29

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

MySQLレプリケーション

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

MySQLダンプの使用

データセットが小さい場合( "small"は相対的な用語であることがわかります。..修飾するために、たとえば<10GB)、mysqldumpはおそらくうまく機能します。簡単で、オンラインで、非常に柔軟です。mysqldumpでできることはいくつかあります。すべてをバックアップするか、特定のデータベースまたはテーブルのみをバックアップし、DDLのみをバックアップすることで、リストアを高速化するためにダンプを最適化します。

ただし、最も重要なオプションは、バックアップの一貫性に関連しています。私のお気に入りのオプションは次のとおりです。--single-transaction:このオプションは、テーブルがInnoDBストレージエンジンを使用している場合(のみ)、一貫性のあるバックアップを提供します。読み取り専用ではないMyISAMテーブルがある場合は、バックアップ時にこのオプションを使用しないでください。--master-data = 2:このオプションは、ダンプの一貫性を保証します(オプション--single-transactionを追加していない限り、lock-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.html http://www.mysql.com/products/enterprise/backup.html


7

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

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

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


3
+1 --single-transactionを追加すること--events --routinesを忘れないでください--triggers。my.cnfで無効にできるため、デフォルトで有効になっていますが、私も常に使用しています。データベースにこれらのタイプのオブジェクトがあるかどうかに関係なく、これらを標準的な方法として使用することは、ほとんど常に良いことだと思います。
マイケル-sqlbot

mysqldump --all-databasesは、最大オープンテーブルの設定を低く定義している場合にエラーをトリガーする可能性があります。mysql.logに注目してください。複製は確かに最良のバックアップ方法です
Raymond Nijland

どのようにしてデータの履歴コピーを保持しますか?(多くの場合、クライアントは1か月以上のバックアップを保持し、アプリケーションのバグによりデータが破損した場合、開発者はバグの前のdbのコピーを必要とします。)
RonJohn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.