深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1238|回复: 5
打印 上一主题 下一主题

mysql出现"the table is full"的问题.(1114)

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2019-9-13 16:14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhgc 于 2021-9-11 19:12 编辑

the table is full

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”.
ERROR 1114 (HY000) at line 1720: The table 'XXXX' is full
于是就修改Mysql的配置文件my.ini,在[mysqld]下添加/修改两行:
  1. tmp_table_size = 256M
  2. max_heap_table_size = 256M
复制代码

系统默认tmp_table_size是16M,max_heap_table_size是16M,修改完后重启mysql
  1. show variables like '%table_size%'
  2. show global variables like '%table_size%'
复制代码


二.
硬盘空间满了,清理硬盘即可.
不要被mysql的安装目录所欺骗, 最好亲自去看看数据存放目录是哪
在my.ini 搜索 datadir
看其指向的目录 就是数据存放目录。(我就上当了)
回复

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
沙发
 楼主| 发表于 2019-9-13 17:01:54 | 只看该作者

mysql的tmp_table_size和max_heap_table_size

关于tmp_table_size

1. tmp_table_size规定了内部内存临时表的最大值,每个线程都要分配

2. 实际起限制作用的是tmp_table_size和max_heap_table_size的最小值

3. 如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表

4. MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下,默认:

  1. mysql> show variables like "tmpdir";
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | tmpdir        | /tmp/ |
  6. +---------------+-------+
复制代码


5. 可以比较内部基于磁盘的临时表的总数和创建在内存中的临时表的总数(Created_tmp_disk_tables和Created_tmp_tables),一般的比例关系是:

Created_tmp_disk_tables/Created_tmp_tables<5%


关于max_heap_table_size

1. max_heap_table_size变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值.

2. max_heap_table_size变量支持动态改变,即set @max_heap_table_size=#





回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
板凳
 楼主| 发表于 2019-9-13 17:28:05 | 只看该作者
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
tmp_table_size=369M
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
地板
 楼主| 发表于 2019-9-13 17:52:34 | 只看该作者
MySQL中临时表主要有两类,包括外部临时表和内部临时表。外部临时表是通过语句create temporary table...创建的临时表,临时表只在本会话有效,会话断开后,临时表数据会自动清理。内部临时表主要有两类,一类是information_schema中临时表,另一类是会话执行查询时,如果执行计划中包含有“Using temporary”时,会产生临时表。内部临时表与外部临时表的一个区别在于,我们看不到内部临时表的表结构定义文件frm。而外部临时表的表定义文件frm,一般是以#sql{进程id}_{线程id}_序列号组成,因此不同会话可以创建同名的临时表。
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
5#
 楼主| 发表于 2020-2-17 12:04:46 | 只看该作者
本帖最后由 zhgc 于 2020-2-17 12:07 编辑

我觉得还可以创建临时表,设置表的size

执行ALTER TABLE tbl_name MAX_ROWS=1000000000;
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
6#
 楼主| 发表于 2020-2-17 12:49:09 | 只看该作者
知识点好多:

tmp_table_size:

1. 它规定了内部内存临时表的最大值,每个线程都要分配。
2.(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)
3. 如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下,默认:
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp/ |
+---------------+-------+
4. 优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。如果需要的话并且你有很多group by语句,并且你有很多内存,增大tmp_table_size(和max_heap_table_size)的值。
5. 这个变量不适用与用户创建的内存表(memory table).
6. 你可以比较内部基于磁盘的临时表的总数和创建在内存中的临时表的总数(Created_tmp_disk_tables和Created_tmp_tables),一般的比例关系是:
Created_tmp_disk_tables/Created_tmp_tables<5%

max_heap_table_size

7. 这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
8. 这个变量支持动态改变,即set @max_heap_table_size=#
9. 但是对于已经存在的内存表就没有什么用了,除非这个表被重新创建(create table)或者修改(alter table)或者truncate table。
10. 服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。
11. 这个变量和tmp_table_size一起限制了内部内存表的大小。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 01:36 , Processed in 0.026786 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表