[MySQL FAQ]系列 — 你所不知的table is full那些事

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: [MySQL FAQ]系列 — 你所不知的table is full那些事

当我们要写入新数据而发生“The table is full”告警错误时,先不要着急,按照下面的思路来逐步分析即可:

1、查看操作系统以及MySQL的错误日志文件

确认操作系统的文件系统没有报错,并且MySQL的错误日志文件中是否有一些最直观的可见的错误提示。

有可能是数据库文件超过操作系统层的文件大小限制,比如fat/fat32以及低版本的Linux,文件最大不可以大于2G(最大扩展到4G),这就需要转换fat32为NTFS,或升级Linux版本。

2、确认磁盘空间没有满

执行 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;

备注:MySQL 5.5开始才支持 BINARY/ENGINE/ERROR/GENERAL/RELAY/SLOW 等关键字,之前的版本只能刷新全部日志。

3、确认数据表状态

  • 如果是MyISAM引擎

默认配置下,MyISAM引擎最大可支持256TB(myisam_data_pointer_size = 6,256^6 = 256TB),除非操作系统层有限制。

在MySQL5.0中,MyISAM引擎行记录默认是动态长度,单表最大可达256TB,MyISAM行指针(myisam_data_pointer_size)长度为6字节。

在这之前,MyISAM行指针默认长度为4字节,只支持4GB的数据。改行指针最大值可设为8字节。

在行指针设置较小不够用的时候,为提高MyISAM表最大容量,可以修改表定义设定MAX_ROWS的值:

ALTER TABLE `xx` ENGINE=MyISAM MAX_ROWS=nn

备注:表定义中,AVG_ROW_LENGTH 属性定义的是 BLOB/TEXT 字段类型的最大长度。

  • 如果是InnoDB引擎

ibdata*共享表空间最后一个文件没有设置成自增长,或者超过32位系统的单文件大小限制。

解决方法:

1、ibdata*的最后一个文件(非最后一个文件无法设置为自动增长)设置成自动增长;

2、检查操作系统,迁移到64位操作系统下;

3、转成独立表空间;

4、删除历史数据,重整表空间;

  • 如果是MEMORY引擎

1、适当提高max_heap_table_size设置(注意该值是会话级别,不要设置过大,例如1GB,一般不建议超过256MB);

2、执行ALTER TABLE t_mem ENGINE=MEMORY; 重整表空间,否则无法写入新数据

3、删除部分历史数据或者直接清空,重整表空间;

4、设置 big_tables = 1,将所有临时表存储在磁盘,而非内存中,缺点是如果某个SQL执行时需要用到临时表,则性能会差很多;

顺便说下,如果数据表有一列自增INT做主键,但是该ID值达到了INT最大值的话,MyISAM、MEMORY、InnoDB三种引擎的告警信息是不一样的。

InnoDB引擎的告警信息类似这样:

ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

而MyISAM和MEMORY引擎则都是这样:

ERROR 1062 (23000): Duplicate entry ’4294967295′ for key ‘PRIMARY’



            </div>
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL5.7 group by新特性报错1055的解决办法
MySQL5.7 group by新特性报错1055的解决办法
|
安全 Ubuntu 关系型数据库
WordPress MySQL Extension Missing 错误背后的 3 个主要原因
今天北京六翼信息技术有限公司的工程师主要和大家分享的是WordPress定制开发过程中常遇见的问题之一——“WordPress MySQL Extension Missing 错误背后的 3 个主要原因”。当您第一次安装 WordPress或将您的 WordPress 网站移动到新的托管基础设施时,您需要确保所有服务都已正确配置。它包括将接受 HTTP 请求的 Web 服务器、将控制 PHP 代码执行的 PHP 处理程序以及将接受和处理数据库请求的 MySQL/MariaDB。
WordPress MySQL Extension Missing 错误背后的 3 个主要原因
|
SQL 关系型数据库 MySQL
软件开发入门教程网之MySQL GROUP BY 语句
软件开发入门教程网之MySQL GROUP BY 语句
|
SQL 关系型数据库 MySQL
软件开发入门教程网 之MySQL DELETE 语句
软件开发入门教程网 之MySQL DELETE 语句
|
SQL 存储 运维
FAQ系列 | MySQL DBA修炼秘籍
FAQ系列 | MySQL DBA修炼秘籍
|
算法 关系型数据库 MySQL
【MySQL笔记】ORDER BY是如何工作的?
每次业务功能中总有按操作时间排序,或者按其他字段排序的需求,一想到排序我们就会想到MySQL中的ORDER BY,那在使用的过程中,我们是否会存在不合理的使用导致查询的速度下降呢?
|
机器学习/深度学习 存储 SQL
[MySQL FAQ]系列 — 你所不知的table is full那些事
[MySQL FAQ]系列 — 你所不知的table is full那些事
109 0
|
SQL 关系型数据库 MySQL
[MySQL FAQ]系列 — EXPLAIN结果中哪些信息要引起关注
[MySQL FAQ]系列 — EXPLAIN结果中哪些信息要引起关注
127 0
|
存储 SQL 缓存
白日梦的MySQL专题(第38篇文章)8分钟回顾MySQL的索引
在MySQL中,不仅为主键创建的聚簇索引选用的数据结构是B+Tree,像辅助索引,二级索引、覆盖索引、联合索引等等其实都是B+Tree。
356 0
|
Java 关系型数据库 MySQL
记录:MySQL报错1075 - Incorrect table defintion;there can be only...【亲测有效】
记录:MySQL报错1075 - Incorrect table defintion;there can be only...【亲测有效】
441 0