The table ‘table_name‘ is full 异常排查及解决方案

7 篇文章 0 订阅
5 篇文章 0 订阅

背景

项目上线运行了一年半的时间,在这期间因为需求的修改也做过一些改动,但是这个基础的下单功能从上线后未做过任何改动,且最近半年项目未更新,一直稳定运行包括这个下单功能,但是前天发生了下单失败的情况,最开始也未太多的关注,因为这个下单功能会去调用三方服务做前置操作(三方服务限制订单每个用户每天只允许下单一次,三方服务成功之后才做入库操作),并且提示给用户的信息是重复下单,所以用户下单失败且是重复下单的提示是属于正常现象;但是当天后续的订单都是失败重复下单的情况;此时就感觉到不对了。赶紧去查看了该服务的日志信息,日志信息如下:
在这里插入图片描述
看到线上服务有报错日志就能解释为何所有订单都会失败了,首先不论服务抛出任何异常信息,都会被全局的异常处理器捕获,包装成统一异常信息返回,当用户当天第一次下单的时候,在三方服务下单成功,但是我们自己的服务发生异常,前端显示错误提示,用户以为下单失败,发起第二次下单操作;此时调用三方服务会提示重复下单,我们服务将重复下单的提示返回前端,造成重复下单提示的假相从而让我们以为是正常的提示未做太多关注。

解决

根据异常提示是 “The table ‘xxx_order’ is full”,意思很明显就是order表满了,结合目前的场景是在插入订单的时候order表报的这个错,那么就是说order表空间不够,导致插入失败;这里又可以分为两种情况:
第一: 该表中的数据量超过了最大限制
如果使用的MyISAM存储引擎的话,MAX_ROWS参数会限制每张表的数据条数,可以查看对应表中的数据条数是否达到该值,达到则可以将该值设置调大;innodb存储引擎没有MAX_ROWS参数。
对于innodb存储引擎来说如果page size为16KB,那么表的大小最大为64TB;这个大小几乎不太可能达到,数据量过大会考虑分库分表操作。

第二: 服务器磁盘满了
我这里遇到的这个问题就是服务器磁盘占用满了,如果是服务器磁盘满的话,那么会导致所有的表都会插入失败,排查方式:
a、通过 df -h 指令,查看服务器磁盘使用情况,如果use一列加起来达到100%则说明磁盘使用完了,下图是删除过文件之后的情况,所以磁盘占用不是很高。
在这里插入图片描述
b、当查看到磁盘占用很高之后,从根目录开始查找哪个目录占用磁盘空间最大,指令:du -h --max-depth=1,可以看到usr、root、var三个目录占用磁盘最多,root目录一般是系统使用目录最好不要操作,那么接下来就分别切换到usr、var两个目录中,使用 du -h --max-depth=1 指令排查哪个目录占用磁盘最多,依次排查,找到占用磁盘最多的目录,然后删除其中不重要的文件,比如一些日志文件之类的,我这个问题,最后是查找到nacos的日志文件占用了六十多个G的磁盘,最后将nacos的这些日志文件删除掉就可以了
在这里插入图片描述
说明一下,MySQL在启动的时候会去校验磁盘剩余空间还有多少,如果你的磁盘占用满了,且停止了MySQL服务,那么此时是启动不了的,需要清理磁盘之后,剩余空间大于4G才可以启动。

一般来说服务器cpu、内存、磁盘等资源应当设置预警值,在达到预警值的使用量的时候就需要排查原因或加大服务器的对应资源;比如设置磁盘使用量达到90%进行预警,那么当预警触发的时候就需要去排查什么原因导致磁盘使用这么多,如果是一些不重要或无用的文件占用了很多磁盘,那么可以删除这些文件,如果这些文件都需要保留的话那么应当将文件备份后删除或增加服务器磁盘空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值