ПОМИЛКА 1148: Використана команда не дозволена у цій версії MySQL


79

Я намагаюся завантажити дані в базу даних mysql за допомогою

LOAD DATA LOCAL
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

темою цього питання є відповідь, яку я отримую. Я розумію, що локальне вивантаження даних вимкнено за замовчуванням, і я повинен увімкнути його за допомогою команди, local-infile=1але я не знаю, де розмістити цю команду.

Відповіді:


114

Ви можете вказати це як додаткову опцію під час налаштування підключення клієнта:

mysql -u myuser -p --local-infile somedatabase

Це тому, що ця функція відкриває діру в безпеці. Отже, ви повинні ввімкнути це явним чином, якщо ви дійсно хочете ним скористатися.

І клієнт, і сервер повинні увімкнути опцію локального файлу. В іншому випадку це не працює. Щоб увімкнути його для файлів на сервері, додайте до my.cnfфайлу конфігурації наступне :

loose-local-infile = 1

ПОМИЛКА 1045 (28000): Відмовлено в доступі для користувача '' @ 'localhost' (з використанням пароля: НІ)
Тежа

1
Помилка така, як вище arkascha, .. Я намагаюся записати невеликий файл у таблицю mysql за допомогою команди LOAD INFILE.
Тея

1
@SOaddict Хм, мені здається простою помилкою автентифікації? Ви намагаєтесь підключитися без пароля? Чи можете ви таким самим чином підключитися до інтерактивного сеансу, тож без завантаження даних із файлу? Але в будь-якому випадку: ви переслідуєте когось, хтось ще запитує / відповідає! Будь ласка, задайте своє питання окремо. Ви точно отримаєте велику допомогу!
arkascha

1
@arkascha "відкриває діру в безпеці" означає? EDIT: dev.mysql.com/doc/refman/8.0/en/load-data-local.html
user706420

1
loose-local-infile = 1 повинен знаходитись у розділі [клієнт] у вашому файлі my.cnf або my.ini, а не в розділі [mysqld]. Ви також можете помістити local_infile = 1 у розділ [mysqld].
Джеймс

60

Я знаходжу відповідь тут .

Це тому, що для змінної сервера local_infileвстановлено значення FALSE | 0 . Посилання з документа .

Ви можете перевірити, виконавши:

SHOW VARIABLES LIKE 'local_infile';

Якщо у вас є привілеї SUPER, ви можете ввімкнути його (без перезапуску сервера з новою конфігурацією), виконавши:

SET GLOBAL local_infile = 1;

7
Спочатку я хотів поставити +1, оскільки це була єдина відповідь тут, яка успішно встановила для змінної local-infile значення ON, але це не виправило помилку.
codehelp4

1
Працював у мене! Але я не змінив його за даним методом. Я відредагував файл конфігурації my.ini сервера і встановив його там local_infile=1, і перезапустив серверну службу. Також я запустив клієнта з --local-infile dbnameопцією, наприклад mysql -u root -p --local-infile mydatabase.
anddero

1
Це дивний випадок, але я продовжував отримувати помилку, поки мій local_infine = on / True. Це було тому, що я створив свою таблицю в MySQL Workbench, а потім спробував додати локальні дані CSV через cmd. Я виправив це, скинувши таблицю і створивши нову через cmd, а також додавши дані через cmd.
EatSleepCode

13

http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html

Помістіть це в my.cnf - [client]розділ вже повинен бути там (якщо вас не надто турбує безпека).

[client]
loose-local-infile=1

1
Будь-які ідеї щодо того, куди піти, якщо це все-таки не вдається. Я додав local-infile = 1 у файл my.cnf під [client], [mysqld] та [mysql] і використовував їх комбінації. Усі з однаковими результатами. Я спробував відновити робочий стіл, але не пощастило. Я також зупинявся і запускав робочий стіл mySQL між кожними змінами.
OrwellHindenberg

1
оновлення mySQL до 6.2.5 вирішило цю проблему для мене
OrwellHindenberg

@OrwellHindenberg - чи використовували ви loose -local-infile = 1 - у вас просто local-infile.
Верасі,

Я спробував те, що було у вашій початковій відповіді, перед оновленнями. Я не пам’ятаю, як користувався "вільно". Однак оновлення mySQL працювало у мене.
OrwellHindenberg

@OrwellHindenberg - перевірте редагування. Це завжди було вільно- локально-в-файлі. Редагування просто виправило мої (на той час) помилки у презентації новачка / стиль
dba.se

11

Все це не вирішило це для мене на моєму новому Ubuntu 15.04.

Я видалив LOCALта отримав таку команду:

LOAD DATA
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

але потім я отримав:

MySQL said: File 'A.txt' not found (Errcode: 13 - Permission denied)

Це призвело мене до цієї відповіді Нельсона на інше питання про stackoverflow, яке вирішило проблему для мене!


1
Примітка: Я майже впевнений, що це також переміщує очікуване розташування файлу з клієнтської машини на серверну машину. (Якщо це одна машина, ви можете цього не помітити.)
ebyrob

Сервер MySQL працює з опцією --secure-file-priv, тому він не може виконати цю заяву
SmallChess

9

SpringBoot 2.1 із роз’ємом MySQL за замовчуванням

Щоб вирішити цю проблему, дотримуйтесь інструкцій

1. ВСТАНОВИТИ ГЛОБАЛЬНО local_infile = 1;

щоб встановити цю глобальну змінну, дотримуйтесь інструкцій, наданих у документації MySQL https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html

2. Змініть рядок з'єднувача MySQL

allowLoadLocalInfile = true Приклад: jdbc: mysql: // localhost: 3306 / xxxx? useSSL = false & useUnicode = yes & characterEncoding = UTF-8 & allowLoadLocalInfile = true


6

У мене була та сама проблема під час імпортування файлу CSV у AWS MySQL 8.0 RDS.

mysql> ЗАВАНТАЖИТИ ЛОКАЛЬНИЙ ФАЙЛ ДАНИХ '/tmp/your.csv' В ТАБЛИЦЮ test.demo2 ПОЛЯ, СКОРОЧЕНІ ',' ЗАКРИТИМИ '' 'РЯДКИ, ЗАКОНЧЕНІ' \ n 'ІГНОРУВАТИ 1 РЯДКИ;

ПОМИЛКА 1148 (42000): Використана команда не дозволена у цій версії MySQL

1) Перевірте наявність local_infileпараметра

mysql> SHOW VARIABLES LIKE 'local_infile';

2) Вийти з клієнта та повторно увійти, використовуючи параметр нижче.

mysql -u root -p -h rdsendpoint --local-infile=1

3) Виконайте ту саму команду

mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;


Query OK, 300 rows affected (0.01 sec)

Records: 300  Deleted: 0  Skipped: 0  Warnings: 0

5

Також боровся з цією проблемою, намагаючись завантажити .csv-дані у примірник AWS RDS з моєї локальної машини за допомогою MySQL Workbench в Windows.

Доповнення, яке мені потрібно було додати OPT_LOCAL_INFILE=1в: З'єднання> Додатково> Інші. Примітка. Потрібно було CAPS.

Я знайшов цю відповідь PeterMag на форумах розробників AWS .


Для отримання додаткової інформації:

SHOW VARIABLES LIKE 'local_infile';вже повернуто, ON і запит був:

LOAD DATA LOCAL INFILE 'filepath/file.csv' 
    INTO TABLE `table_name`
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS;

Копіювання з джерела відповідей, на яке посилається вище:

Очевидно, це помилка в MYSQL Workbench V8.X. На додаток до конфігурацій, показаних раніше в цьому потоці, вам також потрібно змінити підключення MYSQL в Workbench наступним чином:

  1. Перейдіть на сторінку привітання MYSQL, де відображаються всі ваші з'єднання
  2. Виберіть Керування підключеннями до сервера (маленький значок ключів)
  3. Виберіть підключення
  4. Виберіть вкладку Додатково
  5. У поле Інші додайте OPT_LOCAL_INFILE = 1

Тепер я можу використовувати запит LOAD DATA LOCAL INFILE на MYSQL RDS. Здається, дозвіл File_priv не потрібен. *


1
Я використовував робочий стіл, і це було моєю проблемою. Тепер вирішується після настройки OPT_LOCAL_INFILE = 1
Chandan

3

Просто невелике додавання.

Знайшов ще одне перевтілення в mysql.connector версії 8.0.16. Тепер він вимагає allow_local_infile = True, інакше ви побачите вищевказану помилку. Працював у попередніх версіях.

conn = mysql.connector.connect(host=host, user=user, passwd=passwd, database=database, allow_local_infile=True)

2

Якщо ви використовуєте версію Java8 або +, JDBC та MySql8 і стикаєтеся з цією проблемою, спробуйте наступне:

Додати параметр до рядка підключення:

jdbc:mysql://localhost:3306/tempDB?allowLoadLocalInfile=true

Крім того, встановити

local_infile = 1

у файлі my.cnf.

Остання версія mysql-java-connector не може дозволити безпосереднє підключення до локального файлу. Отже, за допомогою цього параметра ви можете ввімкнути його. Це працює для мене.


1

Я отримав цю помилку під час завантаження даних під час використання докера [1]. Рішення спрацювало після того, як я виконав ці наступні кроки. Спочатку я створив базу даних і таблицю datavaultі fdata. Коли я спробував імпортувати дані [2], я отримав помилку [3]. Потім я зробив:

  • SET GLOBAL local_infile = 1;
  • Підтвердьте використання SHOW VARIABLES LIKE 'local_infile';
  • Потім я перезапустив сеанс MySQL: mysql -P 3306 -u required --local-infile=1 -pдив. [4] про створення користувачів.
  • Я відтворив свою таблицю, оскільки це вирішило мою проблему:
    • use datavault;
    • drop table fdata;
    • CREATE TABLE fdata (fID INT, NAME VARCHAR(64), LASTNAME VARCHAR(64), EMAIL VARCHAR(128), GENDER VARCHAR(12), IPADDRESS VARCHAR(40));
  • Нарешті, я імпортував дані за допомогою [2].

Для повноти я б додав, що запускав версію mysql всередині контейнера через docker exec -it testdb sh. Версією mysql був mysql Ver 8.0.17 для Linux на x86_64 (MySQL Community Server - GPL) . Це також було перевірено за допомогою mysql.exe Ver 14.14 Distrib 5.7.14, для Win64 (x86_64), яка була іншою версією mysql від WAMP64. Відповідні команди, що використовуються, перелічені в [5].


[1] docker run --name testdb -v //c/Users/C/Downloads/data/csv-data/:/var/data -p 3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:latest

[2] load data local infile '/var/data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n' IGNORE 1 ROWS;

[3] ПОМИЛКА 1148 (42000): Використана команда не дозволена у цій версії MySQL

[4] Потрібний клієнт був створений за допомогою:

  • CREATE USER 'required'@'%' IDENTIFIED BY 'password';
  • GRANT ALL PRIVILEGES ON * . * TO 'required'@'%';
  • FLUSH PRIVILEGES;
  • Вам може знадобитися цей рядок, ALTER USER 'required'@'%' IDENTIFIED WITH mysql_native_password BY 'password';якщо ви натрапите на цю помилку :Authentication plugin ‘caching_sha2_password’ cannot be loaded

[5] Команди з використанням mysql від WAMP64:

  • mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile=1де порт - це порт, що відображається на хості, як описано, docker ps -aі IP-адреса хоста була отримана за допомогою docker-machine ip(Це залежить від ОС та, можливо, версії Docker ).
  • Створіть datavault2 бази даних та таблицю fdata, як описано вище
  • load data local infile 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n';
  • На мій запис, ця інша альтернатива завантаження файлу працювала після того, як я раніше створив datavault3 та fdata : mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile datavault3 -e "LOAD DATA LOCAL INFILE 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' REPLACE INTO TABLE fdata FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS"і він успішно завантажив дані, які легко перевіряються після запуску select * from fdata limit 10;.


0

Верхні відповіді правильні. Будь ласка, перевірте їх безпосередньо в MySQL CLI. Якщо це вирішує проблему там, можливо, ви захочете, щоб вона працювала в Python3, просто передайте її MySQLdb.connectпараметру as

self.connection = MySQLdb.connect(
                    host=host, user=settings_DB.db_config['USER'],
                    port=port, passwd=settings_DB.db_config['PASSWORD'], 
                    db=settings_DB.db_config['NAME'],
                    local_infile=True)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.