37

我们的 Mysql 查询使用临时表,在此过程中创建临时文件。当前文件被写入/tmp。mysql写入的临时文件夹的路径究竟如何更改?

4

7 回答 7

62

你应该编辑你的 my.cnf

tmpdir = /whatewer/you/want

然后重新启动mysql

PS不要忘记给/whatewer/you/wantmysql用户写权限

于 2012-08-16T16:15:46.493 回答
44

这是将 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

于 2014-05-02T19:48:00.197 回答
5

这在文档中得到了回答:

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。

于 2012-08-16T15:46:39.163 回答
3

如果您没有 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
于 2018-08-20T15:20:01.930 回答
1

这可能对带有 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
于 2020-07-16T23:14:43.220 回答
0

在 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
于 2021-07-22T16:14:57.357 回答
0

您还可以设置TMPDIR环境变量。

在某些情况下(在我的例子中是 Docker),设置环境变量比更新配置文件更方便。

于 2020-09-13T19:03:04.057 回答