MySQL
binlog

MySQL binlog を眺める

MySQL では binlog が replication の柱になっている。mysqlbinlog コマンドで状態が確認できる

Group Replication での設定を基本に、動作を確認してみる。

test1.cnf
[mysqld]
basedir=/usr
datadir=/var/tmp/test1

port=24801
socket=/var/tmp/test1.sock

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="127.0.0.1:24901"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
loose-group_replication_bootstrap_group=off

binlog_rows_query_log_events=TRUE

簡単にセットアップするなら次の 2 行で(Ubuntu での下ごしらえ参照)。

mysqld --defaults-file=test1.cnf --initialize-insecure
mysqld --defaults-file=test1.cnf

mysqlbinlog でログを眺める。

  • 通常はファイルを読み取って STDOUT に表示する。
  • -R で remote server から読み取って STDOUT に表示するようにスイッチできる。接続先のオプションは必要。
    • --raw を付けると remote server から読み取ったものを再び手元のディスクに書き出せる。
    • --stop-never を付けるとストリーミング動作する。
  • binlog の中身は BINLOG 文で入っている(構文)。BINLOG 文の中身をさらに疑似 SQL にデコードして表示できる。
mysqlbinlog -vv -R --stop-never -S /var/tmp/test1.sock -uroot ""

binlog の動作モードで、組み合わせがいくつかあるので、要件は確認してからパターンを探すべし。

See also

  • MySQL 5.7 source tree の中に libbinlogstandalone が準備されている。
    • この前身として libbinlogevents というライブラリが、かつて MySQL labs で公開されていたらしい
    • さらにその昔は libreplication と呼ばれていたらしい。
    • libreplication の API は binlog API とも呼ばれていたらしい
    • で、libbinlogstandalone は、ソースからビルドするとライブラリが生成される。生成されるのだがインストールされない。パッケージでインストールではこれが入らないのが難点。
  • maxwell という java で動作するプログラムがある。binlog のストリームを json ストリームとして眺めることもできる。
  • python-mysql-replication
    • python ライブラリ
    • pymysql 依存
    • これに依存したプロジェクト多数
  • kodama
    • ruby 実装
  • binlog-parser
    • golang 実装
    • outdated
    • 動作させられなかった
  • ybinlogp
    • C 実装 make する
    • シンプルに binlog ファイルを読む機能のみ
    • テキスト出力も構造化されていない

Ubuntu での下ごしらえ

Ubuntu mysql-server パッケージでバイナリを準備するのが簡単。ただしパッケージ版は mysqld の書き込み先が AppArmor で制限されている。上記の例を実行するには、いったん解除するのが簡単。

systemctl stop apparmor
/etc/init.d/apparmor teardown