降低MySQL Binlog存储占用的方法(不调整expire时间)
在不调整expire_logs_days
参数的前提下,可以通过以下几种方式降低binlog的存储空间占用:
1. 调整binlog格式
SET GLOBAL binlog_format = 'ROW'; -- 或 'MIXED'
STATEMENT
格式在某些情况下会产生更多日志ROW
格式对于某些操作更节省空间(但并非所有情况)
2. 压缩binlog
MySQL 8.0+支持binlog压缩:
SET GLOBAL binlog_transaction_compression = ON;
SET GLOBAL binlog_transaction_compression_level_zstd = 3; -- 1-22,默认3
3. 减少写入量
- 优化事务大小:将大事务拆分为小事务
- 避免不必要的
autocommit=0
的长事务 - 减少DDL操作频率
4. 调整binlog_row_image
对于ROW格式,可以调整:
SET GLOBAL binlog_row_image = 'MINIMAL'; -- 只记录变更的列和被索引引用的列
5. 定期手动清理
虽然不调整过期时间,但可以手动清理:
PURGE BINARY LOGS TO 'mysql-bin.000123'; -- 删除指定文件之前的所有binlog
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
6. 调整binlog_cache_size
SET GLOBAL binlog_cache_size = 32768; -- 根据实际情况调整
7. 检查并优化应用
- 减少无用的UPDATE操作(如更新相同值)
- 避免全表更新
注意事项
- 修改全局变量前评估对业务的影响
- 生产环境变更建议在低峰期进行
- 某些设置需要重启MySQL才能永久生效