【背景】html
innodb_tmpdir是在innodb online ddl中提到的一个参数;大体的意思是innodb在作online-ddl的时候会向临时目录写入“临时排序文件”mysql
而这些文件的大小基本上就要与表的数据+索引的大小差很少。linux
这里的临时目录默认就是由“tmpdir”这个参数的值,在个人主机上用了/tmp/这个目录sql
show global variables like 'tmpdir'; +----------------+----------+ | Variable_name | Value | +----------------+----------+ | tmpdir | /tmp | +----------------+----------+
一般来讲linux上的tmp目录不可能会特别大,常见的也就几个G吧,可是innodb单个表中的“数据”+“索引”几十个G的多了去了;若是是对数据库
这样的表作online ddl 那么临时目录是保存不下这么大的数据量的,最终的结果就是online ddl失败。spa
【innodb_tmpdir】设计
若是有设置innodb_tmpdir的值、那么在online ddl时innodb会以innodb_tmpdir的值为准、也就是说事实上造成了一种innodb_tmpdir覆盖code
tmpdir的效果。htm
回过头来、若是MySQL实例没有设置innodb_tmpdir的值天然就是以tmpdir的值为准啦。blog
【设置innodb_tmpdir的注意事项】
一、设置innodb_tmpdir要求用户有file权限
二、innodb自己要求innodb_tmpdir的值不能与datadir的值相同
-- 把innodb_tmpdir设置为datadir是行不通的 mysql> set @@global.innodb_tmpdir='/database/mysql/data/3306/'; ERROR 1231 (42000): Variable 'innodb_tmpdir' can't be set to the value of '/database/mysql/data/3306/'
【innodb_tmpdir的最佳实践】
一、设计时应该尽量的想到用数据分片来处理表、不要让表太大(超过tmpdir目录的大小)、虽然这条写在最前面我本身并不怎么care!
二、推荐把数据(datadir)与数据库备份文件保存在不一样的物理磁盘上,一来能够在备份的时候尽量的减少对oltp的影响,二来这种状况
下把tmpdir配置成备份盘的一个目录是很是好的一个选择。(咱们的数据库主机上没有第二块盘呀!“穷”自己就是一个问题)
三、实在没有办法就在执行online ddl前给innodb_tmpdir分配一个大点的目录吧,好歹也能保证执行成功呀!
【innodb online ddl的官方文档】
官方文档 : https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html
----