一次The table is full 经历

问题:

用户无法正常登陆网站,输入正确的用户名和密码不能正常跳转,也没有错误提示。但是输入错误的用户名和密码有得提示用户名或密码不正确。

排查过程:

1、查看nginx日志一切正常,无错误日志。

2、php也无错误日志。

3、查看数据库错误日志,发现持续报以下错误:

160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full
160130 12:04:01 [ERROR] /usr/local/mysql/bin/mysqld: The table 'session' is full

通过以上数据库错误日志来看,第一直觉是磁盘空间满了,于是df -h查看磁盘空间使用情况,发现磁盘空间是富余的。

既然不是磁盘空间问题,那进入数据库看看,

查看session表有多少记录,发现一条记录也没有

mysql> select count(*) from  session;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

查看表数据,也没有任何数据,那空间用哪去了???

mysql> select * from  session;
Empty set (0.02 sec)

查看表结构,发现这张表是一个内存表:

mysql> show create table session;
session | CREATE TABLE `session` (
  `session_id` varchar(255) NOT NULL,
  `session_expire` int(11) NOT NULL,
  `session_data` blob,
  `session_time` int(10) NOT NULL DEFAULT '0' COMMENT '開始時間',
  UNIQUE KEY `session_id` (`session_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 KEY_BLOCK_SIZE=784

查看数据库内存表值为多少,为128M

show global variables like 'max_heap_table_size';
+---------------------+-----------+
| Variable_name       | Value     |
+---------------------+-----------+
| max_heap_table_size | 134217728 |
+---------------------+-----------+

查看session表内存空间使用情况(没记录当时数值,这里意思一下,哈哈)

show table status from userDB where name ='session'\G;
*************************** 56. row ***************************
           Name: session
         Engine: MEMORY
        Version: 10
     Row_format: Dynamic
           Rows: 12169
Avg_row_length: 1033
    Data_length: 134124544
Max_data_length: 333285054
   Index_length: 1584128
      Data_free: 129903616
Auto_increment: NULL
    Create_time: 2016-01-30 16:55:19
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
Create_options: KEY_BLOCK_SIZE=800
        Comment:

可以看出Data_free: 129903616 这里已经分配出去但未使用的空间(浪费掉的),找到问题所在那就好办了。

处理方法:

由于该表是MEMORY表,不可以使用OPTIMIZE TABLE进行优化,只能重整表空间了ALTER TABLE session ENGINE=MEMORY

总结:

因为有个计划任务,定期删除过期的session记录,又没有对应该表进行优化,导致碎片越来越多,最后占满整张表128M的空间。对于内存表大小可以通过max_heap_table_size参数调整内存表空间大小,应该参数可以动态修改,但对已存在的表无效,可以重整表空间ALTER TABLE来生效。


更多table is full问题,大家可以看看叶老师这张文章

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


你可能感兴趣的:(一次The table is full 经历)