MySQL: 对超长blob列的redo log限制

我们知道,Innodb使用固定长度的N个iblog文件来存储redo log,文件空间可以被复用。这些被复用的空间redo需要保证已经做了checkpoint。

假定我们的iblog大小为1G,如果我们更新一个非常大的字段,就有可能覆盖掉未checkpoint的redo log,因为Innodb并没有根据其可能产生的log长度来判断redo log空间是否够用。而只是保证会预留一定比例的redo log空间。详细见bug链接:http://bugs.mysql.com/bug.php?id=69477

在MySQL 5.6的最新版本(5.6.22)中,对blob列做了限制: 当redo log的大小超过 (innodb_log_file_size * innodb_log_files_in_group)的十分之一时,就会给应用报错,这可能会带来不兼容问题,用户会发现,早期版本用的好好的SQL,在最新版本的5.6里居然跑不动了。。。。

 

函数btr_check_blob_limit用于计算是否满足限制,在为大记录更新写redo之前,需要确认是否超出限制,超出会返回错误码DB_TOO_BIG_RECORD,用户客户端会接受到错误信息。

 

对应代码(注意, MySQL上游代码已经全面迁移到github啦,小伙伴们再也不用忍受launchpad的龟速了):
git show 5a483ad47c7af481d10ad926857f805d9cd2fab6
git show 437f7a88dd5889cb227a113bb138186eda56660f

 

而在5.7.5版本中,则没有使用5.6的限制,其核心思路是每操作4个外部存储页,就检查一次redo log是否足够用,如果不够,就会推进checkpoint的lsn。当然具体的实现比较复杂,感兴趣的参考如下:
git show  f88a5151b18d24303746138a199db910fbb3d071  (主要)
git show 79c2bbce26bfe5093d7a5e424b539a9873123fed
git show 993caa16403fe827a30ac8be0306aeda93e51046

原创文章,转载请注明: 转载自Simple Life

本文链接地址: MySQL: 对超长blob列的redo log限制

Post Footer automatically generated by wp-posturl plugin for wordpress.


Comments

  • a thought by jusonalien

    想必 博主是数据库方向的达人,本弱菜为计算机专业大二学生一枚,专业方向分流到了数据库方向,想请教博主如何入门数据库?希望能够得到您的指点~

    Reply

    • a thought by zhaiwx1987

      就关系型数据库而言,第一,理论基础,其实大学的课程 如果能熟透的话基本差不多,现在的关系数据库理论几十年没变了;第二,找个开源数据库代码看,看如何实现的,postgre是个非常好的学习的数据库,代码写的很易懂,注释丰富; 第三,参与修改代码,加入感兴趣的数据库社区。 大概就这些啦。

      Reply

Leave a Reply

Your email address will not be published. Name and email are required


Current month ye@r day *