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

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写入临时目录的问题

use*_*398 8

它可能是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)

希望这可以帮助 !


Lan*_*ith 7

如果在向新的 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.
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你应该很高兴。

  • 如果不是这个答案,我就不会通过接受的(也有帮助的)答案的步骤。 (2认同)