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


105

Я все время использую запросы MySQL в PHP, но когда я пытаюсь

LOAD DATA INFILE

Я получаю следующую ошибку

# 1045 - Доступ запрещен для пользователя 'user' @ 'localhost' (с паролем: YES)

Кто-нибудь знает что это значит?

Ответы:


197

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

Например, это дает проблему с разрешением:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Добавьте LOCALк своему утверждению, и проблема с разрешениями должна исчезнуть. Вот так:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
Это другое дело. Он загружает ваш файл на сервер во временном каталоге. Иногда это необходимо, но если файл infile уже находится на сервере MySQL, вы просто выполняете избыточную работу.
jeffcook2150

1
да, это помогло мне, я перенаправлял порт сервера базы данных по ssh, и я предполагаю, что он искал файл на удаленном сервере базы данных без ЛОКАЛЬНОЙ части
Майк

2
@jeremysawesome для меня это вызывает следующую ошибку: Код ошибки: 1148 Используемая команда не разрешена в этой версии MySQL. Я попробовал несколько ответов на эту проблему, например, изменил файл mysql на local-infile = 1, и это тоже не удалось.
OrwellHindenberg

обновление mySQL до 6.2.5 решило эту проблему для меня
Оруэлл Хинденберг

4
вам также может потребоваться вызвать mysql с --local-infileопцией.
shabbychef

32

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

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

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

+1: Это сработало для меня: файл, который вы пытаетесь загрузить, не доступен для чтения всем (вам нужно, чтобы файл и все родительские каталоги были доступны для чтения всем: каталог chmod 755; и chmod 744 file.dat) . Я не менял разрешения для всех своих каталогов
gavdotnet 04

1
Пользователь Татьяна указывает, что вы не можете предоставить привилегию FILE для каждой базы данных, только для всего сервера. Команда предоставления будет выглядеть так: «GRANT FILE on . To user @ 'localhost' IDENTIFIED BY 'password');»
JAL

3
@JAL Я думаю, вы имеете в виду "ПРЕДОСТАВИТЬ ФАЙЛ НА *. * Пользователю ..." - вероятно, символы звездочки были удалены
Eugene M


19

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

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

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


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Стюарт

@Stewart, удалите "local" из приведенной выше команды. Более поздние версии mysql, похоже, не поддерживают этот флаг, когда для глобальной переменной local_infile установлено значение «ON» (как показано ниже). Таким образом, команда будет; mysql> загрузить данные из файла 'home / data.txt' в таблицу customer; + --------------- + ------- + | Variable_name | Значение | + --------------- + ------- + | local_infile | ВКЛ | + --------------- + ------- +
Камран Хайдер

@KamranHyder Похоже, у тебя есть хороший ответ. Почему бы не добавить его как полный ответ?
Стюарт

10

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

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


На общем веб-хостинге: было бы полезно использовать "ЗАГРУЗИТЬ ЛОКАЛЬНЫЙ ИНФАЙЛ ДАННЫХ"?
Питер

3

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

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

  • активировать переменную 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,

ОБЪЯВЛЕНИЕ


2

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

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

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

sudo chown mysql:mysql /tmp/test.csv

2

Я нашел простой, если вы используете командную строку

Войти какmysql -u[username] -p[password] --local-infile

затем SET GLOBAL local_infile = 1;

выберите вашу базу данных use [db_name]

и наконец LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


Мне помогло добавление --local-inline. Однако в моем случае глобальная переменная local_infile уже была включена. Я думаю, пользователям лучше сначала выяснить, какое значение они написали в этой переменной, прежде чем изменять ее.
Евгений Майсюк,

Для пользователей RDS => Добавление --local-infile помогло мне в RDS, однако SET GLOBAL local_infile = 1;, похоже, не работает в RDS, но в любом случае без этого --local-infileтрюк сработал
Факт

0

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

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

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


 2) удалите заголовки (первая строка) из csv, затем загрузите (если вы забудете ЛОКАЛЬНЫЙ, вы получите «# 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;

вуаля!


-5

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


1
Я так не думаю. Я могу делать другие запросы с тем же паролем.
Брайан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.