问题
- 在查询大表时,MySQL提示
ERROR 3 (HY000): Error writing file '/tmp/MYfd=268' (OS errno 28 - No space
,应该是临时文件夹/tmp
没有足够的空间; - 想修改文件夹
/etc/mysql/my.cnf
中的参数tmpdir
命令改变临时文件夹;
bash
sudo nano /etc/mysql/my.cnf
# 以下是my.cnf文件中新增的内容
[mysqld]
tmpdir = /path_to_new_tmp
# 以上是my.cnf文件中新增的内容
sudo chown -R root:root /path_to_new_tmp
sudo chmod -R 1777 /path_to_new_tmp
- 但修改后重启MySQL服务时提示
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xeu mysql.service" for details.
查看log文件也没发现相关提示; - 经过测试(删除修改后的
tmpdir
参数即可启动MySQL服务成功),推测应该是新的临时文件夹出现了问题,但是权限也给了,为啥呢?
解决方法
- 搜索得知^1^,Linux内核安全模块
AppArmor
可能限制MySQL写入新的临时目录。AppArmor
配置文件定义程序的文件访问权限,而mysqld
的配置文件可能不允许写入指定的新临时目录。 - 要解决此问题,需要更新
mysqld
的AppArmor
配置文件,以允许MySQL写入新的临时目录。
bash
sudo vim /etc/apparmor.d/usr.sbin.mysqld
# 以下是usr.sbin.mysqld文件中新增的内容,以允许对新临时目录进行读写访问
# Allow data dir access
/path_to_new_tmp/ r,
/path_to_new_tmp/** rwk,
# 以上是usr.sbin.mysqld文件中新增的内容
sudo /etc/init.d/apparmor reload
sudo /etc/init.d/mysql restart
sudo systemctl restart mysql
# 检查tmpdir变量是否修改成功
mysql -u root -p[password] -e "SHOW VARIABLES LIKE 'tmpdir';"