我创建了一个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写入临时目录
的问题答案 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 mysql
或which 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)
确保您的sql帐户具有文件权限
Outfile进入临时目录。例如'INTO OUTFILE / tmp / yourfile'或mysql有权访问的命令
要在您的网站中下载文件,只需将“ / tmp”符号链接到您的公共html文件夹中
注意:如果由于权限问题而无法删除文件,则文件名必须唯一。