MySQL错误1005(HY000):无法创建表'tmp'(errno: 13)

16
我正在Ubuntu9.10上运行Mysql,Mysql进程以root身份运行,我使用root账户登录Mysql,并赋予其所有权限,我在使用我的数据库(而不是mysql)时可以创建表格,但是当我尝试创建临时表格时,出现以下错误:
ERROR 1005 (HY000): Can't create table 'tmp' (errno: 13)
这是查询语句:
CREATE TEMPORARY TABLE tmp (id int);
我的硬盘有足够的空间,已经授予所有权限(包括var/lib/mysql有mysql权限)。
有什么想法吗?
谢谢,
Koby

3
在命令行中运行命令 perror 13 将告诉您该错误代码的含义。在 Linux 上,错误代码 13 是“权限被拒绝”。 - Powerlord
8个回答

36

几周前我也遇到同样的问题。文件系统上的数据库文件夹归属错误的用户。 简单的 chown -R mysql:mysql /var/lib/mysql/database_name 就解决了问题!

这里有详细解释:http://www.dinosources.eu/2010/10/mysql-cant-create-table (该文章是意大利语,但讲解十分清晰易懂)

祝好


1
这对我有用。我从另一个驱动器复制了目录,但它们的所有者不正确。 - Mike
1
如果您使用的是Mac系统,请尝试执行以下命令:sudo chown -R mysql:mysql /usr/local/mysql/data/my_database - keverly

5

嗯,... 在 /etc/mysql/my.cnf 文件中有一个用于临时文件的文件夹 "tmp",默认情况下为 /tmp(来自 root),并且没有 mysql 权限。 使用 chmod 0777 /tmp 命令即可解决问题。


2
在Fedora 16上,我遇到了/tmp权限正确、上下文正确以及足够的磁盘空间等问题,但还是出现了上述错误。
经过一天的折腾,我发现MySQL服务的systemd配置中有一个设置问题。
/etc/systemd/system/multi-user.target.wants/mysqld.service文件中,检查是否有PrivateTmp=true的设置。这个改变会强制MySQL使用/tmp/systemd-namespace-XXXXX子目录,而不是直接将文件放入/tmp中。显然,MySQL不喜欢这样做,并且对于任何需要创建临时文件的查询都会因为权限被拒绝而失败(错误代码13)。
您可以按如下方式覆盖此设置:
cat >> /etc/systemd/system/mysqld.service << END_CONFIG
.include /lib/systemd/system/mysqld.service
[Service]
PrivateTmp=false
END_CONFIG

然后通过运行以下命令重新加载配置:systemctl daemon-reload,并重新启动MySQL。


这个解决方案今天和去年一样正确!做得好。mysqld仍然不喜欢privatetmp。 - cixelsyd

1

我曾遇到这些(errno: 13)错误,只有在查看/var/log/syslog后才找到解决方法,所以我的建议是:

tail -f /var/log/syslog

在尝试访问数据库后,请查看是否与数据库文件有关,就像在我的情况下一样。

apparmor=[DENIED]

这意味着你需要处理apparmor,但在你的情况下可能是其他东西。

1
今天我在我的Amazon Red Hat实例上遇到了同样的问题。我既不能执行mysql shell中的描述(mysql describe),也不能执行mysqldump。为了解决这个问题,我尝试了最明显的解决方案:
# chown root:root /tmp -v
# chmod 1777 /tmp -v
# /etc/init.d/mysqld restart

但这并没有起作用。在 /var/log/mysqld.log 中,我仍然看到:
141022 10:23:35  InnoDB: Error: unable to create temporary file; errno: 13
141022 10:23:35 [ERROR] Plugin 'InnoDB' init function returned error.
141022 10:23:35 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.

事实证明是SELinux不允许MySQL守护程序写入/tmp。因此,我所做的就是:

# getenforce 
Enforcing

要验证SELinux是否以强制模式运行(您可以在此处阅读更多相关信息)。这个快速的解决方案是切换到SELinux宽容模式:

# setenforce 0
# getenforce 
Permissive
# /etc/init.d/mysqld restart

上面的方法解决了我的问题。
请注意,如果您正在处理强化生产环境,当您从强制模式切换到宽容模式时,应非常小心。还请注意,在重新启动后,此特定设置将被重置。

1

0

根据我的情况:

    # semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"
    # restorecon -Rv /datadir
    #chcon -R -t mysqld_db_t /datadir

解决了我的问题。


-1
如果在Linux上使用XAMPP安装了PhpMyAdmin,则可以在以下路径中设置用户:
sudo chown -R mysql:mysql /opt/lampp/var/mysql/my_database

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接