今天收到报错:[ERROR] MySQLd: The table 'pvlogs' is full,数据无法写入,影响业务,看到这个错,我首先想到是不是空间满了,查看之后发现是正常的,通过查询和询问同事才知道,原来这个内存引擎的表。
首先理解下内存引擎的概念:
MEMORY存储引擎:
(1)memory存储引擎相比前面的一些存储引擎,有点不一样,其使用存储在内存中的数据来创建表,而且所有的数据也都存储在内存中。
(2)每个基于memory存储引擎的表实际对应一个磁盘文件,该文件的文件名和表名是相同的,类型为.frm。该文件只存储表的结构,而其数据文件,都是存储在内存中,这样有利于对数据的快速处理,提高整个表的处理能力。
(3)memory存储引擎默认使用哈希(HASH)索引,其速度比使用B-+Tree型要快,如果读者希望使用B树型,则在创建的时候可以引用。
(4)memory存储引擎文件数据都存储在内存中,如果mysqld进程发生异常,重启或关闭机器这些数据都会消失。所以memory存储引擎中的表的生命周期很短,一般只使用一次。
解决办法:
方法一:
查看内存表大小相关参数
MariaDB [log]> show VARIABLES like '%max_heap_table_size%';
+---------------------+-----------+
| Variable_name | Value |
+---------------------+-----------+
| max_heap_table_size | 671088640 |
+---------------------+-----------+
1 row in set (0.00 sec)
查看临时表大小控制参数
MariaDB [log]> show VARIABLES like '%tmp_table_size%';
+----------------+----------+
| Variable_name | Value |
+----------------+----------+
| tmp_table_size | 67108864 |
+----------------+----------+
1 row in set (0.01 sec)
1). 设置新的参数,这样设置的参数重启就失效了,
mysql> set global max_heap_table_size=1048576000
mysql> set global tmp_table_size=1048576000
2)之后在mysql配置文件my.cnf里面添加下面两行,使得永久生效。
tmp_table_size = 671088640
max_heap_table_size = 671088640
3)然后客户端重新连接数据库就可以了,如果再不可以的话,那就重新创建相关的内存表。
关于max_heap_table_size和tmp_table_size的解释:
tmp_table_size :它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下,默认:
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir | /tmp/ |
+---------------+-------+
max_heap_table_size:这个变量定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set global max_heap_table_size=#
,但是对于已经存在的内存表就没有什么用了,除非这个表被重新创建(create table)或者修改(alter table)或者truncate table。服务重启也会设置已经存在的内存表为全局max_heap_table_size的值。
这个变量和tmp_table_size一起限制了内部内存表的大小。
方法二:
执行ALTER TABLE tbl_name MAX_ROWS=1000000000;
总结:关于mysql的memory存储引擎的表报错:The table 'pvlogs' is full的问题解决,直接ALTER TABLE tbl_name MAX_ROWS=1000000000立马生效,然后你再修改max_heap_table_size和tmp_table_size这两个参数,并把这个参数写进配置文件,这样重启mysql之后依旧生效,一定注意设置这两个参数之后,对已经存在的内存表是不生效的,需要重新创建(create table)或者修改(alter table)或者truncate table