
看到此报错心里有数,mysql出现"the table is full"的问题,一般有两个常见原因:
一个是使用MEMORY 存储引擎时临时表大小设置太小导致,一般调整MySQL的配置文件两个参数重启即可:tmp_table_sizemax_heap_table_size但是看报错日志中显然很多业务表都不是memory存储引擎而是innodb存储引擎的,故排除此原因。
另一种原因便是硬盘空间满了,清理硬盘即可。但是检查数据目录空间发现还有大量磁盘空间可用:



可以看出除了 ①磁盘空间满;②超过文件系统限制;③超过innodb单表表空间限制之外,其余全是关于MyISAM存储引擎和memory存储引擎引起的原因。显然这些都不符合我们现场的情况。

文档提示当磁盘空间还有较大盈余的时候,可能是ibdata1系统表空间文件无法继续扩展导致,此时无论是因为设置原因还是文件系统限制原因都会在SQL层抛出the table XXX is full的异常,遂马上检查ibdata1文件:

发现系统表空间文件ibdata2 已经5G ,达到最大限制了,迅速另行添加一个新的共享表空间文件,使数据库恢复正常。

Ibdata1系统表空间在设置了innodb_file_per_table(建议设置)的情况下会储存innodb表的元数据、change buffer、doublewrite buffer和undo log,如果单独设置undo表空间的话,存储内容会更少,出现问题的频率也很低,所以平时运维极易忽略ibdata1,在巡检时也应添加上对该表空间的检查,自动扩展的值也应依据业务进行合理设置。
参考文档:
https://dev.mysql.com/doc/refman/5.7/en/full-table.html https://dev.mysql.com/doc/refman/5.7/en/table-size-limit.html mysqld is showing a "table foo is full" error but there is plenty of available disk space (Doc ID 1458445.1) Table is Full Error for InnoDB Tables (Doc ID 1356573.1) https://dev.mysql.com/doc/refman/5.7/en/innodb-system-tablespace.html

更多精彩干货分享
点击下方名片关注
IT那活儿

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




