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 の動作モードで、組み合わせがいくつかあるので、要件は確認してからパターンを探すべし。
- SBR / RBR
- GTID : 解説
See also
- MySQL 5.7 source tree の中に
libbinlogstandalone
が準備されている。- この前身として
libbinlogevents
というライブラリが、かつて MySQL labs で公開されていたらしい。 - さらにその昔は libreplication と呼ばれていたらしい。
-
libreplication
の API は binlog API とも呼ばれていたらしい。 - で、
libbinlogstandalone
は、ソースからビルドするとライブラリが生成される。生成されるのだがインストールされない。パッケージでインストールではこれが入らないのが難点。
- この前身として
-
maxwell という java で動作するプログラムがある。binlog のストリームを json ストリームとして眺めることもできる。
- Java
- 内部的には mysql-binlog-connector-java で接続している。
-
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