バイナリログ(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点に集約されます。
- データレプリケーション: マスターサーバー上で発生した変更をバイナリログに記録し、それをスレーブサーバーに送信・実行することでデータの同期を行います。
- データ復旧(ポイントインタイムリカバリ): 定期的なフルバックアップと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を適切に設定して古いログを自動的に削除するか、外部ストレージにアーカイブする運用が不可欠です。