我们的 Mysql 查询使用临时表,在此过程中创建临时文件。当前文件被写入/tmp。mysql写入的临时文件夹的路径究竟如何更改?
7 回答
你应该编辑你的 my.cnf
tmpdir = /whatewer/you/want
然后重新启动mysql
PS不要忘记给/whatewer/you/want
mysql用户写权限
这是将 mysqld tmpdir 从 /tmp 移动到 /run/mysqld 的示例,该示例已在 Ubuntu 13.04 上存在并且是 tmpfs(内存/ram):
sudo vim /etc/mysql/conf.d/local.cnf
添加:
[mysqld]
tmpdir = /run/mysqld
然后:
sudo service mysql restart
核实:
SHOW VARIABLES LIKE 'tmpdir';
==================================================== =================
如果您在 MySQL 重新启动时收到错误,您可能启用了 AppArmor:
sudo vim /etc/apparmor.d/local/usr.sbin.mysqld
添加:
# Site-specific additions and overrides for usr.sbin.mysqld.
# For more details, please see /etc/apparmor.d/local/README.
/run/mysqld/ r,
/run/mysqld/** rwk,
然后:
sudo service apparmor reload
来源: http: //2bits.com/articles/reduce-your-servers-resource-usage-moving-mysql-temporary-directory-ram-disk.html,https : //blogs.oracle.com/jsmyth/entry/ apparmor_and_mysql
这在文档中得到了回答:
在 Unix 上,MySQL 使用 TMPDIR 环境变量的值作为存储临时文件的目录的路径名。如果没有设置 TMPDIR,MySQL 使用系统默认值,通常是 /tmp、/var/tmp 或 /usr/tmp。
在 Windows、Netware 和 OS2 上,MySQL 按顺序检查 TMPDIR、TEMP 和 TMP 环境变量的值。对于找到的第一个设置,MySQL 使用它并且不检查剩余的那些。如果没有设置 TMPDIR、TEMP 或 TMP,MySQL 使用 Windows 系统默认值,通常为 C:\windows\temp。
如果您没有 apparmor 或 selinux 问题,但仍然收到错误代码 13:
mysql 必须能够访问完整路径。即所有文件夹都必须是 mysql 可访问的,而不仅仅是您打算指向的文件夹。
例如,您尝试在 mysql 配置中使用它:tmp = /some/folder/on/disk
# will work, as user root:
mkdir -p /some/folder/on/disk
chown -R mysql:mysql /some
# will not work, also as user root:
mkdir -p /some/folder/on/disk
chown -R mysql:mysql /some/folder/on/disk
这可能对带有 AppArmor 的 MySql 有帮助
停止mysql:
sudo /etc/init.d/mysql stop
创建名为/somewhere/tmp的目录
编辑配置:
sudo vim /etc/mysql/my.cnf
# 也许sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
改变
tmpdir = /某处/tmp/
然后
sudo vim /etc/apparmor.d/usr.sbin.mysqld
添加
# Allow data dir access
/somewhere/ r,
/somewhere/** rwk,
sudo chown -R root:root /somewhere
sudo chmod -R 1777 /某处
重新开始
sudo /etc/init.d/apparmor reload
sudo /etc/init.d/mysql restart
在 centos 8 上适用于 5.7
mkdir /tmp/1 /tmp/1
semanage fcontext -a -t mysqld_db_t "/tmp/1(/.*)?"
restorecon -Rv /tmp/1
semanage fcontext -a -t mysqld_db_t "/tmp/2(/.*)?"
restorecon -Rv /tmp/2
to my.cnf tmpdir=/tmp/1:/tmp/2
sudo service mysql restart
您还可以设置TMPDIR
环境变量。
在某些情况下(在我的例子中是 Docker),设置环境变量比更新配置文件更方便。