gmap mysql cachet_MySQL中binlog cache使用流程解惑

水平有限整理自己的学习笔记,如果有误请谅解。

最近老是看到有朋友报错如下:

ERROR 1197 (HY000): Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again

虽然错误提示非常明确,但是我还是对binlog cache的使用方式进行了学习整理下来,这部分也是我一直疑惑的地方,也希望通过本文接触读者的疑惑。

本文约定:

binlog cache:实际上就是参数binlog_cache_size指定的大小,它指定的是一段内存空间用于存储生成的binlog event,是事物级别的参数。

binlog cache 临时文件:实际上就是参数max_binlog_cache_size指定的大小,它指定是一个临时磁盘文件存储由于binlog cache不足溢出的binlog event,其名字由"ML"打头,是事物级别的参数。

binlog file:代表就是我们平时说的binglog 文件,由max_binlog_size指定大小。

binlog event:代表是各种各样的binlog中的记录比如MAP_EVENT/QUERY EVENT/XID EVENT/WRITE EVENT等。

本文源码版本:

percona 5.7.14

一、通常事物binlog event的写入流程

这里首先给出写入过程,让大家有一个大概的理解。

注意这个流程都是对于一个事物来讲的。一旦事物提交,binlog cache和binlog 临时文件都会释放掉,因为binlog已经固化到了binlog file。同时如果事物中包含多个DML语句,那么他们共享的一套的binlog cache和binlog 临时文件。

事物开启。

执行dml语句,在dml语句第一次执行的时候会分配内存空间binlog cache。

执行dml语句期间生成的event不断写入到binlog cache。

如果binlog cache的空间已经满了,则将binlog cache的数据写入到binlog临时文件,同时清空binlog cache。如果binlog临时文件的大小大于了max_binlog_cache_size的设置则抛错ERROR 1197 (HY000)。

事物提交,整个binlog cache和binlog临时文件数据全部写入到binlog file中进行固化,释放binlog cache和binlog临时文件。但是注意此时binlog cache的内存空间留用供下次事物使用,但是binlog临时文件被截断为0,保留文件描述符。其实也就是IO_CACHE(参考后文)保留,并且保留IO_CACHE中的分配的内存空间,和物理文件描述符。

断开连接,这个过程会释放IO_CACHE同时释放其持有的binlog cache内存空间以及持有的binlog 临时文件。

本文研究就是步骤3和步骤4的写入过程,和binlog cache以及binlog 临时文件的实现方式。同时本文不描述binlog_stmt_cache_size和max_binlog_stmt_cache_size的作用,因为他们和binlog_cache_size、max_binlog_cache_size参数的函数一致,只是存储是非事物语句的binlog event,但是在讨论数据结构的时候还是给出部分解释。

二、相关数据结构简介

binlog_cache_mngr类:

这个类中包含了两个cache实际上就是binlog cache和binlog stmt cache,如下:

binlog_stmt_cache_data stmt_cache;

binlog_trx_cache_data trx_cache;

其中包含一些方法用于访问这两个cache。同时将整个binlog event写入到binlog file的方法也在其中叫做flush,栈帧如下:

#0 binlog_cache_mngr::flush (this=0x7fff58ca17c0, thd=0x7fff58012930, bytes_written=0x7ffff0358918, wrote_xid=0x7ffff0358917)

at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:739

#1 0x0000000001857152 in MYSQL_BIN_LOG::flush_thread_caches (this=0x2e02c80, thd=0x7fff58012930) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8484

#2 0x0000000001857383 in MYSQL_BIN_LOG::process_flush_stage_queue (this=0x2e02c80, total_bytes_var=0x7ffff0358a88, rotate_var=0x7ffff0358a87,

out_queue_var=0x7ffff0358a78) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8546

#3 0x000000000185899f in MYSQL_BIN_LOG::ordered_commit (this=0x2e02c80, thd=0x7fff58012930, all=false, skip_commit=false)

at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:9189

#4 0x000000000185700c in MYSQL_BIN_LOG::commit (this=0x2e02c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值