kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

MySQLのバイナリログについて解説

バイナリログとは

マスタのDBの 更新命令のみ を記録したログファイル

マスタ/スレーブ間の同期(レプリケーション)で使用する

  • my.cnflog-bin オプションを設定すると、バイナリログが作成されるようになる

バイナリログの保存形式

STATEMENT, ROW, MIXED の3種類がある。binlog-format オプションで設定可能。デフォルトは、STATMENT

  • STATEMENT : SQL文をそのまま保持

    • メリット: サイズが小さい
    • デメリット: 非決定的な命令(後述) が発生すると、マスタ/スレーブ間で差異が生じる
  • ROW : DBの行をどのように更新したか? という情報を保持

    • メリット: 非決定的な命令が発生しても同期を維持できる
    • デメリット: サイズが大きい。大量に更新があるとHDDや帯域を圧迫する
  • MIXED: 非決定的な命令のみ ROW形式で保持

    • メリット: ROW形式のバイナリログより小さいサイズで、非決定的な命令が発生しても同期を維持できる
    • デメリット: STATEMENT形式のバイナリログよりはサイズが大きい 

非決定的な命令とは

ORDER BY が指定されていない INSERT」や UUID()など、結果が固定されていない命令を指す

マスタのバイナリログのステータス確認方法

SHOW MASTER STATUS で確認可能

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
             File: master-bin.000002
         Position: 1307
     Binlog_Do_DB: test
 Binlog_Ignore_DB: manual, mysql
Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
1 row in set (0.00 sec)
  • File : 現在のバイナリログの格納先
  • Position: バイナリログの座標(ポジション)
  • Binlog_Do_DB : レプリケーション対象のDB
  • Binlog_Ignore_DB : レプリケーション対象外のDB
  • Executed_Gtid_Set : GTIDの値(今回は解説しない)

参考