2011-12-26 63 views
4

我创建了一个Django视图,它在从MySql DB读取数据后返回一些数据。当我尝试从数据库中获取大约6000行时,一切正常,视图返回的HttpResponse的是expected.However我尝试获取7000+行我碰到下面的错误
Mysql无法创建/写入文件错误#13

(1, "Can't create/write to file '/home/nipun/mysql_temp/MYzplJok' (Errcode: 13)") 


早些时候,我认为错误可能是由于空间越来越用尽/温度,所以我改变了my.cnf中的tempdir设置
我还确保新的tmpdir/home/nipun/mysql_temp a nd通过更改所有权,它的父目录可由我写入。 虽然这不是一个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写入临时目录的问题

+0

'errno 13'是我的机器上的'EACCESS'(权限被拒绝)。你确定你已经设置了权限,所以用户Django运行的可以写入文件,而不仅仅是你? – 2011-12-26 06:18:46

+0

当我尝试和抢6000行或更少,它的作品。所以我猜的权限是好的 – 2011-12-26 06:20:32

+0

这可能是因为MySQL客户端只需要创建一个临时文件,当你抓取超过6000行... – 2011-12-26 06:23:21

回答

7

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

您可以找到MySQL使用的临时操作在配置文件/etc/mysql/my.cnf这样的文件夹:
tmpdir = /tmp
正如你所看到的,在默认情况下,使用临时文件夹是“/ tmp”。

特权应该是:
drwxrwxrwt 9 root root 4096 oct. 24 15:39 tmp/ d
所以任何人,包括 “mysql的” 用户,可以使用它。 如果没有正确设置,下面的命令会诀窍:
chmod 0777 /tmp

希望这会有所帮助!

+0

OP错误包括路径:'/ home/nipun/mysql_temp'。 – 2012-10-24 14:38:08

+1

一般它应该是'chmod 1777/tmp'(1套'sticky'bit) – Lambart 2013-10-29 01:26:56

+0

@Lambart在最现代的发行版粘性位上没有荣誉:) – ceph3us 2016-02-26 21:00:52

1

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

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

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

+0

我什至尝试http://everythingmysql.ning.com/profiles/blogs/using-tmpfs-for-mysqls-tmpdir仍然继续得到相同的错误 – 2011-12-27 02:53:45

+0

这是没有什么用Django运行的用户来完成。 MySQL服务器需要能够写入其临时目录。你可以通过创建一个临时表(例如CREATE TEMPORARY TABLE t(i int);)来从mysql命令行轻松地测试这个问题: – MarkR 2011-12-27 08:07:11

+0

我无法创建临时表,在MySQL提示符下尝试了这一点mysql> CREATE TEMPORARY TABLE t(i INT); 错误1005(HY000):无法创建表't'(errno:13) – 2011-12-27 11:52:34

相关问题