暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

处理常见异常MySQL table xxx is full 不常见原因一例

IT那活儿 2021-06-08
2639
 背 景
在某日常爱岗敬业过程中,忽然收到某业务不可用,数据无法插入修改的消息,迅速打开错误日志发现大量业务表报table XXX is full的错误:

看到此报错心里有数,mysql出现"the table is full"的问题,一般有两个常见原因:

  • 一个是使用MEMORY 存储引擎时临时表大小设置太小导致,一般调整MySQL的配置文件两个参数重启即可:tmp_table_sizemax_heap_table_size但是看报错日志中显然很多业务表都不是memory存储引擎而是innodb存储引擎的,故排除此原因。

  • 另一种原因便是硬盘空间满了,清理硬盘即可。但是检查数据目录空间发现还有大量磁盘空间可用:

 处 理
两个常见原因皆排除后,感受到时间紧迫,迅速查阅官方文档检索是否有其他原因可能性:

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

气氛变得紧张起来,怀疑有更深的原因和bug,迅速上MOS查询相关问题,终于发现类似问题的doc:

文档提示当磁盘空间还有较大盈余的时候,可能是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

END

更多精彩干货分享

点击下方名片关注

IT那活儿

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

评论