目录
一、系统环境
二、问题报错
三、问题回顾
四、解决问题
一、系统环境
系统Ubuntu20.04
数据库版本MySQL 8.0.21
二、问题报错
在MySQL上执行一个大的SQL查询报错Error writing file '/tmp/MYfd=142' (OS errno 28 - No space left on device)
Exception in thread "main" java.sql.SQLException: Error writing file '/tmp/MYfd=142' (OS errno 28 - No space left on device)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1009)
原因是表明在写入文件时,临时目录(tmpdir)的设备上没有足够的可用空间,可能会导致MySQL无法执行某些大的操作。
三、问题回顾
查看当前mysql使用的临时目录
show variables like 'tmpdir';
执行sql语句,通过df -h /tmp观察tmp空间使用情况变化
四、解决问题
通过修改mysql配置文件来修改当前数据库的tmpdir路径设置。
# 在空间足够的位置创建temp文件
mkdir /database/mysqltmp
# 设置用于组和读写权限
chown -R mysql:mysql /database/mysqltmp
chmod -R 777 /database/mysqltmp
# 打开mysql的配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 在文件里面修改缓存路径 然后 :wq保存并退出
[mysqld]
tmpdir = /database/mysqltmp
# 更改/etc/apparmor.d/usr.sbin.mysqld添加
vim /etc/apparmor.d/usr.sbin.mysqld
/database/mysqltmp/* rw,
# 重启apparmor
/etc/init.d/apparmor restart
# 重启mysql
systemctl restart mysql