デフォルトでは、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=
: mysqlbinlog がサーバーへの接続時にレポートするサーバー ID。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
を使用して最後まで読み取ります。 これらのコマンドの違いは、mysqlbinlog がbinlog.000132
の最後に到達する前にサーバーがbinlog.000133
を開く場合、最初のコマンドはそれを読み取りませんが、2 番目のコマンドは読み取ります。 -
mysqlbinlog が
binlog.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 を合わせてバックアップとリストアを行う
次の例は、mysqldump と mysqlbinlog を一緒に使用してサーバーのデータおよびバイナリログのバックアップを取る方法、およびデータの損失が生じた場合にバックアップを使用してサーバーのリストアを行う方法を示す簡単なシナリオを説明しています。 例では、サーバーはホスト 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 サーバーに自動的に再接続しません。
バックアップの遅延は、レプリカサーバーの遅延と似ています。