メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL のバックアップ戦略には 2 つの部分があります。データの一貫したスナップショットを取ること(フルバックアップ)と、そのスナップショット以降に行われた変更を再生する手段を持つこと(ポイントインタイムリカバリ)です。適切なツールは、データベースのサイズ、許容できる復旧時間、および失っても許容できるデータの量によって決まります。

mysqldump — 論理バックアップ

mysqldump はデータを SQL ステートメントとしてエクスポートします。最も移植性の高い形式で、どのサイズのデータベースでも使えますが、大きなデータセットではバイナリバックアップより復元が遅くなります。 単一のデータベースをバックアップする:
すべてのデータベースをバックアップする:
InnoDB で推奨されるフラグ:
--single-transaction がない場合、mysqldump は LOCK TABLES でテーブルをロックするため、ダンプの間は書き込みがブロックされます。 ダンプから復元する:
すべてのデータベースを復元するには: mysql -u root -p < all_databases.sql

バイナリログを使ったポイントインタイムリカバリ

フルバックアップは、最後のバックアップの時点までしか保護してくれません。バイナリログがあれば、バックアップを取った後に行われたすべての変更を再生できます。 要件:
  • バイナリログが有効であること(log_bin = ON)
  • バックアップ取得時に --source-data=2 を使っていること(開始時の binlog の位置を記録します)
ワークフロー:
  1. フルバックアップを復元します。
  1. ダンプファイルから binlog の開始位置を探します。
  1. 取り消したいイベントの直前の時点まで、バイナリログを再生します。
mysqlbinlog のオプションの詳細については、MySQL のバイナリログを参照してください。

MySQL Shell のダンプユーティリティ

MySQL Shell(mysqlsh)は、mysqldump より高速なダンプとロードのユーティリティを提供します。並列スレッドを使い、圧縮された出力を生成するため、大きなデータベースでも実用的です。
MySQL Shell のダンプユーティリティはデフォルトで出力を圧縮し(zstd)、ダンプとロードの両方を複数の CPU コアで並列化できます。数 GB を超えるデータベースでは、mysqldump との速度差は大きくなります。

バックアップ方法の比較

mysqldump は、移植性とシンプルさの点で今でも定番です。大きなデータベースでは、MySQL Shell ダンプが事実上 mysqlpump に取って代わりました。より速く、より小さいファイルを生成し、MySQL 8.0 以降をサポートします。mysqlpump は MySQL 8.4 で削除されました。バイナリはビルドにまったく含まれないため、これを呼び出すスクリプトは即座に失敗します。 復元時間が重要な、約 50 GB を超える本番データベースでは、Percona XtraBackup または MySQL Shell ダンプが実用的な選択肢です。

各方法を使う場面

バックアップのスケジュール

夜間のダンプを実行する cron ジョブは、最も一般的な本番のセットアップです。
バックアップユーザーに必要な権限は SELECT、LOCK TABLES、SHOW VIEW、TRIGGER、EVENT、RELOAD、および PROCESS だけです。ALL PRIVILEGES は不要です。PROCESS がなくても mysqldump は完了しますが、テーブルスペースのメタデータをダンプしようとする際に、実行のたびに「Access denied … PROCESS privilege」エラーを stderr に出力します。

バックアップの検証

テストしていないバックアップはバックアップではありません。定期的に検証してください。
少なくとも月に 1 回の自動復元テストを行えば、破損、権限の問題、およびディスク容量の問題を、問題になる前に発見できます。

よくある質問

--single-transaction はすべてのストレージエンジンで機能しますか?

いいえ。--single-transaction は一貫した読み取りスナップショットを使いますが、これをサポートするのは InnoDB だけです。同じデータベース内の MyISAM テーブルは、それでもダンプの間は LOCK TABLES でロックされます。エンジンが混在している場合、--single-transaction だけでは完全に一貫したダンプには不十分です。

バックアップはどのくらいの期間保持すべきですか?

最低限、日次バックアップを 7〜14 日、週次バックアップを 4 週間、月次バックアップを 1 年保持します。保持期間は、規制上の要件と、どこまで遡って復旧する必要があるかによって決まります。バイナリログは、保持している最も古いバックアップから現在までの間隔をカバーするのに十分な期間、保持してください。

データディレクトリのコピーは有効なバックアップですか?

先にサーバーを停止した場合(コールドコピー)に限り有効です。実行中の MySQL サーバーは、直接コピーしても安全ではない方法でデータファイルに書き込むため、破損したバックアップになります。サーバーを停止せずにホットバックアップを取るには、MySQL Shell のダンプユーティリティまたは Percona XtraBackup を使ってください。

トラブルシューティング

バックアップスクリプトは、VillageSQL への切り替え後もそのまま動作します。VillageSQL は MySQL のドロップイン代替であるため、このガイドの mysqldump コマンド、バイナリログの設定、および復元の手順書はそのまま機能します。

関連項目