MySQLのバイナリログ
第165回 MySQLの圧縮の詳細ですでに触れられているように、MySQL 8.
binlog_transaction_compressionについて
binlog_
mysql> SHOW VARIABLES LIKE 'binlog_transaction_compression%'; +-------------------------------------------+-------+ | Variable_name | Value | +-------------------------------------------+-------+ | binlog_transaction_compression | OFF | | binlog_transaction_compression_level_zstd | 3 | +-------------------------------------------+-------+ 2 rows in set (0.02 sec) mysql> SET GLOBAL binlog_transaction_compression = 1; Query OK, 0 rows affected (0.00 sec)
binlog_
さらに、この機能で圧縮されたトランザクションペイロードは、レプリケーション先でも圧縮されたままリレーログに書き込まれるため、レプリカ側のストレージ使用量も節約することができます。
mysqlbinlogを使用して出力したバイナリログを調べると、圧縮されたトランザクションペイロードはコメント部分に明記されており、その内容を確認することができます。
#231004 0:46:05 server id 39355 end_log_pos 557 CRC32 0xcea35168 Transaction_Payload payload_size=206 compression_type=ZSTD uncompressed_size=706
# Start of compressed events!
# at 557
...
COMMIT/*!*/;
# End of compressed events!
binlog_transaction_compression_level_zstd
binlog_
performance_schemaのbinary_log_transaction_compression_stats
performance_
mysql> SELECT * FROM binary_log_transaction_compression_stats\G *************************** 1. row *************************** LOG_TYPE: BINARY COMPRESSION_TYPE: ZSTD TRANSACTION_COUNTER: 217 COMPRESSED_BYTES_COUNTER: 88750 UNCOMPRESSED_BYTES_COUNTER: 119380 COMPRESSION_PERCENTAGE: 26 FIRST_TRANSACTION_ID: 7d2772a5-8987-11e8-a6a6-0201858272ab:711970 FIRST_TRANSACTION_COMPRESSED_BYTES: 199 FIRST_TRANSACTION_UNCOMPRESSED_BYTES: 218 FIRST_TRANSACTION_TIMESTAMP: 2023-10-04 00:18:48.577526 LAST_TRANSACTION_ID: 7d2772a5-8987-11e8-a6a6-0201858272ab:712195 LAST_TRANSACTION_COMPRESSED_BYTES: 237 LAST_TRANSACTION_UNCOMPRESSED_BYTES: 706 LAST_TRANSACTION_TIMESTAMP: 2023-10-04 00:46:05.816707
検証
実際にmysqlslapを使用して、binlog_
time mysqlslap -h 127.0.0.1 -u root -p --auto-generate-sql --auto-generate-sql-add-autoincrement --number-int-cols=5 --number-char-cols=5 --iterations=10 --concurrency=1 --auto-generate-sql-write-number=1000
結果は以下の通りです。
binlog_ |
binarylog file size | exec time |
---|---|---|
OFF | 17MB | 16. |
ON | 9. |
17. |
このワークロードの条件下でbinlog_
注意:実際のワークロードの条件や状況は異なる可能性があるため、この結果が常に適用されるわけではありませんので注意してください。
注意すること
このオプションは非常に便利ですが、利用する際に考慮すべき点がいくつかあります。
- CPUの負荷
- binlogの圧縮や解凍にはCPUリソースが必要です。この設定を有効にした後、CPUの使用状況を確認して、過剰な負荷がかかっていないかをチェックしましょう。
- ツールの対応状況
- binlogを扱うツールを使用する場合、そのツールがbinlogの圧縮に対応しているかを事前に確認する必要があります。
- ROWベースのバイナリロギング形式にのみ有効
- binlog_
transaction_ compressionが適用されるのは、binlog_ formatがROWベースの場合のみです。STATEMENTベースでbinlogを出力している場合、この設定は有効になりません。 - mysqlbinlogのバージョン
- mysqlbinlogコマンドでbinlogの内容を確認する際は、binlog圧縮に対応しているバージョンを使用する必要があります。MySQL Serverのバージョンに合わせてmysqlbinlogのバージョンも選択すれば、問題は生じません。
まとめ
binlog_
利用する際は、公式ドキュメントのバイナリログトランザクション圧縮も確認のうえ、利用してみてください。