ERROR 1005 (HY000): Can't create table 'tmp' (errno: 13)
这是查询语句:
CREATE TEMPORARY TABLE tmp (id int);
我的硬盘有足够的空间,已经授予所有权限(包括var/lib/mysql有mysql权限)。
有什么想法吗?
谢谢,
Koby
几周前我也遇到同样的问题。文件系统上的数据库文件夹归属错误的用户。
简单的 chown -R mysql:mysql /var/lib/mysql/database_name
就解决了问题!
这里有详细解释:http://www.dinosources.eu/2010/10/mysql-cant-create-table (该文章是意大利语,但讲解十分清晰易懂)
祝好
sudo chown -R mysql:mysql /usr/local/mysql/data/my_database
- keverly嗯,... 在 /etc/mysql/my.cnf 文件中有一个用于临时文件的文件夹 "tmp",默认情况下为 /tmp(来自 root),并且没有 mysql 权限。 使用 chmod 0777 /tmp 命令即可解决问题。
/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。
我曾遇到这些(errno: 13)错误,只有在查看/var/log/syslog后才找到解决方法,所以我的建议是:
tail -f /var/log/syslog
在尝试访问数据库后,请查看是否与数据库文件有关,就像在我的情况下一样。
apparmor=[DENIED]
# chown root:root /tmp -v
# chmod 1777 /tmp -v
# /etc/init.d/mysqld restart
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
您在config.ini中设置了MaxNoOfOrderedIndexes属性吗? 它的默认值是128,所以如果您有很多表要创建,则最后一个表可能无法被创建。 参见: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxnooforderedindexes
根据我的情况:
# semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"
# restorecon -Rv /datadir
#chcon -R -t mysqld_db_t /datadir
解决了我的问题。
perror 13
将告诉您该错误代码的含义。在 Linux 上,错误代码 13 是“权限被拒绝”。 - Powerlord