Доступ запрещен для загрузки данных infile в MySQL

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Строка из Лиона дала мне очень хороший совет: в 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();

Ответ 6

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

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

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

БР,

AD

Ответ 7

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

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

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

sudo chown mysql:mysql /tmp/test.csv

Ответ 8

Я обнаружил, что загрузка таблиц MySQL может быть быстрой и безболезненной (я использовал скрипты менеджера моделей Python/Django):

1) создать таблицу со всеми столбцами VARCHAR (n) NULL, например:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);

2) удалить заголовки (первая строка) из csv, затем загрузить (если вы забудете LOCAL, вы получите "# 1045 - Доступ запрещен для пользователя 'user' @'localhost' (используя пароль: YES)"):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ->; Query OK, 119426 rows affected, 19962 warnings (3.41 sec)

3) изменить столбцы:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

вуаля!

Ответ 9

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