MySQL purge log简单吗?

简单: purge log的功能很简单,purge master logs to 指定一个binlog,然后删除之前的文件系统上的binlog文件,并更新binlog.index文件。

复杂: 需要保证purge的原子操作吗, 怎么保证, 有崩溃恢复吗?

之前没有读过代码,想到代码实现上会遇到的问题:

问题1:   如果删除文件比较多,怎么平衡加锁的时间?
问题2:   怎么保证os文件删除和index文件的同步?
问题3:   怎么保证index文件写入是完整的?
问题4:   如果index更新了,文件没有删除,或者相反的情形发生会怎么样?
问题5:   最后如何清理index文件的前面n个字节,然后更改文件大小?

总体来说,也就是,在没有使用事务引擎来保证的一系列操作(purge log包括了多步操作),如何保证ACID或者进行了什么取舍?

1. purge log的测试:

  purge master logs to 'binlog.000012';

2. 主要的数据结构:

typedef struct st_log_info
{
char log_file_name[FN_REFLEN];
my_off_t index_file_offset, index_file_start_offset;
my_off_t pos;
bool fatal;
mysql_mutex_t lock;
}

3. purge的简略步骤:

  

step 1: 为命令行输入的binlog.000012补充目录成一个绝对路径文件。
       函数: MYSQL_BIN_LOG::make_log_name
      根据当前的log_file_name, 计算目录的长度,最后生成完整的to_log.

step 2: 在binlog.index文件中查找binlog.000012文件。
      函数: find_log_pos: 如果没有找到这个文件,就报错。比如文本文件格式不对,就无法删除。

step 3: 初始化index 文件的io cache。最终找到binlog.000012在index的位置。

step 4: 创建purge index临时文件
      创建binlog.~rec~ 保存要删除的binlog文件。

step 5: 重新init index_file, 从开始位置读取。匹配每一个binlog,写入到purge index file。

step 6: 写入purge index file,并刷新
    1. 先flush io把在内存中的数据写入文件系统标准IO缓存。
    2. sync purge_index_file, 使用fdatasync。持久化到磁盘上。

step 7: 更新index文件。
      1. mysql_file_seek,
      2. mysql_file_read,
      3. mysql_file_seek,
      4. mysql_file_write
        使用 1->2->3->4的时序删除文件的前n个字节。
      5. ftruncate改变index文件的大小

step 8: 删除os上的文件,并删除purge index log临时文件

4. 现在再来看看这些问题:

问题1:
    binlog.index文件是share的,purge的整个过程如果一直锁住,那主库这时要flush log就无法获取锁。
    所以使用类似copy on write的策略,释放锁后,异步慢慢删除os上的文件。

    即保证了index文件的加锁完整写入,又没有长时间影响主库切换binlog日志。

问题2:
    因为异步化了os文件删除动作,这里无法保证index文件记录删除和os文件删除的同步。这里依赖purge index file
    来完成同步和崩溃恢复。

问题3: index文件的写入是无法保证一行是一个完整的binlog文件,这个依赖文件系统。
    但index文件是文本文件,当purge解析出错的时候,运维是可以修改这个文件来修复的。

    注:如果是二进制文件,这样取舍可行吗,恐怕要使用事务引擎来保证了。

问题4:
    1. 如果index文件更新了,os文件没有删除
      当MySQL crash恢复的时候,会读取purge index file继续删除
    2. 如果文件删除,index文件没有更新
      从上面的步骤上看,不允许这中情况发生

问题5:
    文件删除前面n字节的问题,本身可以使用另外一种策略,新建一个表,copy数据,rename。
    但binlog.index是share的,不允许在线rename,所以使用步骤7的过程,在一个file handler上完成。

取舍: index file作为MySQL binlog文件的数据字典,首先要保证其数据的一致性,而os的文件是否能够删除可以进行取舍。

不知道实现的时候觉得命令很简单。

在想那些实现问题的时候,觉得又有点复杂。

看了源码后,觉得是自己又想复杂了。

MySQL purge log简单吗的更多相关文章

  1. 谁记录了mysql error log中的超长信息

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

  2. 谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

  3. MySQL redo log 与 binlog 的区别

    MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...

  4. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  5. Linux安装MariaDB(Mysql)和简单配置 mariadb

    Linux安装MariaDB(Mysql)和简单配置 1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动Ma ...

  6. MySQL主从同步简单介绍&配置

    介绍: 现在mysql集群基本上都是使用一主多从方式,实现读写分离(主库写.从库读).负载均衡.数据备份,以前只是使用从未配置过,今天简单配置一下! mysql主从复制是通过binary log日志实 ...

  7. MySQL主从复制的简单搭建

    @ 目录 1.MySQL一主一从的简单搭建 1.1.主从复制简介 1.2.MySQL主从复制简介 1.3.主从复制的架构 1.4.前期准备 1.5.主要配置实现 1.5.1.测试环境 1.5.2.配置 ...

  8. mysql general log日志

    注:应一直出现http://www.cnblogs.com/hwaggLee/p/6030765.html文章中的问题 故mysql general log日志.查看具体是什么命令导致的. 打开 ge ...

  9. PHP连接局域网MYSQL数据库的简单实例

    PHP连接局域网MYSQL数据库的简单实例 [php] view plaincopy <?PHP /** * php连接mysql数据库 * by www.jbxue.com */ $conn= ...

随机推荐

  1. GDI+中发生一般性错误(转载)

    在开发.NET应用中,使用 System.Drawing.Image.Save 方法而导致“GDI+ 中发生一般性错误”的发生,通常有以下三种原因:1. 相应的帐户没有写权限.解决方法:赋予 NETW ...

  2. Codevs 3289 花匠 2013年NOIP全国联赛提高组

    3289 花匠 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 花匠栋栋种了一排花,每株花都 ...

  3. C++中map用法

    /************************************************************************** Map的特点: 1.存储Key-value对* ...

  4. 九度OJ 1547 出入栈 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1547 题目描述: 给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或者入栈. 要求在操作序列的 ...

  5. read/write数据读写传输方式(转)

    前言 笔者本打算撰写一篇讲解标准I/O(缓存I/O)的博文,但是发现已经有网友做过同样的工作,并且工作质量上乘,特转载于此. 原文地址http://lenky.info/archives/2012/0 ...

  6. PHP 类和继承

    //定义一个超类 //public 和 protectd属性和方法可以继承,private不可继承. class A{ public $a =0; private $b = 1; protected ...

  7. 代C语言上机实践

    这已经是开学第十二周了,个人感觉严老师教的这批学生效果不是很好,有的竟然毫不知道main函数前边的 int是做什么的.只知按照书本上给的样例程序一个字一个字的敲到编译器中,然后点击运行.有错误也不知道 ...

  8. AVAudioRecorder 录制音频

    AVFoundation 中使用AVAudioRecorder 类添加音频录制功能是非常简单的, AVAudioRecorder构建与Audio Queue Services之上是一个功能强大且代码简 ...

  9. 51nod贪心算法入门-----活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 ...

  10. CentOS6.4 安装JDK

    1.下载JDK,这里用的是jdk-7u65-linux-x64.tar.gz,请到官网上下载. 2.清除默认的JDK,yum remove java 3.解压文件 tar -xzf jdk-7u65- ...