视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL5.7临时表空间如何玩才能不掉坑里详解
2020-11-09 20:23:35 责编:小采
文档


导读

MySQL 5.7的目标是成为发布以来最安全的MySQL服务器,其在SSL/TLS和全面安全开发方面有一些重要的改变。

MySQL 5.7起支持临时表空间,但个别时候也可能会踩坑的。

MySQL 5.7起,开始采用的临时表空间(和的undo表空间不是一回事哟),命名ibtmp1文件,初始化12M,且默认无上限。

选项 innodb_temp_data_file_path 可配置临时表空间相关参数。

innodb_temp_data_file_path = ibtmp1:12M:autoextend

临时表空间的几点说明

  • 临时表空间不像普通InnoDB表空间那样,不支持裸设备(raw device)。
  • 临时表空间使用动态的表空间ID,因此每次重启时都会变化(每次重启时,都会重新初始化临时表空间文件)。
  • 当选项设置错误或其他原因(权限不足等原因)无法创建临时表空间时,mysqld实例也无法启动。
  • 临时表空间中存储这非压缩的InnoDB临时表,如果是压缩的InnoDB临时表,则需要单独存储在各自的表空间文件中,文件存放在 tmpdir(/tmp)目录下。
  • 临时表元数据存储在 INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO 视图中。
  • 有时执行SQL请求时会产生临时表,极端情况下,可能导致临时表空间文件暴涨,帮人处理过的案例中最高涨到快300G,比以前遇到的 ibdata1 文件暴涨还要猛…

    临时表使用的几点建议

  • 设置 innodb_temp_data_file_path 选项,设定文件最大上限,超过上限时,需要生成临时表的SQL无法被执行(一般这种SQL效率也比较低,可借此机会进行优化)。
  • 检查 INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO,找到最大的临时表对应的线程,kill之即可释放,但 ibtmp1 文件则不能释放(除非重启)。
  • 择机重启实例,释放 ibtmp1 文件,和 ibdata1 不同,ibtmp1 重启时会被重新初始化而 ibdata1 则不可以。
  • 定期检查运行时长超过N秒(比如N=300)的SQL,考虑干掉,避免垃圾SQL长时间运行影响业务。
  • 附:临时表测试案例

    表DDL

    CREATE TEMPORARY TABLE `tmp1` (
     `id` int(10) unsigned NOT NULL DEFAULT '0',
     `name` varchar(50) NOT NULL DEFAULT '',
     `aid` int(10) unsigned NOT NULL AUTO_INCREMENT,
     `nid` int(11) unsigned GENERATED ALWAYS AS ((`id` + 1)) VIRTUAL NOT NULL,
     `nnid` int(11) unsigned GENERATED ALWAYS AS ((`id` + 1)) STORED NOT NULL,
     PRIMARY KEY (`aid`),
     KEY `name` (`name`),
     KEY `id` (`id`),
     KEY `nid` (`nid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    原表大小只有 120MB,从这个表直接 INSERT…SELECT 导数据到tmp1表。

    -rw-r----- 1 yejr imysql 120M Apr 14 10:52 /data/mysql/test/sid.ibd

    生成临时表(去掉虚拟列,临时表不支持虚拟列,然后写入数据),还更大了(我也不解,以后有机会再追查原因)。

    -rw-r----- 1 yejr imysql 140M Jun 25 09:55 /Users/yejinrong/mydata/ibtmp1

    查看临时表元数据信息

    yejr@imysql.com [test]>select * from 
     INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO\G
    *********************** 1. row ***********************
     TABLE_ID: 405
     NAME: #sql14032_300000005_3
     N_COLS: 6
     SPACE: 421
    PER_TABLE_TABLESPACE: FALSE
     IS_COMPRESSED: FALSE

    再删除索引,结果,又更大了

    -rw-r----- 1 yejr imysql 204M Jun 25 09:57 /data/mysql/ibtmp1

    第二次测试删除索引后,变成了200M(因为第二次测试时,我设置了临时表最大200M)

    innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:200M
    -rw-r----- 1 yejr imysql 200M Jun 25 10:15 /data/mysql/ibtmp1

    执行一个会产生临时表的慢SQL。

    注:MySQL 5.7起,执行UNION ALL不再产生临时表(除非需要额外排序)。

    yejr@imysql.com [test]>explain select * from tmp1 union 
     select id,name,aid from sid\G
    *************************** 1. row ***************************
     id: 1
     select_type: PRIMARY
     table: tmp1
     partitions: NULL
     type: ALL
    possible_keys: NULL
     key: NULL
     key_len: NULL
     ref: NULL
     rows: 3986232
     filtered: 100.00
     Extra: NULL
    *************************** 2. row ***************************
     id: 2
     select_type: UNION
     table: sid
     partitions: NULL
     type: ALL
    possible_keys: NULL
     key: NULL
     key_len: NULL
     ref: NULL
     rows: 802682
     filtered: 100.00
     Extra: NULL
    *************************** 3. row ***************************
     id: NULL
     select_type: UNION RESULT
     table: <union1,2>
     partitions: NULL
     type: ALL
    possible_keys: NULL
     key: NULL
     key_len: NULL
     ref: NULL
     rows: NULL
     filtered: NULL
     Extra: Using temporary

    文件涨到588M还没结束,我直接给卡了

    -rw-r----- 1 yejr imysql 588M Jun 25 10:07 /data/mysql/ibtmp1

    第二次测试时,设置了临时表空间文件最大200M,再执行会报错:

    yejr@imysql.com [test]>select * from tmp1 union 
     select id,name,aid from sid;
    ERROR 1114 (HY000): The table '/var/folders/bv/j4tjn6k54dj5jh1tl8yn6_y00000gn/T/#sql14032_5_8' is full

    总结

    下载本文
    显示全文
    专题