共计 2120 个字符,预计需要花费 6 分钟才能阅读完成。
今天收到报错:[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
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137514.htm
正文完
星哥玩云-微信公众号