豫ICP备17040950号-2

解决MySQL的Incorrect key file for table报错ERROR-126

文章目录
  1. 1. 问题描述
  2. 2. 分析问题
  3. 3. 解决办法

问题描述

业务系统正常运行,没有进行任何发布升级操作,在某个时间点有业务侧反馈,界面查询分页列表一直在加载中,无法查询出数据。

1
ERROR 126 (HY000): Incorrect key file for table '/tmp/#sql_1d87_0.MYI'; try to repair it

分析问题

通过现象观察:/tmp/**为mysql临时文件,存在两种可能:

1、文件丢失被删除

一般为人工手动删除

2、文件创建失败或无法创建

一般为磁盘空间不足没有空闲磁盘可创建新文件。

解决办法

1、查看系统主机的磁盘是否已满或基本没可使用空间

linux下执行 df -h 命令查看。

1
2
3
4
5
6
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      5.35.0G   50M 100% /
/dev/sda1              99M   12M   8313% /boot
tmpfs                 125M     0  125M   0% /dev/shm
/dev/sdb1             7.71837.2G   3% /data

从上面看确实是空间满了。

2、查看mysql数据目录的文件位置

show variables like '%dir%';,结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+-----------------------------------------+------------------------------------+
| Variable_name                           | Value                              |
+-----------------------------------------+------------------------------------+
| basedir                                 | /usr/local/mysql                   |
| binlog_direct_non_transactional_updates | OFF                                |
| character_sets_dir                      | /usr/local/mysql/share/charsets/   |
| datadir                                 | /usr/local/mysql/data/             |
| innodb_data_home_dir                    | /data/mysql/data                   |
| innodb_log_group_home_dir               | /data/mysql/data                   |
| innodb_max_dirty_pages_pct              | 75                                 |
| lc_messages_dir                         | /usr/local/mysql/share/            |
| plugin_dir                              | /usr/local/mysql/lib/mysql/plugin/ |
| slave_load_tmpdir                       | /tmp                               |
| tmpdir                                  | /tmp                               |
+-----------------------------------------+------------------------------------+
11 rows in set (0.01 sec)

从上面看安装的MYSQL目录为默认的系统盘下,一般服务器买的阿里云或腾讯云,最好把MYSQL的临时目录和BINLOG目录指向到其他挂载盘。
另外需排查BINLOG日志是否开启,BINLOG日志默认设置的保存多长时间。

3、查看是否开启BINLOG日志

1
2
3
4
5
6
7
show variables like 'log_bin';

+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| log_bin | ON |
+------------------+------------+

4、查看默认的日志保存天数

根据实际磁盘大小设置保留天数。

1
2
3
4
5
6
7
mysql> show variables like '%expire_logs_days%';  

+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| expire_logs_days | 5 |
+------------------+------------+

5、设置自动清理

1
2
3
mysql> set global expire_logs_days = 5; #把binlog的过期时间设置为5天; 

mysql> flush logs; #刷一下log使上面的设置生效,否则不生效。

其他binlog更多的请参考之前发布的《mysql清理binlog日志》技术文章。