mysql執行SQL語句時報錯:[Err] 3 - Error writing file '/tmp/MYP0G1B8' (Errcode: 28 - No space left on device)


問題描述:

  今天一同事在mysql中執行SQL語句的時候,報了/tmp空間不足的問題,報錯如下:

[SQL] SELECT f.prov as 字段1, MAX( CASE f.flag_name WHEN '字段1' THEN f.num ELSE 0 END ) AS '字段1', MAX( CASE f.flag_name WHEN '店員量' THEN f.num ELSE 0 END ) AS '字段1', MAX( CASE f.flag_name WHEN '字段1' THEN f.num ELSE 0 END ) AS '字段1' FROM 
( SELECT '字段1' AS flag_name, ( SELECT b.AREA_NAME FROM sc_area b WHERE b.AREA_CODE = a.privinceCode ) AS prov, COUNT(DISTINCT a.storeID) AS num FROM promotion a WHERE DATE_FORMAT(a.pushTime, '%Y') = '2018'GROUP BY a.privinceCode
  UNION ALL SELECT '字段1' AS flag_name, (   SELECT b.AREA_NAME FROM sc_area b WHERE b.AREA_CODE = a.privinceCode ) AS prov, COUNT(DISTINCT a.staffID) AS num FROM promotion a WHERE DATE_FORMAT(a.pushTime, '%Y') = '2018' GROUP BY a.privinceCode
  UNION ALL SELECT '字段1' AS flag_name, ( SELECT b.AREA_NAME FROM sc_area b WHERE b.AREA_CODE = a.privinceCode ) AS prov, COUNT(1) AS num FROM promotion a WHERE DATE_FORMAT(a.pushTime, '%Y') = '2018' AND a.pushSts = '1' GROUP BY a.privinceCode
) AS f GROUP BY f.prov ;
[Err] 3 - Error writing file '/tmp/MYP0G1B8' (Errcode: 28 - No space left on device)

故障分析:

  通過以上的錯誤提示,可以知道是在執行SQL的時候,創建臨時表進行排序的時候,/tmp空間不足導致的.

故障處理:

1.查看磁盤上tmp空間大小,發現/tmp空間剩余5.2GB

2.與同事溝通,SQL查詢的表非常的打,有8G大小,所以明顯是tmp空間大小不夠用了

3.無法擴展/tmp的大小,所以就修改mysql中tmpdir的位置,由於該參數是只讀參數,只能在my.cnf中修改,重啟生效

4.創建臨時目錄,並且修改權限

[root@testvm mnt]# mkdir mysql_tmp_dir
[root@testvm mnt]# ls
mysql_tmp_dir
[root@testvm mnt]# chmod 777 mysql_tmp_dir/  #必須修改權限,讓啟動mysql的賬戶是可讀寫的. 此處是在root下創建,也可以切換到mysql用戶下,然后創建目錄,這樣默認mysql就有讀寫權限了.
[root@testvm mnt]# ls -ltr
total 4
drwxrwxrwx 2 root root 4096 Jul  5 17:49 mysql_tmp_dir

5.修改my.cnf

tmpdir = /mnt/mysql_tmp_dir

 6.重啟mysql實例

7.查看tmpdir變量值

mysql> show variables like '%tmpdir%';
+-------------------+--------------------+
| Variable_name     | Value              |
+-------------------+--------------------+
| innodb_tmpdir     |                    |
| slave_load_tmpdir | /mnt/mysql_tmp_dir |
| tmpdir            | /mnt/mysql_tmp_dir |
+-------------------+--------------------+
3 rows in set (0.01 sec)

備注:tmpdir變量已經修改生效了,后續執行SQL過程中生成的臨時文件都會存儲在這個目錄下了.

 

tmpdir系統變量,官方文檔參考:

The path of the directory to use for creating temporary files. It might be useful if your default /tmp directory resides on a partition 
that is too small to hold temporary tables. This option accepts several paths that are used in round-robin fashion. Paths should be
separated by colon characters (:) on Unix and semicolon characters (;) on Windows. If the MySQL server is acting as a replication slave,
you should not set --tmpdir to point to a directory on a memory-based file system or to a directory that is cleared when the server host
restarts. For more information about the storage location of temporary files, see Section B.5.3.5, “Where MySQL Stores Temporary Files”.
A replication slave needs some of its temporary files to survive a machine restart so that it can replicate temporary tables or LOAD DATA
INFILE operations. If files in the temporary file directory are lost when the server restarts, replication fails.

 

文檔創建時間:2018年7月5日17:53:46


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM