LOAD DATA INFILE Код ошибки: 13 - PullRequest
46 голосов
/ 18 ноября 2010

В моем удаленном MySQL, когда я пытаюсь выполнить этот запрос, я получаю код ошибки MySQL: 13.

Запрос -

LOAD DATA INFILE 
'/httpdocs/.../.../testFile.csv'
INTO TABLE table_temp
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r \\n'
(sku, qty);

Код ошибки: 13 Can't get stat of '/httpdocs/.../.../testFile.csv' (Errcode: 2)

а.База данных userlogin имеет все привилегии.

CREATE USER 'userName'@'%' IDENTIFIED BY '************';

GRANT ALL PRIVILEGES ON * . * TO 'userName'@'%' IDENTIFIED BY '************' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `userName\_%` . * TO 'userName'@'%';

b.Я также установил права доступа к файлам и папкам для chmod 777 (rwxrwxrwx) с помощью FTP Tool

Ответы [ 16 ]

97 голосов
/ 03 декабря 2012

Я знаю, что этот пост старый, но он все еще появляется в результатах поиска.Я не мог найти решение этой проблемы в Интернете, поэтому я решил выяснить это сам.Если вы используете Ubuntu, то есть программа под названием «Apparmor», которая не позволяет MySQL видеть файл.Вот что вам нужно сделать, если вы хотите, чтобы MySQL мог читать файлы из каталога "tmp":

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

Как только вы окажетесь в файле, вы увидите кучу каталогов, которыеMySQL можно использовать.Добавьте строку /tmp/** rwk в файл (я не уверен, что это имеет значение, где, но вот пример того, где я ее положил):

  /etc/mysql/*.pem r,

  /etc/mysql/conf.d/ r,

  /etc/mysql/conf.d/* r,

  /etc/mysql/*.cnf r,

  /usr/lib/mysql/plugin/ r,

  /usr/lib/mysql/plugin/*.so* mr,

  /usr/sbin/mysqld mr,

  /usr/share/mysql/** r,

  /var/log/mysql.log rw,

  /var/log/mysql.err rw,

  /var/lib/mysql/ r,

  /var/lib/mysql/** rwk,


  /tmp/** rwk,


  /var/log/mysql/ r,

  /var/log/mysql/* rw,

  /var/run/mysqld/mysqld.pid w,

  /var/run/mysqld/mysqld.sock w,

  /run/mysqld/mysqld.pid w,

  /run/mysqld/mysqld.sock w,

Теперь все, что вам нужно сделать, это перезагрузить Apparmor:

sudo /etc/init.d/apparmor reload

Заметьте, я использовал "vim", но замените его любым вашим любимым текстовым редактором, который вы знаете, как использовать.

52 голосов
/ 22 октября 2013

Добавление ключевого слова 'LOCAL' к моему запросу работает для меня:

LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name

Подробное описание ключевого слова можно найти здесь .

19 голосов
/ 18 ноября 2010

Обычно это проблема с правами доступа к файлу, но я вижу, что вы уже обращаетесь к ней в пункте b, но на всякий случай стоит обойтись.Другой вариант - использовать LOAD DATA LOCAL INFILE, который преодолевает многие из этих проблем с правами доступа к файлам.Чтобы использовать этот метод, вам нужно сначала скопировать файл локально (лучше всего в папке mysql).• Если указан LOCAL, файл читается клиентской программой на клиентском хосте и отправляется на сервер.

Недостаточно прав доступа к каталогу

Ошибкав этом примере это связано с тем, что файл, который вы пытаетесь импортировать, не находится в каталоге, который доступен для чтения пользователю, от имени которого работает сервер MySql.Обратите внимание, что все родительские каталоги нужного каталога должны быть доступны для чтения пользователю MySql, чтобы это работало.Сохранение файла в / tmp обычно работает, так как это обычно доступно для чтения (и записи) всем пользователям.Номер кода ошибки: 13. Источник

РЕДАКТИРОВАТЬ:

Помните, что вам понадобятся разрешения не только для папки, в которой находитсяфайл, но также и верхние каталоги.

Пример из этого сообщения на форумах MySql.

Если ваш файл содержался в следующем Strucutre: / tmp / import / site1/data.file

вам понадобится (думаю, 755 сработало) r + x для 'other' в этих каталогах:

/ tmp

/ tmp / import

А также два основных:

/ tmp / import / site1

/ tmp / import / site1 / data.file

Вам нужно, чтобы файл и каталог были доступны для чтения.Извините, если вы уже попробовали этот метод, но, возможно, стоит повторить ваши шаги, никогда не повредит дважды проверить.

14 голосов
/ 28 мая 2013

В файле конфигурации mysql есть одно свойство в разделе [mysqld] с именем - tmpdir

, например:

tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux)

и команда LOAD DATA INFILE может выполнять чтение и запись.только в этом месте.

, поэтому, если вы поместите файл в указанное место, LOAD DATA INFILE сможет легко читать / записывать любой файл.

Еще одно решение

мы также можем импортировать данные, выполнив следующую команду

load data local infile

В этом случае нет необходимости перемещать файл в tmpdirВы можете указать абсолютный путь к файлу, но для выполнения этой команды вам нужно изменить одно значение флага.Флаг

--local-infile

вы можете изменить его значение в командной строке при получении доступа к mysql

mysql -u username -p --local-infile=1

Cheers

5 голосов
/ 05 декабря 2014

Ошибка 13 - не что иное, как проблемы с разрешениями. Даже у меня была та же проблема , и я не смог загрузить данные в таблицу mysql, а затем сам решил проблему.

Вот решение:

По умолчанию

- local-infile имеет значение 0

, для использования LOAD DATA LOCAL INFILE он должен быть включен.

Итак Запустите mySQL вот так:

mysql -u username -p --local-infile

Это сделает LOCAL INFILE включенным во время запуска и, таким образом, не будет никаких проблем с его использованием!

5 голосов
/ 08 ноября 2013

Я использую Ubuntu 12.04, мне нужно было создать таблицу, а затем выполнить одно из следующих действий:

Использование local дает ошибку (mysql 5.5):

> LOAD DATA LOCAL INFILE "file.csv" INTO table inverter FIELDS TERMINATED BY ',';
ERROR 1148 (42000): The used command is not allowed with this MySQL version

Команда LOAD DATA INFILEпо умолчанию отключен по соображениям безопасности, включите его снова здесь, и он должен работать: https://stackoverflow.com/a/16286112/445131

Вы можете импортировать csv-файл, используя mysqlimport:

mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv

Обратите внимание на csv-файл должен иметь то же имя перед расширением, что и таблица.

2 голосов
/ 15 апреля 2016

У меня было много проблем, чтобы исправить это, есть две вещи, которые нужно сделать:

  • файл обновления /etc/mysql/my.cnf с local-infile =1 в двух местоположениях после [mysql] абзацев (это позволяет использовать команду LOCAL INFILE sql).

  • обновить с помощью sudo gedit /etc/apparmor.d/usr.sbin.mysqld, поэтому apparmor позволит вам записывать в специальные файлы /var/www/, добавляя строки:

/name of your directory/ r,

/name of your directory/* rw,

Имя вашего каталога может быть как /var/www/toto/ (это позволяет использовать каталог, в котором находятся ваши файлы).

2 голосов
/ 28 сентября 2014

Если вы используете Fedora / RHEL / CentOO, вы можете временно отключить SELinux:

setenforce 0

Загрузить данные и затем включить их обратно:

setenforce 1
1 голос
/ 09 февраля 2018

Если вы используете XAMPP на Mac, это сработало для меня:

Перемещение файла CSV / TXT в / Applications / XAMPP / xamppfiles / htdocs / следующим образом

LOAD DATA LOCAL INFILE '/Applications/XAMPP/xamppfiles/htdocs/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'
1 голос
/ 21 марта 2016

для пользователей Ubuntu

Я запускаю mysql 5.6.28 на Ubuntu 15.10 и просто столкнулся с точно такой же проблемой, у меня были все необходимые флаги в my.cnf tmpdir= / tmp local-infile = 1 перезапустил mysql, и я все равно получил бы LOAD DATA INFILE Код ошибки: 13

Точно так же, как Нельсон упомянул, что проблема была «apparmor», своего рода покровительственно mysql о разрешениях, я затем нашелрешение благодаря этому быстрому и простому учебнику.

в основном, при условии, что ваш каталог tmp будет /tmp:

Добавить новые записи tmpdir в / etc /apparmor.d / local / usr.sbin.mysqld

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

* добавить это

/tmp/ r,
/mnt/foo/tmp/** rw,

Обновить AppArmor

sudo service apparmor reload

Перезапустить MySQL

sudo service mysql restart

Надеюсь, это поможет немногим пользователям Ubuntu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...