一 简介:undo管理

二 各版本说明

 1 5.5 

    undo位置:默认ibdata1中,不支持独立表空间

   缺点:大事务可能造成ibdata1暴涨,只能dump导出导入或者从新搭建

  参数:rollback_segment(默认128个回滚段)

2 5.6

 undo位置:默认ibdata1中,支持独立表空间

 参数

   innodb_undo_logs(代替5.5的名字,默认128个回滚段)

   innodb_undo_directory 设置undo位置,默认当前文件夹

   innodb_undo_tablespaces 默认关闭,开启需要设置为1

 缺点:mysql5.6只支持初始化设置独立表空间,不可中途开启.而且也不能解决回收undo表空间问题.但是可以支持分布在不同磁盘,用来提高IO能力

 建议:不建议5.6开启独立undo空间,没什么意义

3 5.7

 undo位置:默认ibdata1中,支持独立表空间

 参数

  innodb_max_undo_log_size=1073741824

  innodb_undo_directory=./ 独立undo表空间路径 

  innodb_undo_log_truncate=OFF 支持truncate回收表空间,默认关闭

  innodb_undo_logs=128 128个回滚段

  innodb_undo_tablespaces=0 独立表空间,默认为0,需要设置>=2

  innodb_purge_rseg_truncate_frequency=128 purge undo轮询128次后,进行一次undo的truncate

4 注意点:

 1 mysql5.7同样是只支持初始化设置,不可中途开启

 2 truncate会进行清理undo文件的条件: 1 触发 max_undo_log阈值(undo tablespace超过1GB(参数innodb_max_undo_log_size来控制))

   2 存在至少一个可用的undo文件

   3 被清理对象皆为free,也即为事务不需要

 以上三点都达到时候才会触发truncate进行undo表空间收缩,由purge线程执行

5 注意点

    1 mysql为什么不支持中途开启独立undo

    据我分析和看淘宝周报分析,这与space_id有关,默认ibdata中的space_id=0,一旦中途开启,独立undo空间的space_id为1,系统需要为0,

    观察错误: Expected to open 1 undo tablespaces but was able to find only 0 undo tablespaces. Set the innodb_undo_tablespaces parameter to the correct value and retry. Suggested value is 0

    可以得知 为0

    2 尽量避免大事务,将大事务进行拆分

6 8.0的持续改进:

   1 默认开启独立undo表空间,更改undo表空间命名方式,默认大小为10M

   2 在8.0之前只能创建128个回滚段,而在8.0版本开始,每个Undo tablespace可以创建128个回滚段,也就是说,总共有innodb_rollback_segments * innodb_undo_tablespaces个回滚段。这个改变的好处是在高并发下可以显著的减少因为分配到同一个回滚段内的事务间产生的锁冲突

  3  Innodb_undo_truncate参数默认打开,会自动进行删除

  4  支持undo tablespace加密

  5  在8.0中直接在内存中为其创建单独的内存结构,这32个slot可以用于持久化的undo回滚段

  6  允许动态的增加undo tablespace的个数,也就是说可以动态调整innodb_undo_tablespaces。当调大该参数时,会去创建新的undo tablespace。但如果设小该值,则仅仅是不实用多出来的Undo tablespace,目前不会去主动删除它们