доступ запрещен для загрузки данных в 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}
Jeremysawesome
источник
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
как сказал @Eugene M, это дает ошибку Некорректное использование DB GRANT и GLOBAL PRIVILEGES
Бухгалтер م
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,

ОБЪЯВЛЕНИЕ

user7996813
источник
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
Я так не думаю. Я могу делать другие запросы с тем же паролем.
Брайан