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

Posted

技术标签:

【中文标题】Mysql 无法创建/写入文件错误#13【英文标题】:Mysql Can't create/write to file error#13 【发布时间】:2012-01-27 20:03:30 【问题描述】:

我创建了一个 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 写入临时目录的问题

【问题讨论】:

errno 13 在我的机器上是 EACCESS(权限被拒绝)。您确定您已设置权限,以便用户 Django 以可以写入文件的方式运行,而不仅仅是您吗? 当我尝试抓取 6000 行或更少的行时,它可以工作。所以我猜权限很好 这可能是因为当你抓取超过 6000 行时 MySQL 客户端只需要创建一个临时文件... 所以我现在也在 /home 和它的子目录上做了一个 chmod 777,特别是在 tmpdir 上。仍然得到同样的错误 【参考方案1】:

    确保您的 sql 帐户具有文件权限

    输出文件到临时目录。例如 'INTO OUTFILE /tmp/yourfile' 或者 mysql 可以访问的目录

    要在您的站点中下载文件,只需将“/tmp”符号链接到您的公共 html 文件夹中

注意:如果你因为权限问题不能删除你的文件,那么你的文件名必须是唯一的。

【讨论】:

【参考方案2】:

如果在向新的 tmpdir 授予必要的写入权限后,您仍然遇到相同的错误 - 因此 mysql 无法启动 - 您可能启用了 AppArmor。这样做:

sudo vim /etc/apparmor.d/local/usr.sbin.mysqld

当然,您可以使用 vim 以外的任何文本编辑器,例如 nano。请注意,末尾的usr.sbin.mysqld 对应于您通过执行which mysqlwhich mysqld/ 替换为.)得到的结果。打开文件后,您会在顶部看到一些 cmets,例如:

# Site-specific additions and overrides for usr.sbin.mysqld.
# For more details, please see /etc/apparmor.d/local/README.

然后放在这些 cmets 之后:

/path/to/new/tmp/dir/ r,
/path/to/new/tmp/dir/** rwk,

然后执行:sudo service apparmor reload。现在尝试启动 mysql:sudo service mysql start,你应该很高兴。

【讨论】:

如果不是因为这个答案,我就不会通过已接受(也很有帮助)答案的步骤。 这个是正确答案,谢谢分享app armour config应该放什么【参考方案3】:

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

您可以在/etc/mysql/my.cnf的配置文件中找到Mysql用于临时操作的文件夹,如下所示:

tmpdir          = /tmp

如您所见,默认使用的临时文件夹是“/tmp”。

权限应该是:

drwxrwxrwt   9 root root  4096 oct.  24 15:39 tmp/

所以任何人,包括“mysql”用户,都可以使用它。 如果设置不正确,以下命令可以解决问题:

chmod 0777 /tmp

希望这会有所帮助!

【讨论】:

通常它实际上应该是chmod 1777 /tmp(1 设置“粘性”位) @Lambart 在大多数现代发行版上的粘性位不被尊重 :)【参考方案4】:

尝试通过以下命令让 mysql 用户访问该目录:

chown -R mysql:mysql /home/nipun/mysql_temp/

这对我有用(:

【讨论】:

【参考方案5】:

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

对于小型文件排序,MySQL 使用内存缓冲区,但对于较大的文件排序,则使用磁盘上的文件(在 tmpdir 中)。

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

【讨论】:

我什至尝试了everythingmysql.ning.com/profiles/blogs/… 仍然不断收到同样的错误 与运行Django的用户无关。 MySQL 服务器需要能够写入其临时目录。您可以通过创建临时表(例如 CREATE TEMPORARY TABLE t (i int); )从 mysql 命令行轻松测试这一点 我无法创建临时表,在 MySQL 提示符 mysql> CREATE TEMPORARY TABLE t (i int) 上试过这个;错误 1005 (HY000): 无法创建表 't' (errno: 13)

以上是关于Mysql 无法创建/写入文件错误#13的主要内容,如果未能解决你的问题,请参考以下文章

MySQL在文本文件上写入

MAMP Pro 错误:无法写入 MySQL 配置文件 my.cnf

创建后写入新的文本文件

ionic build android的错误:copyFileSync:无法写入目标文件

Blueprism 将集合写入 Excel 文件问题

无法写入文件 pri:无法在 QT mac os 中创建父目录