背景

Innodb使用undo log来实现MVCC,这意味着如果一个很老的事务长时间不提交,那么新产生的undo log都无法被及时清理掉。在MySQL 5.5及之前版本中,undo log是存储在ibdata中。从5.6开始可以使用独立的undo log表空间来存储undo。但是直到5.6,一旦undo log膨胀,依然没有任何办法为其 “减肥”。因此我们经常看到ibdata被膨胀到几十上百G。

改进

在MySQL5.7.5版本中终于增加了这个众望所归的功能,实现了在线truncate undo log的功能。对应的changeling entry如下:

InnoDB: You can now truncate undo logs that reside in undo tablespaces. This feature is enabled using the innodb_undo_log_truncate configuration option. For more information, see Truncating Undo Logs That Reside in Undo Tablespaces.

在能够使用该特性之前,需要先打开独立undo表空间,注意现在只能在install db的时候才能开启,因为在初始化阶段是写死占用了最小的几个space id的。这种实现方式。。。只能无限吐槽了。

有几个参数控制undo tablespace:

innodb_undo_directory:undo文件的存储目录。
innodb_undo_tablespaces:undo tablespace的个数,实现在线truncate undo,需要大于等于2,因为在truncate一个undo log文件时,要保证另外一个是可用的,这样就无需停止业务了。
innodb_undo_logs:undo回滚段的数量需要大于34。原因是1~32个回滚段会被临时表占用(5.7针对临时表做了大量优化),第33、34分配给undospace1 和undospace2。

这里有个比较有意思的问题,由于undo 回滚段总是从第一个undospace分配,如果每次从1开始,每次重启递增innodb_undo_logs,所有的回滚段都会被分配到第一个undo space,在truncate第一个undo space时,将无可用的undo回滚分配给正常的用户事务。

innodb_purge_rseg_truncate_frequency:用于控制purge回滚段的频度。 Innodb Purge操作的协调线程每隔这么多次purge事务分发后,就会触发一次History purge,并检查当前的undo log 表空间状态是否会触发truncate。
innodb_max_undo_log_size:控制最大undo tablespace文件的大小,超过这个阀值时才会去尝试truncate。truncate后的大小默认为10M。
innodb_undo_log_truncate:用于打开/关闭undo log 在线truncate特性,可动态调整。

undo log 的truncate操作由purge 协调线程发起,在truncate 某个undo log 表空间的过程中,保证有一个可用的undo log tablespace能提供给用户使用,从而实现所谓的在线truncate。

当选定一个需要truncate的undo log space时,需要检查其是否是可释放的,也就是说是否还有活跃的事务可能访问其中的回滚段。如果没有,就将该tablespace中的回滚段设置为不可分配,然后对undo log space文件进行truncate,并重新初始化到10M,初始化文件头等一系列操作。

这里引入了比较有意思的方法来保证truncate的原子性,即在开始truncate时,创建一个独立的文件,命名为undo_<space_id>_trunc.log,在做完truncate操作后,删除文件。如果在中间发生crash,崩溃恢复时发现该文件,会继续完成truncate操作。

更具体的参考WL#6965 及对应补丁Rev:8615

MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间相关推荐

  1. MySQL内核月报 2014.09-MySQL· 捉虫动态·auto_increment

    背景: Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引用). Innodb表定义中处理主键的逻辑是: 1.如果表定义了主键,就使用主键唯一定位一 ...

  2. MySQL内核月报 2014.10-MySQL· 捉虫动态·binlog重放失败

    背景 在 MySQL 日常维护中,要回滚或者恢复数据,我们经常会用 binlog 来在数据库上重放,执行类似下面的语句: mysqlbinlog mysql-bin.000001 | mysql -h ...

  3. MySQL内核月报 2014.08-TokuDB·社区八卦·TokuDB团队

    第一期先介绍下TokuDB团队吧. TokuDB自从开源后(更赞的是开源了所有的commits),逐渐被大家所熟悉,MariaDB 5.5系列和Percona Server 5.6的GA版本中,都以p ...

  4. MySQL内核月报 2015.01-MySQL · 捉虫动态· InnoDB自增列重复值问题

    问题重现 先从问题入手,重现下这个bug 这里我们关闭mysql,再启动mysql,然后再插入一条数据 我们看到插入了(2,2),而如果我没有重启,插入同样数据我们得到的应该是(4,2). 上面的测试 ...

  5. mysql内核架构_热血江湖mysql内核技术之门派数据库表结构说明

    小编之前已经多次和大家说过了一个概念,不管你打算架设的是什么游戏什么版本都必须熟悉它的数据库整体结构.今天小编要说的是热血江湖私服游戏中最难的MYSQL内核技术,对于玩家来说MYSQL技术无疑是最难的 ...

  6. mysql server id为0_MySQL内核月报 2014.12-MySQL· 答疑释惑·server_id为0的Rotate-阿里云开发者社区...

    背景 在MySQL的M-S结构里面,event是binlog日志的基本单位.每个event来源于主库,每个Event都包含了serverid,用于表示该event是哪个实例生成的. 在5.6里面,细心 ...

  7. MySQL内核月报 2015.02-MySQL · 答疑释惑· InnoDB丢失自增值

    背景 在上一期的月报中,我们在InnoDB自增列重复值问题 中提到,InnoDB 自增列在重启后会丢失,因为MySQL没有持久化自增值,平时是存在内存表对象中的.如果实例重启的话,内存值丢失,其初始化 ...

  8. MySQL内核月报 2015.01-MySQL · 捉虫动态· replicate filter 和 GTID 一起使用的问题

    问题描述 当单个 MySQL 实例的数据增长到很多的时候,就会考虑通过库或者表级别的拆分,把当前实例的数据分散到多个实例上去,假设原实例为A,想把其中的5个库(db1/db2/db3/db4/db5) ...

  9. 阿里内核月报2014年3月

    目前Linux内核急需的一项功能是在线打补丁的特性.此前被Oracle收购的ksplice一度是Linux上唯一的解决方案.但是在被Oracle收购后,ksplice就闭源了,并且成为了Oracle ...

最新文章

  1. debian linux忘记密码,debian ubuntu linux 忘记root密码的重置方法
  2. 一、如何实现python导入另一个文件中的模块(方法)?
  3. 修改服务器端的访问模式,ftp服务器端 修改主动模式
  4. 无图形界面下控制台操作Virtualbox
  5. VS条件断点学习总结
  6. xgboost python windows编译问题
  7. Linux/Windows系统内核性能调优
  8. 作者:刘松灵(1988-),男,就职于中国人民银行征信中心数据部
  9. maven项目中整合grunt构建工具(二)-js合并、压缩技术
  10. 如何在一家大公司里受到重用
  11. 小程序mysql+php测试,莲米粒是一个基于PHP+MySQL+微信小程序技术栈
  12. 人脸重建速览,从3DMM到表情驱动动画
  13. deepfacelab安卓版_deepfacelab
  14. python爬百度贴吧_python爬虫-爬取百度贴吧帖子加图片
  15. AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】
  16. 邮件传输的过程都看不懂。那我走(狗头)
  17. W7系统如何增大C盘空间(动态磁盘)
  18. 阿里巴巴数学竞赛详细解答(据说晋级的直接P8岗)
  19. SAP那些事-职业篇-1-想做顾问如何入门
  20. 核电站仪控系统智能测试平台设计

热门文章

  1. ReactOS 0.0.21从开机启动,到加载驱动的过程
  2. 拉格朗日乘数法学习笔记
  3. 网络丢包问题排查总结
  4. 【实习】今日头条【抖音火山】后台开发实习生
  5. toolbar.netcraft.com查询域名等信息
  6. ArcGIS Runtime for .Net Quartz开发探秘(三):承接来自GIS服务器的服务
  7. [改善Java代码]养成良好习惯,显式声明UID
  8. 如何安装,卸载eclipse中的ADT,或者更新ADT
  9. AMD为何要选择捆绑中国市场?
  10. 使用 AppFuse 的七个理由