在查找到很多资料中,以下文章是 对于参数 innodb_undo_log_truncate 说明最为简明的一篇文章了,这里做一转载。
(原文: https://www.linuxidc.com/Linux/2017-05/143400.htm)

  1. MySQL 5.5时代的undo log
    在MySQL5.5以及之前,大家会发现随着数据库上线时间越来越长,ibdata1文件(即InnoDB的共享表空间,或者系统表空间)会越来越大,这会造成2个比较明显的问题:
    (1)磁盘剩余空间越来越小,到后期往往要加磁盘;
    (2)物理备份时间越来越长,备份文件也越来越大。

这是怎么回事呢?
原因除了数据量自然增长之外,在MySQL5.5以及之前,InnoDB的undo log也是存放在ibdata1里面的。一旦出现大事务,这个大事务所使用的undo log占用的空间就会一直在ibdata1里面存在,即使这个事务已经关闭。

那么问题来了,有办法把上面说的空闲的undo log占用的空间从ibdata1里面清理掉吗?答案是没有直接的办法,只能全库导出sql文件,然后重新初始化mysql实例,再全库导入。

  1. MySQL 5.6时代的undo log

MySQL 5.6增加了参数innodb_undo_directory、innodb_undo_logs和innodb_undo_tablespaces这3个参数,可以把undo log从ibdata1移出来单独存放。

下面对这3个参数做一下解释:

(1)innodb_undo_directory,指定单独存放undo表空间的目录,默认为.(即datadir),可以设置相对路径或者绝对路径。该参数实例初始化之后虽然不可直接改动,但是可以通过先停库,修改配置文件,然后移动undo表空间文件的方式去修改该参数;

(2)innodb_undo_tablespaces,指定单独存放的undo表空间个数,例如如果设置为3,则undo表空间为undo001、undo002、undo003,每个文件初始大小默认为10M。该参数我们推荐设置为大于等于3,原因下文将解释。该参数实例初始化之后不可改动;

(3)innodb_undo_logs,指定回滚段的个数(早期版本该参数名字是innodb_rollback_segments),默认128个。每个回滚段可同时支持1024个在线事务。这些回滚段会平均分布到各个undo表空间中。该变量可以动态调整,但是物理上的回滚段不会减少,只是会控制用到的回滚段的个数。

实际使用方面,在初始化实例之前,我们只需要设置innodb_undo_tablespaces参数(建议大于等于3)即可将undo log设置到单独的undo表空间中。如果需要将undo log放到更快的设备上时,可以设置innodb_undo_directory参数,但是一般我们不这么做,因为现在SSD非常普及。innodb_undo_logs可以默认为128不变。

  1. MySQL 5.7时代的undo log

那么问题又来了,undo log单独拆出来后就能缩小了吗?MySQL 5.7引入了新的参数,innodb_undo_log_truncate,开启后可在线收缩拆分出来的undo表空间。在满足以下2个条件下,undo表空间文件可在线收缩:

(1)innodb_undo_tablespaces>=2。因为truncate undo表空间时,该文件处于inactive状态,如果只有1个undo表空间,那么整个系统在此过程中将处于不可用状态。为了尽可能降低truncate对系统的影响,建议将该参数最少设置为3;

(2)innodb_undo_logs>=35(默认128)。因为在MySQL 5.7中,第一个undo log永远在系统表空间中,另外32个undo log分配给了临时表空间,即ibtmp1,至少还有2个undo log才能保证2个undo表空间中每个里面至少有1个undo log;

满足以上2个条件后,把innodb_undo_log_truncate设置为ON即可开启undo表空间的自动truncate,这还跟如下2个参数有关:

(1)innodb_max_undo_log_size,undo表空间文件超过此值即标记为可收缩,默认1G,可在线修改;

(2)innodb_purge_rseg_truncate_frequency,指定purge操作被唤起多少次之后才释放rollback segments。当undo表空间里面的rollback segments被释放时,undo表空间才会被truncate。由此可见,该参数越小,undo表空间被尝试truncate的频率越高。

  1. MySQL 5.7的undo表空间的truncate示例

(1) 首先确保如下参数被正确设置:

为了实验方便,我们减小该值

innodb_max_undo_log_size = 100M
innodb_undo_log_truncate = ON
innodb_undo_logs = 128
innodb_undo_tablespaces = 3

为了实验方便,我们减小该值

innodb_purge_rseg_truncate_frequency = 10

(2) 创建表:
mysql> create table t1( id int primary key auto_increment, name varchar(200));
Query OK, 0 rows affected (0.13 sec)

(3)插入测试数据
mysql> insert into t1(name) values(repeat(‘a’,200));
mysql> insert into t1(name) select name from t1;
mysql> insert into t1(name) select name from t1;
mysql> insert into t1(name) select name from t1;
mysql> insert into t1(name) select name from t1;

这时undo表空间文件大小如下,可以看到有一个undo文件已经超过了100M:

-rw-r----- 1 mysql mysql 13M Feb 17 17:59 undo001
-rw-r----- 1 mysql mysql 128M Feb 17 17:59 undo002
-rw-r----- 1 mysql mysql 64M Feb 17 17:59 undo003
此时,为了,让purge线程运行,可以运行几个delete语句:

mysql> delete from t1 limit 1;
mysql> delete from t1 limit 1;
mysql> delete from t1 limit 1;
mysql> delete from t1 limit 1;

再查看undo文件大小:

-rw-r----- 1 mysql mysql 13M Feb 17 18:05 undo001
-rw-r----- 1 mysql mysql 10M Feb 17 18:05 undo002
-rw-r----- 1 mysql mysql 64M Feb 17 18:05 undo003
可以看到,超过100M的undo文件已经收缩到10M了。

MySQL5.7新特性——在线收缩undo表空间 (转载)相关推荐

  1. mysql数据库管理-innode undo表空间

    Innodb独立的undo tablespace 在MySQL5.6中开始支持把undo log分离到独立的表空间,并放到单独的文件目录下:这给我们部署不同IO类型的文件位置带来便利,对于并发写入型负 ...

  2. MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间

    背景 Innodb使用undo log来实现MVCC,这意味着如果一个很老的事务长时间不提交,那么新产生的undo log都无法被及时清理掉.在MySQL 5.5及之前版本中,undo log是存储在 ...

  3. Oracle 12c 新特性之 temp undo

    Oracle 12c R1 之前,临时表生成的undo记录是存储在undo表空间里的,通用表和持久表的undo记录也是类似的.而在 12c R12 的临时 undo 功能中,临时 undo 记录可以存 ...

  4. Slide:11g新特性-在线实施补丁online patching

    11g新特性 在线实施补丁online patching View more documents from Maclean Liu 转载于:https://blog.51cto.com/maclean ...

  5. MySQL5.6 新特性之GTID【转】

    转自 MySQL5.6 新特性之GTID - jyzhou - 博客园 http://www.cnblogs.com/zhoujinyi/p/4717951.html 背景: MySQL5.6在5.5 ...

  6. 自动undo表空间模式下切换新的undo表空间

       在undo自动表空间模式下切换新的undo表空间后都需要将老的undo表空间给drop,可是由于切换时由于活动事物并未完全结束,    于是导正drop旧的undo表空间时报"ORA- ...

  7. 翻译mosHow to Switch to a New Undo Tablespace (文档 ID 1951695.1)使用新的undo表空间和删除旧的表空间

    使用新的undo表空间和删除旧的表空间 database 9.2.0.1  and later os   every platform 查看当前undo_tablespace SQL> show ...

  8. 万答#18,MySQL8.0 如何快速回收膨胀的UNDO表空间

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 背 ...

  9. oracle 10g磁盘管理,Oracle 10g UNDO表空间过大导致磁盘空间不足的解决

    在Oracle 10g数据库的应用中,出现了UNDO表空间过大导致磁盘空间不足而崩溃的现象(ORA-30036: unable to extend segment by 8 in undo table ...

最新文章

  1. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
  2. LUA脚本调用C场景,使用C API访问脚本构造的表
  3. MySQL正则表达式的使用
  4. CentOS 6.2 中文
  5. 多线程java_敞开心扉,一起聊聊Java多线程
  6. 【实践】地理探测器GeoDetector软件使用
  7. 【三维目标检测】PointRCNN(二)
  8. PyCharm的安装和破解
  9. 手机安装W ndows7镜像,Windows7ISO镜像安装系统教程
  10. SDelete v2.04安全地擦除磁盘未分配部分中存在的任何文件数据(包括已经删除或加密的文件)
  11. NPOI word中插入图片
  12. PS CC2018替换/修改图片上的文字内容
  13. 超好用的UWP应用推荐
  14. 免费域名邮箱如何申请?怎么给国外发邮件?
  15. 计算机专业博士阶段研究方向,国内计算机专业博士研究方向
  16. D3.js中文API
  17. 存储过程(数组参数、for循环、拼接的动态sql游标、merge into)
  18. 史密斯热水器 保养灯亮闪烁
  19. 罗斯柴尔德起家的时代背景
  20. git配置中的CRLF、LF、CR

热门文章

  1. mysql-增删改(DML)
  2. 下载华为交换机MIB参考文件并使用snmpwalk获取OID信息
  3. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
  4. 深入理解Fabric环境搭建的详细过程(转)
  5. JMeter 监听器之保存响应到文件
  6. 使用SDWebImage淡入淡出的方式加载图片
  7. CTime,Systemtime的比较还有转换成日期格式。
  8. WPF Tile=” 变量 UI 双向绑定”x:Class=Problem/
  9. D04——C语言基础学PYTHON
  10. 美团笔试最大矩形面积