доступ запрещен для загрузки данных в MySQL - PullRequest
92 голосов
/ 08 февраля 2010

Я все время использую MySQL запросы в PHP, но когда я пытаюсь загрузить LOAD DATA INFILE, я получаю следующую ошибку #1045 - Access denied for user 'user'@'localhost' (using password: YES) Кто-нибудь знает, что это значит?

Ответы [ 8 ]

172 голосов
/ 12 ноября 2010

Я тоже столкнулся с этой проблемой. Мне пришлось добавить «LOCAL» в мой оператор SQL.

Например, это дает проблему с разрешением:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Добавьте "LOCAL" в ваше заявление, и проблема с разрешениями должна исчезнуть. Вот так:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

27 голосов
/ 27 мая 2013

У меня была эта проблема. Я искал вокруг и не нашел удовлетворительного ответа. Ниже подведены итоги моих поисков.

Ошибка отказа в доступе может означать, что:

  • 'user' @ 'localhost' не имеет привилегии FILE (GRANT FILE on *.* to user@'localhost'); или
  • файл, который вы пытаетесь загрузить, не существует на компьютере с сервером mysql (если используется LOAD DATA INFILE); или
  • файл, который вы пытаетесь загрузить, не существует на вашем локальном компьютере (если используется LOAD DATA LOCAL INFILE); или
  • файл, который вы пытаетесь загрузить, не доступен для чтения всему миру (вам нужно, чтобы файл и все родительские каталоги были доступны для чтения всем пользователям: каталог chmod 755;
18 голосов
/ 02 апреля 2017

Попробуйте использовать эту команду:

load data local infile 'home/data.txt' into table customer;

Это должно работать. Это сработало в моем случае.

9 голосов
/ 09 февраля 2010

Убедитесь, что у вашего пользователя MySQL есть привилегия FILE.

Если вы используете общий веб-хостинг, есть вероятность, что он заблокирован вашим хостинг-провайдером.

3 голосов
/ 09 августа 2013

Строка из Лиона дала мне очень хороший совет: в Windows нам нужно использовать слэши, а не обратную косую черту. Этот код работает для меня:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();
2 голосов
/ 21 августа 2017

Это также случилось со мной, и, несмотря на то, что я выполнил все шаги, описанные Ямиром в его посте, я не смог заставить его работать.

Файл находился в /tmp/test.csv с разрешениями 777.У пользователя MySQL были права доступа к файлам, опция LOCAL не была разрешена моей версией MySQL, поэтому я застрял.

Наконец я смог решить проблему, выполнив:

sudo chown mysql:mysql /tmp/test.csv
2 голосов
/ 11 мая 2017

Я столкнулся с той же проблемой и решил ее, выполнив следующие шаги:

  • активировать переменную load_infile
  • Грандиозное разрешение файла для моего пользовательского пользователя MySQL
  • деактивировать переменную secure_file_priv (мой файл был загружен веб-сервером в папку / tmp, которая, конечно, не является защищенным каталогом myslq / var / lib / mysql-file)

Для этого третьего пункта вы можете обратиться к: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR

AD

0 голосов
/ 08 февраля 2010

Возможно, это означает, что вы указали неверный пароль для 'user'@'localhost'.

...