当我们要写入新数据而发生"The table is full"告警错误时,先不要着急,按照下面的思路来逐步分析即可:
①.、查看操作系统以及MySQL的错误日志文件
确认操作系统的文件系统没有报错,并且MySQL的错误日志文件中是否有一些最直观的可见的错误提示.
执行 df -h 查看剩余磁盘空间,如果发现磁盘空间确实已经用完,则尽快删除不需要的文件.
如果通过 du 计算各个目录的总和却发现根本不会用完磁盘空间时,就需要注意了,可能是某个被删除的文件还没完全释放,导致 df 看起来已经用完,但 du 却又统计不到.
这时候可以执行?lsof | grep -i deleted?找到被删除的大文件,将其对应的进程杀掉,释放该文件描述符.
如果该进程不能被杀掉,例如是 mysqld 进程在占用的话,可以在 MySQL 里找到是哪个内部线程在用,停止该线程即可.
曾经发生过这样一个例子:
用vim打开MySQL的slow query log,退出时选择了 "wq" 指令,也就是保存退出,结果悲剧发生了.
因为在其打开的那段时间内,slow query log有新日志产生,会持续写入,但他退出时采用保存退出的方式,变成了一个"新"文件(或者说新文件句柄 file handler),这个"新"文件无法被mysqld进程识别,
mysqld进程依旧将slow query log写入到原来它打开的那个文件(或者说文件句柄)里,该日志文件在持续增长,但手工保存退出的文件却再也不增长了,直接查看文件看不出任何异常.
这时候只能用?lsof -p +pidof mysqld+?才能看到该文件.
解决方法很简单,将原来的文件备份一下,执行下面的指令:
FLUSH SLOW LOGS;
如果是MyISAM引擎
在行指针设置较小不够用的时候,为提高MyISAM表最大容量,可以修改表定义设定MAX_ROWS的值:
ALTER TABLE +xx+ ENGINE=MyISAM MAX_ROWS=nn
备注:?表定义中,?AVG_ROW_LENGTH?属性定义的是 BLOB/TEXT 字段类型的最大长度.
如果是InnoDB引擎
解决方法:
①.、ibdata*的最后一个文件(?非最后一个文件无法设置为自动增长?)设置成自动增长;
顺便说下,如果数据表有一列自增INT做主键,但是该ID值达到了INT最大值的话,MyISAM、MEMORY、InnoDB三种引擎的告警信息是不一样的.
InnoDB引擎的告警信息类似这样:
参考
查看是否己修改
二.硬盘空间满了,清理硬盘即可.
以上就是土嘎嘎小编为大家整理的MySQL 出现 The table is full 的解决方法【转】相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!