Mysql无法创建/写入文件错误#13

时间:2011-12-26 06:12:42

标签: mysql django mysql-error-1064 mysql-python

我创建了一个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写入临时目录

的问题

5 个答案:

答案 0 :(得分:7)

这可能是Mysql使用的临时文件夹的权限问题。

您可以在/etc/mysql/my.cnf中的配置文件中找到Mysql用于临时操作的文件夹:

tmpdir          = /tmp

如您所见,默认使用的临时文件夹是“/ tmp”。

特权应该是:

drwxrwxrwt   9 root root  4096 oct.  24 15:39 tmp/

所以任何人,包括“mysql”用户,都可以使用它。 如果设置不正确,以下命令可以解决问题:

chmod 0777 /tmp

希望这有帮助!

答案 1 :(得分:1)

您已将mysql的tmpdir配置为指向服务器无权写入的目录。

对于小型文件排序,MySQL使用内存缓冲区,但较大的文件使用光盘上的文件(在tmpdir中)。

在任何情况下,设置MySQL tmpdir指向不可写目录是系统管理员错误(不是编程错误)。

答案 2 :(得分:0)

尝试通过以下命令给mysql用户访问该目录:

chown -R mysql:mysql /home/nipun/mysql_temp/

这对我有用(:

答案 3 :(得分:0)

如果在授予新的tmpdir必要的写权限后,您仍然遇到相同的错误-并且mysql因此无法启动-您可能启用了AppArmor。也是这样:

sudo vim /etc/apparmor.d/local/usr.sbin.mysqld

当然,您可以使用vim以外的任何文本编辑器,例如nano。请注意,最后的usr.sbin.mysqld对应于您通过执行which mysqlwhich mysqld/.所获得的结果)。打开文件后,您会在顶部看到一些注释,例如:

# Site-specific additions and overrides for usr.sbin.mysqld.
# For more details, please see /etc/apparmor.d/local/README.

然后在这些评论之后:

/path/to/new/tmp/dir/ r,
/path/to/new/tmp/dir/** rwk,

然后执行:sudo service apparmor reload。现在尝试启动mysql:sudo service mysql start,您应该会很好。

答案 4 :(得分:0)

  1. 确保您的sql帐户具有文件权限

  2. Outfile进入临时目录。例如'INTO OUTFILE / tmp / yourfile'或mysql有权访问的命令

  3. 要在您的网站中下载文件,只需将“ / tmp”符号链接到您的公共html文件夹中

注意:如果由于权限问题而无法删除文件,则文件名必须唯一。

相关问题