Nip*_*tra 6 mysql django mysql-python mysql-error-1064
我创建了一个Django视图,它在从MySql DB读取后返回一些数据.当我尝试从数据库中获取大约6000行时,一切正常并且视图返回HttpResponse正如预期的那样.但是当我尝试获取7000+行时我收到以下错误
(1, "Can't create/write to file '/home/nipun/mysql_temp/MYzplJok' (Errcode: 13)")
Run Code Online (Sandbox Code Playgroud)
之前我认为错误可能是因为/ 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")
Run Code Online (Sandbox Code Playgroud)
所以在过滤器中更换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)"))
Run Code Online (Sandbox Code Playgroud)
编辑
根据评论,我在我的MySQL提示符上尝试了这个
mysql> CREATE TEMPORARY TABLE t (i int);
ERROR 1005 (HY000): Can't create table 't' (errno: 13)
Run Code Online (Sandbox Code Playgroud)
所以它现在基本上是如何允许MySQL写入临时目录的问题
它可能是Mysql使用的临时文件夹的权限问题.
您可以在配置文件中找到Mysql用于临时操作的文件夹,/etc/mysql/my.cnf如下所示:
tmpdir = /tmp
Run Code Online (Sandbox Code Playgroud)
如您所见,默认情况下使用的临时文件夹是"/ tmp".
特权应该是:
drwxrwxrwt 9 root root 4096 oct. 24 15:39 tmp/
Run Code Online (Sandbox Code Playgroud)
所以任何人,包括"mysql"用户,都可以使用它.如果设置不正确,以下命令可以解决问题:
chmod 0777 /tmp
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 !
如果在向新的 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.
Run Code Online (Sandbox Code Playgroud)
然后把这些评论放在后面:
/path/to/new/tmp/dir/ r,
/path/to/new/tmp/dir/** rwk,
Run Code Online (Sandbox Code Playgroud)
然后做:sudo service apparmor reload。现在尝试启动 mysql :sudo service mysql start你应该很高兴。
| 归档时间: |
|
| 查看次数: |
25880 次 |
| 最近记录: |