MySQL 出现 The table is full 的解决方法【转】

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

时间 2014-08-21 12:18:56  MySQL中文网

原文  http://imysql.com/2014/08/21/mysql-faq-howto-deal-with-table-full.shtml

主题 MySQL

当我们要写入新数据而发生“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’

参考

MySQL手册: B.5.2.12 The table is full

查看是否己修改

mysql> show variables like ‘%max_heap_table_size%‘;

mysql出现"the table is full"的问题,一般有两个原因:

一 .You are using the MEMORY (HEAP) storage engine; in this case you need to increase the value of the max_heap_table_size system variable. See Section 5.1.3, “Server System Variables”.

于是就修改Mysql的配置文件/etc/my.cnf,在[mysqld]下添加/修改两行:
tmp_table_size = 256M
max_heap_table_size = 256M
系统默认是16M,修改完后重启mysql

二.硬盘空间满了,清理硬盘即可.

时间: 2024-10-05 04:44:46

MySQL 出现 The table is full 的解决方法【转】的相关文章

MySQL Waiting for table metadata lock的解决方法

最近需要在某一个表中新增字段,使用Sequel Pro 或者Navicat工具都会出现程序没有反应,使用 show processlist 查看,满屏都是 Waiting for table metadata lock 状态的连接,第一反应当然是 kill 掉这些链接,但是假如太多怎么办?遂在找寻其他办法. 在网上查询得知MySQL在进行一些alter table等DDL操作时,如果该表上有未提交的事务则会出现 Waiting for table metadata lock ,而一旦出现meta

"table" is not mapped 解决方法

现象:使用hql="from person" 出现" person is not mapped " 错误 配置文件如下:<hibernate-mapping>    <class name="src.Person"           table="person">        <id name="name"/>               <property n

关于MySQL错误 2005 - Unknown MySQL server host &#39;localhost&#39; (0) 原因及解决方法

今天在外面开navicat for mysql的时候,怎么也连不上自己本机上的数据库,一直显示2005 - Unknown MySQL server host 'localhost' (0): 错误代码的意思即无法连接上主机localhost.可能是由于没有联网造成的:于是将连接属性里的 '主机名或IP地址' 改成127.0.0.1即回送地址后,就可以连接上了.上百度搜了下,navicat里的一些功能应该是要联网的,而localhost是需要DNS解析后才会是127.0.0.1的,所以才会导致这

net start mysql启动mysql,提示发生系统错误 5 拒绝访问 解决方法

解决问题方法如下: 在dos下运行net  start mysql 不能启动mysql!提示发生系统错误 5:拒绝访问!切换到管理员模式就可以启动了.所以我们要以管理员身份来运行cmd程序来启动mysql. 那么如何用管理员身份来运行cmd程序呢? 0.在C:\Windows\System32下面找到cmd.exe,右键附加到开始菜单 1.右键单击cmd选择"附到[开始]菜单(U)";这是就可以到开始菜单上找到cmd了, 2.右击选择属性,选择快捷方式,选择以管理员身份运行,再单击确定

MYSQL拒绝访问:not allowed to connect解决方法

分享下MYSQL拒绝访问报错not allowed to connect的解决方法. 可以在其它任何的主机上以root身份登录 mysql报如下错误,截取部分, message from server: "Host '****' is not allowed to connect to this MySQL server1:在登录mysql服务器2:执行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION //赋予任何主机访问数

MySQL安装配置最后时未响应解决方法

安装MySQL出示未响应,一般显示在安装MySQL程序最后一步的2,3项就不动了. 这种情况一般是你以前安装过MySQL数据库服务项被占用了.解决方法:一种方法:你可以安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字改了就可以了. 二种方法:1.卸载MySQL   2.删除安装目录及数据存放目录   3.在注册表(regedit)查询mysql,全部删除   4.在c盘查询MySQL,全部删除   5.重新安装就好了注意的是注册表 cmd -> regedit1.H

mysql数据库出现2003-Can&#39;t connect to MySQL server on &#39;localhost&#39; (10061)的解决方法

1.右键点击我的电脑,找到管理! 2.找到服务和应用程序: 3.打开找到服务,打开: 4.在服务里找到MySQL,改成启动: mysql数据库出现2003-Can't connect to MySQL server on 'localhost' (10061)的解决方法

navicat报错2005 - Unknown MySQL server host &#39;localhost&#39; (0) 原因及解决方法

报错原因:没有连接互联网,用navicat连接本地mysql数据库,连接属性ip为localhost. 解决办法:将ip改为127.0.0.1即可.localhost是需要DNS解析后才会是127.0.0.1的. navicat报错2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法 原文地址:https://www.cnblogs.com/Y-zhiwei/p/8458238.html

MySQL mysqldump与source导入慢的解决方法

Jquery中文网 >  数据库  >  mysql  >  正文 MySQL mysqldump与source导入慢的解决方法 MySQL mysqldump与source导入慢的解决方法 发布时间:2017-02-26   编辑:www.jquerycn.cn jquery中文网为您提供MySQL mysqldump与source导入慢的解决方法等资源,欢迎您收藏本站,我们将为您提供最新的MySQL mysqldump与source导入慢的解决方法资源 mysqldump与sourc