MySQL 8.0 リファレンスマニュアル


4.6.8.3 バイナリログファイルのバックアップのための mysqlbinlog の使用

デフォルトでは、mysqlbinlog はバイナリログファイルを読み取り、その内容をテキスト形式で表示します。 これにより、ファイル内のイベントが調べやすくなり、(たとえば出力を mysql への入力として使用して) それらを再実行できます。mysqlbinlog はローカルファイルシステムから直接ログファイルを読み取るか、または --read-from-remote-server オプションで、サーバーに接続してそのサーバーからバイナリログの内容を要求できます。mysqlbinlog はテキスト出力を標準出力、または --result-file=file_name オプションが指定された場合はその値で指名されるファイルに書き出すことができます。

mysqlbinlog バックアップ機能

mysqlbinlog では、バイナリログファイルを読み取り、同じコンテンツを含む新しいファイル (テキスト形式ではなくバイナリ形式) を書き込むことができます。 この機能により、バイナリログを容易に元の形式でバックアップできます。mysqlbinlog は、ログファイルのセットのバックアップを実行して最後のファイルの最後に到達したときに停止して、静的バックアップを作成できます。 また、最後のログファイルの最後に到達したときにサーバーとの接続を保ち、新しいイベントが生成されるたびにコピーを継続して、連続的な (ライブ) バックアップを作成することもできます。 連続的なバックアップ操作では、mysqlbinlog は接続が終了するまで (たとえばサーバーが終了するときなど)、または mysqlbinlog が強制的に終了させられるまで実行されます。 接続が終了すると、mysqlbinlog はレプリカサーバーとは異なり、接続を待機して再試行しません。 サーバーの再起動後にライブバックアップを続行するには、mysqlbinlog も再起動する必要があります。

重要

mysqlbinlog では、暗号化されたバイナリログファイルと暗号化されていないバイナリログファイルの両方をバックアップできます。 ただし、mysqlbinlog を使用して生成された暗号化バイナリログファイルのコピーは、暗号化されていない形式で格納されます。

mysqlbinlog のバックアップオプション

バイナリログバックアップには、mysqlbinlog を少なくとも 2 つのオプションを使用して起動する必要があります。

  • --read-from-remote-server (または -R) オプションは mysqlbinlog に、サーバーに接続してバイナリログを要求するよう指示します。 (これは、レプリケーションソースサーバーに接続するレプリカサーバーに似ています。)

  • --raw オプションは mysqlbinlog に、テキスト出力ではなく生の (バイナリ) 出力を書き出すように指示します。

--read-from-remote-server オプションに加えて、次のオプションを指定するのが一般的です。--host はサーバーが稼働している場所を示し、--user および --password などの接続オプションも必要な場合があります。

--raw とともに使用すると便利なオプションがほかにいくつかあります。

  • --stop-never: 最後のログファイルの最後に到達したあと、サーバーとの接続を維持して新しいイベントの読み取りを続行します。

  • --connection-server-id=id: mysqlbinlog がサーバーへの接続時にレポートするサーバー ID。 --stop-never を使用する場合、レポートされるデフォルトのサーバー ID は 1 です。 これにより、レプリカサーバーまたは別の mysqlbinlog プロセスの ID と競合する場合は、--connection-server-id を使用して別のサーバー ID を指定します。 セクション4.6.8.4「mysqlbinlog サーバー ID の指定」を参照してください。

  • --result-file: あとで説明するように、出力ファイル名のプリフィクス。

静的バックアップとライブバックアップ

mysqlbinlog でサーバーのバイナリログファイルのバックアップを行うには、サーバーに実際に存在するファイル名を指定する必要があります。 名前がわからない場合は、サーバーに接続して SHOW BINARY LOGS ステートメントを使用して現在の名前を表示します。 このステートメントによって次の出力が生成されるとします。

mysql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000130 |     27459 | No        |
| binlog.000131 |     13719 | No        |
| binlog.000132 |     43268 | No        |
+---------------+-----------+-----------+

この情報により、mysqlbinlog を使用して次のようにバイナリログを現在のディレクトリにバックアップできます (コマンドは 1 行に 1 つずつ入力します)。

  • binlog.000130 から binlog.000132 までの静的バックアップを行うには、次のいずれかのコマンドを使用します。

    mysqlbinlog --read-from-remote-server --host=host_name --raw
      binlog.000130 binlog.000131 binlog.000132
    
    mysqlbinlog --read-from-remote-server --host=host_name --raw
      --to-last-log binlog.000130

    最初のコマンドはすべてのファイル名を明示的に指定します。 2 番目は最初のファイルのみを指名し、--to-last-log を使用して最後まで読み取ります。 これらのコマンドの違いは、mysqlbinlogbinlog.000132 の最後に到達する前にサーバーが binlog.000133 を開く場合、最初のコマンドはそれを読み取りませんが、2 番目のコマンドは読み取ります。

  • mysqlbinlogbinlog.000130 から既存のログファイルのコピーを開始し、その後接続を維持してサーバーが新しいイベントを生成するにつれてそれらをコピーするライブバックアップを行うには:

    mysqlbinlog --read-from-remote-server --host=host_name --raw
      --stop-never binlog.000130

    --stop-never を使用すると、--to-last-log オプションは暗示されているため、最後のログファイルまで読み取るようにこのオプションを指定する必要はありません。

出力ファイルの命名

--raw を使用しないと、mysqlbinlog はテキスト出力を生成し、--result-file オプションが与えられた場合は、すべての出力が書き出される単一のファイルの名前を指定します。 --raw を使用すると、mysqlbinlog はサーバーから転送される各ログファイルに対して 1 つのバイナリ出力ファイルを書き出します。 デフォルトでは、mysqlbinlog はファイルを現在のディレクトリに元のログファイルと同じ名前で書き出します。 出力ファイル名を変更するには、--result-file オプションを使用します。 --raw も指定されている場合、--result-file オプション値は出力ファイル名を変更するプリフィクスとして処理されます。

サーバーに現在 binlog.000999 以上の名前のバイナリログファイルがあるとします。 mysqlbinlog --raw を使用してファイルのバックアップを行う場合、--result-file オプションは次の表に示すように出力ファイル名を生成します。 --result-file の値をディレクトリパスで始まるようにすることで、ファイルを特定のディレクトリに書き出すことができます。 --result-file の値がディレクトリ名のみで構成されている場合は、その値はパス名区切り文字で終わっていなければなりません。 出力ファイルが存在する場合は上書きされます。

--result-file オプション 出力ファイル名
--result-file=x xbinlog.000999 以上
--result-file=/tmp/ /tmp/binlog.000999 以上
--result-file=/tmp/x /tmp/xbinlog.000999 以上
例: mysqldump と mysqlbinlog を合わせてバックアップとリストアを行う

次の例は、mysqldumpmysqlbinlog を一緒に使用してサーバーのデータおよびバイナリログのバックアップを取る方法、およびデータの損失が生じた場合にバックアップを使用してサーバーのリストアを行う方法を示す簡単なシナリオを説明しています。 例では、サーバーはホスト host_name 上で稼働し、最初のバイナリログファイルの名前は binlog.000999 であるとします。 コマンドは 1 行に 1 つずつ入力します。

mysqlbinlog を使用してバイナリログのバックアップを継続的に作成します。

mysqlbinlog --read-from-remote-server --host=host_name --raw
  --stop-never binlog.000999

mysqldump を使用してサーバーのデータのスナップショットとしてダンプファイルを作成します。 --all-databases--events、および --routines を使用してすべてのデータのバックアップを行い、--master-data=2 を使用して現在のバイナリログ座標をダンプファイルに含めます。

mysqldump --host=host_name --all-databases --events --routines --master-data=2> dump_file

必要に応じて mysqldump コマンドを定期的に実行して、新しいスナップショットを作成します。

データ損失が発生した場合 (たとえば、サーバーが予期せず終了した場合)、最新のダンプファイルを使用してデータをリストアします:

mysql --host=host_name -u root -p < dump_file

次にバイナリログバックアップを使用して、ダンプファイル内にリストされている座標よりあとで書き出されたイベントを再実行します。 ファイル内の座標が次のようになっているとします。

-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.001002', MASTER_LOG_POS=27284;

直近にバックアップされたログファイルが binlog.001004 という名前の場合、次のようにログイベントを再実行します。

mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004
  | mysql --host=host_name -u root -p

リストア操作をより容易に実行するために、または MySQL でリモート root アクセスが許可されない場合は、バックアップファイル (ダンプファイルおよびバイナリログファイル) をサーバーホストにコピーする方が簡単な場合もあります。

mysqlbinlog バックアップの制限事項

mysqlbinlog でのバイナリログバックアップには、次の制限事項があります:

  • 接続が失われた場合 (サーバーの再起動が発生した場合やネットワークが停止した場合など)、mysqlbinlog は MySQL サーバーに自動的に再接続しません。

  • バックアップの遅延は、レプリカサーバーの遅延と似ています。


関連キーワード:  mysqlbinlog, サーバー, バックアップ, バイナリ, binlog, 接続, 出力, プログラム, host, file