【发布时间】:2012-08-16 15:44:47
【问题描述】:
我们的 Mysql 查询使用临时表,在此过程中创建临时文件。当前文件被写入/tmp。 mysql写入的temp文件夹的路径到底怎么改?
【问题讨论】:
我们的 Mysql 查询使用临时表,在此过程中创建临时文件。当前文件被写入/tmp。 mysql写入的temp文件夹的路径到底怎么改?
【问题讨论】:
你应该编辑你的 my.cnf
tmpdir = /whatewer/you/want
然后重启mysql
附:不要忘记为 mysql 用户授予/whatewer/you/want 的写入权限
【讨论】:
这是一个将 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
【讨论】:
这在文档中有回答:
Where MySQL Stores Temporary Files
在 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。
【讨论】:
tmpdir 而不是依赖环境变量。
如果您没有 apparmor 或 selinux 问题,但仍然收到错误代码 13:
mysql 必须能够访问完整路径。 IE。所有文件夹都必须是 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 = /somewhere/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
【讨论】:
您还可以设置TMPDIR 环境变量。
在某些情况下(在我的例子中是 Docker)设置环境变量比更新配置文件更方便。
【讨论】:
在 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
【讨论】: