MySQL 5.6升级至5.7后mysql_upgrade执行ALTER TABLE FORCE相关问题咨询
嘿,这个升级坑我之前踩过好几次,给你明确说:当临时表空间不足时,ALTER TABLE FORCE绝对会失败。
为啥?因为ALTER TABLE FORCE本质是重建整个表——它会在临时表空间里创建一个和原表结构一致的临时表,把原表的数据导进去,重建索引,最后替换原表。大表的话,这个临时表需要的空间往往比原表还大(毕竟要存索引和中间数据),临时空间不够的话,MySQL直接就会抛出类似Error 1114 (HY000): The table 'xxx' is full或者明确提示临时空间不足的错误,操作直接中断。
那该怎么解决?给你几个亲测有效的方案:
先查清楚当前临时空间的配置
先执行这两个命令搞清楚现状:SHOW VARIABLES LIKE 'innodb_temp_data_file_path'; SHOW VARIABLES LIKE '%tmpdir%';前者看InnoDB临时表空间(ibtmp1)的大小和扩展规则,后者看临时文件的存储目录。默认情况下ibtmp1初始只有12M,虽然会自动扩展,但如果磁盘本身没空间或者有文件系统限制,照样会炸。
临时扩容InnoDB临时表空间(最常用的应急方案)
修改MySQL配置文件(my.cnf/my.ini)里的innodb_temp_data_file_path参数,比如改成:innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:20G这里的
max:20G是你设置的最大上限,根据你的磁盘剩余空间调整就行。改完后必须重启MySQL,重启后ibtmp1会被重新初始化,之前的空间占用会被清零,新的临时空间就能正常扩展了。给临时表换个大磁盘目录
如果当前临时目录所在的磁盘没空间了,可以把tmpdir参数指向一个剩余空间充足的磁盘分区,比如:tmpdir = /mnt/big_disk/tmp同样需要重启MySQL生效。如果不想全局修改,也可以在执行
mysql_upgrade前,临时给会话设置:SET @@global.tmpdir = '/mnt/big_disk/tmp';不过记得要确保这个目录的权限是MySQL进程能读写的(一般是mysql:mysql)。
清理磁盘腾出空间
先检查临时目录里有没有残留的旧临时文件,或者清理掉不需要的日志文件(比如过期的binlog、relaylog),用PURGE BINARY LOGS BEFORE 'yyyy-mm-dd';清理过期binlog,能快速腾出不少空间。手动拆分大表操作(迫不得已的情况)
如果实在没法重启MySQL,也可以手动对大表执行ALTER TABLE,先禁用索引减少临时空间占用:ALTER TABLE your_big_table DISABLE KEYS; ALTER TABLE your_big_table FORCE; ALTER TABLE your_big_table ENABLE KEYS;不过这个方法只能稍微减少一点空间需求,核心还是得有足够的临时空间。
最后提醒一句:下次升级前,最好先预估大表的大小,提前把临时表空间调大,避免中途卡壳——毕竟升级到一半失败,回滚起来也麻烦。
内容的提问来源于stack exchange,提问作者Robert

