共计 2073 个字符,预计需要花费 6 分钟才能阅读完成。
1、MySQL5.5 的版本上
InnoDB undo 是放在系统表空间即 ibdata file 文件中,这样如果有比较大的事务(即需要生成大量 undo 的),会撑大 ibdata 数据文件,虽然空间可以重用,但文件大小不能更改。
关于回滚段的,只有这个主要的参数,用来设置多少个 rollback segment。
mysql> show global variables like ‘%rollback_segment%’;
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| innodb_rollback_segments | 128 |
+—————————-+——-+
2.mysql 5.6 的 undo 段回收
undo 段的数据是放到共享表空间中, 如果数据库有大量插入或者更新会不断写入大量的 undo log. 此时的 undo log 不能自动回收剩余的空间.mysql 5.6 是在安装数据库之前修改 undo 的参数, 将 undo log 从共享表空间分离出来, 安装后就不能修改,mysql 5.7 可以用动态参数进行调整.
(1). 修改 my.cnf 启动参数文件
vim /etc/my.cnf
innodb_undo_directory = /data/mysql/mysql9001/undolog – 指定存放的目录,默认是数据目录
innodb_undo_logs = 128 – 指定回滚段 128K
innodb_undo_tablespaces = 4 – 指定有多少个 undo log 文件
(2). 初使化 mysql
(3). 重启 mysql 服务
spacer.gif
3.mysql 5.7 动态修改
声明: 在线回收表空间的功能是建立再独立 undo 表空间的基础上的,如果还是用的系统共享表空间 ibdata1,则不支持在线回收机制。
vim /data/mysql/mysql9001/my.cnf
innodb_undo_log_truncate – 参数设置为 1, 即开启在线回收 (收缩)undo log 日志文件, 支持动态设置。
innodb_undo_tablespaces – 参数必须大于或等于 2, 即回收(收缩) 一个 undo log 日志文件时, 要保证另一个 undo log 是可用的。
innodb_undo_logs – 回滚段的数量, 至少大于等于 3, 默认 128。
innodb_max_undo_log_size – 当超过这个阀值 (默认是 1G), 会触发 truncate 回收(收缩) 动作,truncate 后空间缩小到 10M。
innodb_purge_rseg_truncate_frequency – 控制回收 (收缩)undo log 的频率.undo log 空间在它的回滚段没有得到释放之前不会收缩,
想要增加释放回滚区间的频率, 就得降低 innodb_purge_rseg_truncate_frequency 设定值。
实验验证:
参数设置
update 230w 条记录的一个表
观察 error.log, 回收了独立 undo 表空间
回收前的独立 undo 表空间文件的大小
回收后大小
注意事项:
undo 的 truncate 主要由下面两个参数控制:innodb_purge_rseg_truncate_frequency,innodb_undo_log_truncate。
1. innodb_undo_log_truncate 是开关参数。
2. innodb_purge_rseg_truncate_frequency 默认 128,表示 purge undo 轮询 128 次后,进行一次 undo 的 truncate。
当设置 innodb_undo_log_truncate=ON 的时候,undo 表空间的文件大小,如果超过了 innodb_max_undo_log_size,就会被 truncate 到初始大小,但有一个前提,就是表空间中的 undo 不再被使用。
其主要步骤如下:
1. 超过大小了之后,会被 mark truncation,一次会选择一个
2. 选择的 undo 不能再分配新给新的事务
3. purge 线程清理不再需要的 rollback segment
4. 等所有的回滚段都释放了后,truncate 操作,使其成为 install db 时的初始状态。
默认情况下,是 purge 触发 128 次之后,进行一次 rollback segment 的 free 操作,然后如果全部 free 就进行一个 truncate。
但 mark 的操作需要几个依赖条件需要满足:
1. 系统至少得有两个 undo 表空间,防止一个 offline 后,至少另外一个还能工作
2. 除了 ibdata 里的 segment,还至少有两个 segment 可用
3. undo 表空间的大小确实超过了设置的阈值
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139143.htm