Mysql Не удается создать / записать в файл ошибка № 13 - PullRequest
5 голосов
/ 26 декабря 2011

Я создал представление Django, которое возвращает некоторые данные после чтения из базы данных MySql. Когда я пытаюсь извлечь около 6000 строк из базы данных, все работает нормально, и представление возвращает HttpResponse, как и ожидалось. Однако при попытке получить 7000+ строк я получаю следующую ошибку

(1, "Can't create/write to file '/home/nipun/mysql_temp/MYzplJok' (Errcode: 13)")


Ранее я думал, что ошибка может быть связана с тем, что для / temp было исчерпано пространство, поэтому я изменил настройку tempdir в my.cnf
Я также гарантировал, что новый 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)"))

EDIT
Согласно комментарию, я попробовал это в моей подсказке MySQL

mysql> CREATE TEMPORARY TABLE t (i int);
ERROR 1005 (HY000): Can't create table 't' (errno: 13)

Так что теперь по сути вопрос о том, как разрешить MySQL писать во временный каталог

Ответы [ 4 ]

7 голосов
/ 24 октября 2012

Вероятно, это проблема с разрешением для временной папки, используемой Mysql.

Вы можете найти папку, используемую Mysql для временных операций, в файле конфигурации в /etc/mysql/my.cnf следующим образом:

tmpdir          = /tmp

Как видите, используемая временная папка по умолчанию - "/tmp".

Привилегии должны быть:

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

Так что любой, включая пользователя «mysql», может его использовать. Если не правильно установлен, следующая команда будет делать трюк:

chmod 0777 /tmp

Надеюсь, это поможет!

1 голос
/ 22 ноября 2018

Если после предоставления необходимых разрешений на запись для нового 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, и все будет хорошо.

1 голос
/ 27 декабря 2011

Вы настроили tmpdir для mysql так, чтобы он указывал на каталог, в который у сервера нет разрешения на запись.

Для небольших файловых сортировок MySQL использует буфер в памяти, но для больших использует файлы на диске (в tmpdir).

В любом случае, это ошибка системного администратора (а не ошибка программирования), устанавливающая в MySQL tmpdir для указания на каталог без записи.

0 голосов
/ 16 апреля 2018

Попробуйте дать пользователю mysql доступ к каталогу с помощью следующей команды:

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

Это сработало для меня (: *

...