MySQL binlog purge流程

我们时常在mysql binlog过大的时候,会执行binlog的purge指令来减小binlog占用的磁盘空间,那么它的实现大概是如何实现的呢?

首先我们理一下mysql的实现模块,譬如mysql-bin.00000x的,都是binlog数据文件,存储着binlog的实体数据;还有一个是binlog的索引文件,一般名称为mysql-bin.index,存储着binlog文件列表:

./mysql-bin.000001
./mysql-bin.000002

当我们执行purge binlog指令的时候,我们假设是以purge某个文件之前的binlog文件为例,mysql按如下的流程进行处理:

  • 首先,上binlog的索引锁,在purge的流程中,不能有类似于新的replication连接,不然会造成binlog文件在purge过程中被别的线程占用
  • 创建purge index file,这个文件主要作用在于记录需要purge的binlog文件列表
  • 遍历binlog文件,直到找到了对应的binlog文件,亦或者是某个binlog文件被别的线程占用了未知。其中未被占用的文件将被记录到上一步中的purge index file
  • 刷新purge index file,让其落盘
  • mysql binlog index file中删除purge index file的部分,这里mysql做了原子处理,即先创建一个crash mysql binlog index file,其中记录着最终移除purge index file后的内容,然后将crash mysql binlog index file重命名为binlog索引文件,确保这里故障不会影响索引文件的合法性
  • 删除purge index file中记录的被purge的文件
  • 关闭purge index file
共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day