MySQLバイナリログ(binlog)の仕組みとデータ復旧のための運用設定

バイナリログ(binlog)の概要

MySQLのバイナリログ(binlog)は、データベースに対するすべての変更操作(DDLおよびDML)を記録する非常に重要なログファイルです。データの検索(SELECT)以外の、データの作成、更新、削除といったイベントを時系列で保存します。binlogはトランザクションの安全性を保証し、障害発生時のデータ復旧やマスター・スレーブ間のレプリケーションにおいて中核的な役割を果たします。

主な記録内容

  • DDL (Data Definition Language): CREATE、ALTER、DROPなどのテーブル構造の定義。
  • DML (Data Manipulation Language): INSERT、UPDATE、DELETEなどのデータ操作(※SELECTは含まれません)。
  • 付随情報: 各文の実行時間、実行にかかった時間、トランザクションのコミット情報など。

binlogの主な利用シーン

実務におけるbinlogの用途は主に以下の2点に集約されます。

  1. データレプリケーション: マスターサーバー上で発生した変更をバイナリログに記録し、それをスレーブサーバーに送信・実行することでデータの同期を行います。
  2. データ復旧(ポイントインタイムリカバリ): 定期的なフルバックアップとbinlogを組み合わせることで、バックアップ取得以降の変更分を反映させ、任意の時点までデータを復元できます。

binlogの有効化と設定方法

デフォルトでは無効になっていることが多いため、設定ファイル(my.cnf または my.ini)を編集して有効化する必要があります。設定変更後はMySQLサービスの再起動が必要です。

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

MySQLクライアントから以下のコマンドを実行し、binlogが有効(ON)になっているか確認します。

SHOW VARIABLES LIKE 'log_bin';

2. 設定ファイルの編集

設定ファイルの[mysqld]セクションに以下のパラメータを追加します。レプリケーション環境ではserver-idの設定も必須です。

[mysqld]
# バイナリログの有効化とファイル名の接頭辞指定
log-bin=mysql-bin

# ログの記録フォーマット(ROW, STATEMENT, MIXED)
# データの整合性を保つため、現在はROW形式が推奨される
binlog_format=ROW

# サーバーを識別する一意のID
server-id=1

# ログファイルの保持期間(日単位)
expire_logs_days=14

# 1ファイルあたりの最大サイズ
max_binlog_size=256M

mysqlbinlogツールによるデータ復旧

バイナリログはバイナリ形式で保存されているため、テキストエディタで直接読むことはできません。mysqlbinlogという標準ツールを使用して、人間が読める形式に変換したり、データベースに適用したりします。

フィルタリングオプション

復旧範囲を絞り込むために、以下のオプションが頻繁に使用されます。

  • --start-datetime / --stop-datetime: 指定した日時範囲のログを抽出します。
  • --start-position / --stop-position: ログ内の特定のポジション(位置情報)に基づいて抽出します。

復旧コマンドの実行例

特定のログファイルから、特定の時間帯のデータを復旧する例です。出力を直接mysqlクライアントにパイプすることで実行します。

mysqlbinlog --start-datetime="2023-10-01 10:00:00" \
             --stop-datetime="2023-10-01 11:00:00" \
             /var/lib/mysql/mysql-bin.000005 | mysql -u root -p

バイナリログの管理における注意点

バイナリログを有効にすると、ディスクI/Oの増加により約1%程度のパフォーマンス低下が発生する可能性があります。また、ログファイルはディスク容量を消費し続けるため、expire_logs_daysを適切に設定して古いログを自動的に削除するか、外部ストレージにアーカイブする運用が不可欠です。

タグ: MySQL binlog database-recovery Replication mysqlbinlog

5月25日 16:21 投稿