MySQLのDBバックアップからmysqlbinlogで特定時点に復元する手順|binlogの有効化と実行

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > MySQLのDBバックアップからmysqlbinlogで特定時点に復元する手順|binlogの有効化と実行
「昨夜0時のmysqldumpバックアップから戻せるのは分かった。でも今日の午後に誤って実行したUPDATEで上書きした15時間分のデータは、もう取り戻せないのか。」

mysqldumpによる定期バックアップを運用していると、こういう問いに直面することがあります。

この記事では、MySQLのバイナリログ(binlog)を有効化し、mysqldumpのフルバックアップと組み合わせて特定時点に復元する手順を解説します。my.cnfへの設定追加からmysqlbinlogコマンドの実行まで、RHEL 9系/Ubuntu 24.04 LTSを想定環境として説明します。

この記事のポイント

・フルバックアップ(mysqldump)+binlogで任意の時点に復元できる
・my.cnfにlog_binを追加するだけでbinlogが有効になる
・mysqlbinlogの--stop-datetimeで誤操作直前の時刻を指定して復元する
・binlog_expire_logs_secondsで自動削除の日数を設定する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜmysqldumpだけでは不十分なのか

mysqldumpによる定期バックアップは、前日夜中のスナップショットを保存するのに適しています。

ただし、前回バックアップ以降に発生した変更は含まれません。

「WHERE句を忘れた全件UPDATE」「誤ったテーブルへのDELETE」といった操作ミスは、前回のフルバックアップ取得後に起きることがほとんどです。

この場合、mysqldumpだけでは「直前の状態」には戻れません。

MySQLのバイナリログ(binlog)はデータ変更を時系列で記録するログです。フルバックアップ取得後から誤操作の直前までの変更を再生できます。

フルバックアップとbinlogを組み合わせることで、誤操作の直前の状態に復元することが可能になります。これがポイントインタイムリカバリー(PITR)と呼ばれる手法です。

バイナリログを有効にする

MySQLのバイナリログはバージョンによってデフォルト設定が異なります。
まず現在の状態を確認してから設定を進めてください。

1. 現在のbinlog状態を確認する

MySQLにログインして以下のSQLを実行してください。

mysql -u root -p

SHOW VARIABLES LIKE 'log_bin';

出力例(環境により異なります):

+---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | OFF | +---------------+-------+

「OFF」であればbinlogが無効の状態です。

2. my.cnfにbinlogの設定を追加する

設定ファイルを編集します。RHEL 9系は /etc/my.cnf、Ubuntu 24.04 LTSは /etc/mysql/mysql.conf.d/mysqld.cnf が対象です。

作業前に設定ファイルのバックアップを取ってから編集してください。

# RHEL 9系の場合 cp /etc/my.cnf /etc/my.cnf.bak vi /etc/my.cnf # Ubuntu 24.04 LTSの場合 cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] セクションに以下の3行を追加します。

[mysqld] log_bin = /var/lib/mysql/mysql-bin binlog_format = ROW binlog_expire_logs_seconds = 604800

各設定の意味は以下のとおりです。

・log_bin:binlogファイルの保存先とプレフィックスを指定します
・binlog_format:ROWは行レベルで変更を記録します。STATEMENTより確実に変更を再生できます
・binlog_expire_logs_seconds:604800秒(7日間)経過したbinlogを自動削除します

3. MySQLを再起動して有効化を確認する

設定を追加したらMySQLを再起動します。

# RHEL 9系 systemctl restart mysqld # Ubuntu 24.04 LTS systemctl restart mysql

再起動後にMySQLへログインして確認してください。

SHOW VARIABLES LIKE 'log_bin'; SHOW BINARY LOGS;

出力例(環境により異なります):

+---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ +------------------+-----------+-----------+ | Log_name | File_size | Encrypted | +------------------+-----------+-----------+ | mysql-bin.000001 | 180 | No | +------------------+-----------+-----------+

「ON」になっていれば有効化成功です。

フルバックアップを取得する

binlogと組み合わせて使うフルバックアップには、--single-transactionと--master-dataオプションが必要です。

・--single-transaction:トランザクション整合性を保ったままInnoDBをダンプします
・--master-data=2:ダンプファイルにbinlogのファイル名と位置をコメントで記録します

以下のコマンドでバックアップを取得してください。

mysqldump \ --user=root \ --password \ --single-transaction \ --master-data=2 \ --all-databases \ > /backup/full_$(date +%Y%m%d_%H%M%S).sql

取得後、ダンプファイルの先頭付近にbinlogの位置が記録されていることを確認してください。

grep 'MASTER_LOG_FILE' /backup/full_20261111_020000.sql | head -3

出力例(環境により異なります):

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=4;

MASTER_LOG_FILEとMASTER_LOG_POSの値が、復元時に使う「フルバックアップ終了直後のbinlog開始位置」になります。

Linuxサーバーの運用では、このフルバックアップをcronで毎日深夜に自動実行するのが一般的です。バックアップ設計と復元操作の実践を体系的に身につけたい方は、Linux Master Pro Seminar でハンズオン形式で体験できます。

mysqlbinlogで特定時点に復元する

フルバックアップ取得後に誤操作が発生したケースを例に、復元手順を説明します。

1. 誤操作の発生時刻を特定する

mysqlbinlogコマンドでbinlogの内容を確認できます。

mysqlbinlog -v /var/lib/mysql/mysql-bin.000003 | grep -A 5 'UPDATE\|DELETE' | head -40

誤操作のSQLと実行時刻を確認してください。binlogには以下の形式でタイムスタンプが記録されています。

出力例(環境により異なります):

#261111 15:23:14 server id 1 end_log_pos 1024 ... ### UPDATE `appdb`.`orders` ### WHERE ### @1=1001 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @3='deleted' /* STRING(16) meta=65040 nullable=1 is_null=0 */

この例では「2026年11月11日 15:23:14」が誤操作の時刻です。
復元先は「15:23:13」(誤操作の1秒前)に設定します。

2. フルバックアップを復元する

まず、フルバックアップをMySQLにインポートします。

mysql -u root -p < /backup/full_20261111_020000.sql

フルバックアップの取得時刻はファイル名のタイムスタンプで確認できます。

3. mysqlbinlogで誤操作直前まで変更を再生する

フルバックアップ取得後から誤操作の直前までの変更を、mysqlbinlogコマンドで抽出してMySQLに適用します。

mysqlbinlog \ --start-position=4 \ --stop-datetime='2026-11-11 15:23:13' \ /var/lib/mysql/mysql-bin.000003 \ | mysql -u root -p

・--start-position:フルバックアップのダンプファイルに記録されていたMASTER_LOG_POSの値を指定します
・--stop-datetime:この日時の直前までの変更を再生します。誤操作の1秒前を指定してください

複数のbinlogファイルにまたがる場合は、ファイル名を並べて指定します。

mysqlbinlog \ --start-position=4 \ --stop-datetime='2026-11-11 15:23:13' \ /var/lib/mysql/mysql-bin.000002 \ /var/lib/mysql/mysql-bin.000003 \ | mysql -u root -p

4. 復元結果を確認する

対象テーブルのレコード数や内容を確認して、期待どおりのデータに戻っているかをチェックしてください。

-- 対象テーブルのレコード数を確認 SELECT COUNT(*) FROM orders; -- 更新日時を確認してデータが戻っているか確認 SELECT id, status, updated_at FROM orders ORDER BY updated_at DESC LIMIT 10;

トラブルシュートとよくあるエラー

「mysqlbinlog: File 'mysql-bin.000003' not found」が出た時

binlogファイルのパスが正しいかを確認してください。
MySQLにログインして現在のbinlogファイルを確認できます。

SHOW BINARY LOGS; SHOW VARIABLES LIKE 'log_bin_basename';

「ERROR 1049 (42000): Unknown database」が出た時

フルバックアップが --all-databases で取得されていない場合、特定のデータベースが存在しないエラーになることがあります。
データベース名を指定してフルバックアップを取得し直してから、binlogの再生を実行してください。

復元に必要なbinlogファイルが存在しない

binlog_expire_logs_secondsで設定した期間(前述の設定例では604800秒=7日間)を超えると、binlogは自動削除されます。

復元に必要なbinlogファイルが削除されていた場合、その期間への復元はできません。
binlogの保存期間はバックアップポリシーに合わせて設定してください。

ROWフォーマットのbinlogが読みにくい時

binlog_format=ROW のとき、mysqlbinlogの出力はBase64エンコードになっています。
-v オプションを追加すると人が読める形式で出力されます。

mysqlbinlog -v /var/lib/mysql/mysql-bin.000003 | grep -A 10 'UPDATE\|DELETE'

まとめ

やりたいこと コマンド・設定
binlogを有効にする my.cnf の [mysqld] に log_bin = /var/lib/mysql/mysql-bin を追加
現在のbinlog状態を確認する SHOW VARIABLES LIKE 'log_bin';
binlogのファイル一覧を表示する SHOW BINARY LOGS;
binlog位置を記録したフルバックアップを取得する mysqldump --single-transaction --master-data=2 --all-databases > file.sql
binlogの内容を確認する mysqlbinlog -v /var/lib/mysql/mysql-bin.000003
特定時点の直前まで変更を再生する mysqlbinlog --start-position=N --stop-datetime='YYYY-MM-DD HH:MM:SS' binlog-file | mysql -u root -p
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、

MySQL/MariaDBのバックアップ設計と復元操作も含め、Linuxサーバーの実務を2日間で体系的に学ぶセミナーを開催しています。

>> Linux Master Pro Seminar の詳細と日程を確認する

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。