Mysql 无法创建/写入文件错误#13
Posted
技术标签:
【中文标题】Mysql 无法创建/写入文件错误#13【英文标题】:Mysql Can't create/write to file error#13 【发布时间】:2012-01-27 20:03:30 【问题描述】:我创建了一个 Django 视图,它在从 mysql DB 读取后返回一些数据。当我尝试从数据库中获取大约 6000 行时,一切正常,视图按预期返回 HttpResponse。但是当我尝试获取7000+ 行我收到以下错误
(1, "Can't create/write to file '/home/nipun/mysql_temp/MYzplJok' (Errcode: 13)")
早些时候我认为该错误可能是由于 /temp 的空间耗尽,所以我更改了 my.cnf 中的 tempdir 设置 我还通过更改所有权确保我可以写入新的 tmpdir /home/nipun/mysql_temp 及其父目录。 虽然这不是 Django 问题,但这里是视图
def query_json(request):
from django.utils import simplejson
objects=Publisher.objects.filter(location='ROOM_01',sensor_name='CPU_TEMPERATURE').order_by('-id')[0:9000]
json = simplejson.dumps( ["reading": float(o.reading),
"timestamp": str(o.timestamp)
for o in objects] )
return HttpResponse(json,mimetype="application/json")
所以在过滤器中将 9000 更改为 6000 可以正常工作。 Django 堆栈跟踪中提供了有关该错误的更多信息
errorclass
<class '_mysql_exceptions.InternalError'>
errorvalue
InternalError(1, "Can't create/write to file '/home/nipun/mysql_temp/MYuotga9' (Errcode: 13)")
error
(<class '_mysql_exceptions.InternalError'>,
InternalError(1, "Can't create/write to file '/home/nipun/mysql_temp/MYuotga9' (Errcode: 13)"))
编辑 根据评论,我在我的 MySQL 提示符下尝试了这个
mysql> CREATE TEMPORARY TABLE t (i int);
ERROR 1005 (HY000): Can't create table 't' (errno: 13)
所以现在本质上是一个如何允许 MySQL 写入临时目录的问题
【问题讨论】:
errno 13
在我的机器上是 EACCESS
(权限被拒绝)。您确定您已设置权限,以便用户 Django 以可以写入文件的方式运行,而不仅仅是您吗?
当我尝试抓取 6000 行或更少的行时,它可以工作。所以我猜权限很好
这可能是因为当你抓取超过 6000 行时 MySQL 客户端只需要创建一个临时文件...
所以我现在也在 /home 和它的子目录上做了一个 chmod 777,特别是在 tmpdir 上。仍然得到同样的错误
【参考方案1】:
确保您的 sql 帐户具有文件权限
输出文件到临时目录。例如 'INTO OUTFILE /tmp/yourfile' 或者 mysql 可以访问的目录
要在您的站点中下载文件,只需将“/tmp”符号链接到您的公共 html 文件夹中
注意:如果你因为权限问题不能删除你的文件,那么你的文件名必须是唯一的。
【讨论】:
【参考方案2】:如果在向新的 tmpdir 授予必要的写入权限后,您仍然遇到相同的错误 - 因此 mysql 无法启动 - 您可能启用了 AppArmor。这样做:
sudo vim /etc/apparmor.d/local/usr.sbin.mysqld
当然,您可以使用 vim 以外的任何文本编辑器,例如 nano。请注意,末尾的usr.sbin.mysqld
对应于您通过执行which mysql
或which mysqld
(/
替换为.
)得到的结果。打开文件后,您会在顶部看到一些 cmets,例如:
# Site-specific additions and overrides for usr.sbin.mysqld.
# For more details, please see /etc/apparmor.d/local/README.
然后放在这些 cmets 之后:
/path/to/new/tmp/dir/ r,
/path/to/new/tmp/dir/** rwk,
然后执行:sudo service apparmor reload
。现在尝试启动 mysql:sudo service mysql start
,你应该很高兴。
【讨论】:
如果不是因为这个答案,我就不会通过已接受(也很有帮助)答案的步骤。 这个是正确答案,谢谢分享app armour config应该放什么【参考方案3】:可能是Mysql使用的临时文件夹权限问题。
您可以在/etc/mysql/my.cnf
的配置文件中找到Mysql用于临时操作的文件夹,如下所示:
tmpdir = /tmp
如您所见,默认使用的临时文件夹是“/tmp”。
权限应该是:
drwxrwxrwt 9 root root 4096 oct. 24 15:39 tmp/
所以任何人,包括“mysql”用户,都可以使用它。 如果设置不正确,以下命令可以解决问题:
chmod 0777 /tmp
希望这会有所帮助!
【讨论】:
通常它实际上应该是chmod 1777 /tmp
(1 设置“粘性”位)
@Lambart 在大多数现代发行版上的粘性位不被尊重 :)【参考方案4】:
尝试通过以下命令让 mysql 用户访问该目录:
chown -R mysql:mysql /home/nipun/mysql_temp/
这对我有用(:
【讨论】:
【参考方案5】:您已将 mysql 的 tmpdir 配置为指向服务器无权写入的目录。
对于小型文件排序,MySQL 使用内存缓冲区,但对于较大的文件排序,则使用磁盘上的文件(在 tmpdir 中)。
在任何情况下,将 MySQL tmpdir 设置为指向不可写目录都是系统管理员错误(不是编程错误)。
【讨论】:
我什至尝试了everythingmysql.ning.com/profiles/blogs/… 仍然不断收到同样的错误 与运行Django的用户无关。 MySQL 服务器需要能够写入其临时目录。您可以通过创建临时表(例如 CREATE TEMPORARY TABLE t (i int); )从 mysql 命令行轻松测试这一点 我无法创建临时表,在 MySQL 提示符 mysql> CREATE TEMPORARY TABLE t (i int) 上试过这个;错误 1005 (HY000): 无法创建表 't' (errno: 13)以上是关于Mysql 无法创建/写入文件错误#13的主要内容,如果未能解决你的问题,请参考以下文章
MAMP Pro 错误:无法写入 MySQL 配置文件 my.cnf