你所不知的table is full那些事

标签: MySQL解错方案 full | 发表时间:2014-09-17 21:39 | 作者:OurMySQL
出处:http://ourmysql.com

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

抱歉猜想失败,您看看下面的文章有用吗?

相关 [table is full] 推荐:

你所不知的table is full那些事

- - OurMySQL
   当我们要写入新数据而发生“The table is full”告警错误时,先不要着急,按照下面的思路来逐步分析即可:.     1、查看操作系统以及MySQL的错误日志文件.    确认操作系统的文件系统没有报错,并且MySQL的错误日志文件中是否有一些最直观的可见的错误提示.    有可能是数据库文件超过操作系统层的文件大小限制,比如fat/fat32以及低版本的Linux,文件最大不可以大于2G(最大扩展到4G),这就需要转换fat32为NTFS,或升级Linux版本.

Table冻结表头

- - CSDN博客Web前端推荐文章
序号. 内容. 序号. 内容. 作者:zyuc_wangxw 发表于2013-8-20 17:32:14 原文链接. 阅读:36 评论:0 查看评论.

Full Circle 51期发布

- PT - Wow! Ubuntu
How-to:Part 25 Python编程, Part 6 LibreOffice , Part 3 Ubuntu 开发, Part 2 使用KDE (4.6). Linux实验室:创建自己的源. 还有:Ubuntu 游戏,我的Ubuntu故事,等等更多. # 本文采用CC协议进行授权,转载本文请注明本文链接.

花瓶茶几:Flo Table

- 阳阳 - 爱…稀奇~{新鲜:科技:创意:有趣}
没看过花瓶茶几(Flo Table),你就不知道粗腿原来也能如此优雅:把茶几的一条腿变成了玻璃花瓶,木材的实成与透明玻璃的轻盈,就如此完美地结合在了一起~于是,尽管随手插点桃红柳绿在花瓶中吧,任何一点属于自然的色彩,都能将这个家点缀得充满生气~. 亲爱的,这些东西也会对你胃口:. Felt Stool Bookshelf Table:凳子、书架和茶几.

迟到:Full Circle 中文版45期

- L - LinuxTOY
迟到的社区杂志 Full Circle 发布 45 期中文版. 在这一期杂志中,我们给您带来了以下内容:. 决胜命令行 —— Conky 第二部分. How-To : Python 编程 , 虚拟化 : Debian Xen 以及 使用 m23 安装 Ubuntu. Linux 实验室 —— 多重启动U盘.

Full Circle 杂志中文版第46期

- Zheng - LinuxTOY
以 Ubuntu 为主题的 Linux 社区开源杂志 Full Circle 中文版第 46 期发布. How-To : Python编程 – 第20部分, 新系列:LibreOffice – 第1部分 以及 安装Mythbuntu.. Linux 实验室 – 文件系统之一.. 评测 – Boxee Box..

触发Full GC执行的情况

- - Web前端 - ITeye博客
除直接调用System.gc外,触发Full GC执行的情况有如下四种. 旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:. 为避免以上两种状况引起的Full GC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组.

Full GC是否真的存在

- - Java译站
在Plumbr这和GC暂停检测打交道的这段日子里,我查阅了与这个主题相关的大量文章,书籍以及资料. 在这当中,我经常会对新生代GC, 年老代GC以及Full GC的事件的使用(滥用)感到困惑. 于是便有了这篇文章,希望能够清除一些困惑. 本文需要读者对JVM内建的GC相关的常用原理有一定的了解. 像eden区,Survivor区以及年老区空间的划分,分代假设(generational hypothesis)以及不同的GC算法就不在本文的讨论范围之内了.

MySQL Temporary Table相关问题的探究

- comain - 淘宝核心系统团队博客
让我们先来观察几条非常简单的MySQL语句:. 这是丁奇提出的引导性的问题,几条语句看似简单,不过接下来我们提出的一连串问题与进. 看到以上语句,你很容易会产生类似于以下的疑问:. 上述语句在一个session中先后创建了两个名为’tmp’的table,只不过一个是temporary. table,一个是normal table.

MySQL 對 MyISAM、InnoDB 使用 Optimize Table

- - Tsung's Blog
系統用久了, 自然就會有不連續的碎片(fragmented)產生, 以前 Dos 使用 defrag, Windows 使用磁碟重組, 而 MySQL 則是使用 Optimize table.. 以往都是使用: 使用 PHP 對所有 MySQL Database 做 Optimize / Repair 的動作 - 這裡面的那隻程式來跑..