2011-12-26 99 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

相關問題