MySQL: Увімкнути ЛОКАЛЬНУ ВНУТКУ ДАНИХ ЗАВАНТАЖЕННЯ


127

Я запускаю Mysql 5.5 на Ubuntu 12 LTS. Як я можу ввімкнути МІСЦЕВОГО ВІДХОДЖЕННЯ ДОДАТОК у my.cnf?

Я намагався додавати локальний файл у своєму конфігурації в різних місцях, але я все ще отримую "Використовувана команда заборонена для цієї версії MySQL"

Відповіді:


197

На сторінці керівництва MySQL 5.5:

LOCAL працює лише в тому випадку, якщо ваш сервер і ваш клієнт налаштовані дозволити це. Наприклад, якщо mysqld був запущений з --local-infile = 0, LOCAL не працює. Див. Розділ 6.1.6, «Проблеми із безпекою з локальним набором даних».

Вам слід встановити варіант:

local-infile=1

у ваш [mysql] запис файлу my.cnf або викликайте клієнта mysql з опцією --local-infile :

mysql --local-infile -uroot -pyourpwd yourdbname

Ви повинні бути впевнені, що той самий параметр визначений і у вашому розділі [mysqld], щоб увімкнути сторону сервера функцій "локальний файл".

Це обмеження безпеки.


4
Дякую. btw, my.cnfшлях /etc/mysql/my.cnfу моїй машині (AWS EC2).
SparkAndShine

Цікаво, що файл my.cnf був для мене в каталозі / etc.
SgtRock

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

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

Відповідь у правильному напрямку. Але для тих, хто стикається з цією проблемою, тут - ще одна готча. Якщо у вас ввімкнено apparmor у вашій системі, і проблема не зникає, перевірте syslog, щоб перевірити, чи не блокується демон mysqld. Я мав цю проблему: apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33. Рішення дуже просте. Просто оновіть /etc/apparmor.d/local/usr.sbin.mysqldі перезавантажте службу apparmor.
Лев

60

Файл my.cnf, який слід відредагувати, - це файл /etc/mysql/my.cnf . Просто:

sudo nano /etc/mysql/my.cnf

Потім додайте:

[mysqld]
local-infile 

[mysql]
local-infile 

Заголовки [mysqld] та [mysql] вже задані, просто знайдіть їх у файлі та додайте локальний інфійл під кожним із них.

Він працює для мене на MySQL 5.5 на Ubuntu 12.04 LTS.


1
Це безумовно зафіксувало це за допомогою Ubuntu 12.04.
Джон Фіала

4
Я можу також підтвердити Ubuntu 14.04.2 LTS not working.
Ain Tohvri

Працює і для Mac. Для користувачів Mac /mysql/my.cnfне існує за замовчуванням. Просто створіть каталог і файл і вставте ці рядки у файл.
Чжен Лю

Якщо ви не хочете, щоб ця конфігурація була перезаписана, коли mysql оновлюється, вам слід ввести це /etc/mysql/conf.d/enable-local-infile.cnf також. Не забудьте sudo service mysql restartпісля зміни конфігурації, щоб вона набула чинності.
Стівен Остерміллер

Це правильне рішення. Найвище оцінене рішення не вказує, що ви повинні поставити [mysqld] спочатку перед рядком local-infile.
користувач3260912

30

Замініть драйвер php5-mysql рідним драйвером

На debian

apt-get install php5-mysqlnd

Це спрацювало! Використовуючи акції aws 12.04 ubuntu, мені потрібен був "локальний" під час підключення до RDS. Завдяки мільйонів!
Джеймс Боулер

Дуже дякую, це рішення спрацювало для мене. Я задав питання stackoverflow.com/questions/36526102 / ...
user75472

Немає успіху ubuntu 12.04
Zbyszek

ще один щасливий клієнт! ubuntu 14.04 mysql 5.7
nodoze

27

Я вирішив цю проблему на MySQL 8.0.11 командою mysql terminal:

SET GLOBAL local_infile = true;

Я маю на увазі, що я спершу ввійшов у звичайне:

mysql -u user -p*

Після цього ви можете побачити статус за допомогою команди:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Це повинно бути ВКЛ. Я не буду писати про безпеку, видану тут із завантаженням локальних файлів у базу даних.


Я спробував багато інших рішень, але працює лише команда SET GLOBAL local_infile = true; . Моя версія MySQL - 8.0.12. Можливо, це останнє рішення. Дуже дякую.
mathsyouth

1
На жаль, змінна знову вимкнена після перезавантаження сервера.
Педро

Мохіт, я якось вирішив це, тому що тепер глобальна змінна 'local_infile' завжди ввімкнена, навіть після перезавантаження. Здається, я не використовував для цього файл my.cnf. Чи можете ви, будь ласка, спробувати увійти в PhpMyAdmin, остання версія, як корінь, перейдіть до розділу Змінні, знайдіть 'local_infile', потім натисніть Редагувати та змініть його на УВІМКАНО та нарешті натисніть Enter. Це спрацювало?
Олексій Музалєв

2
Тільки ця відповідь працювала для мене 8.0.12 MySQL Community Serverв Windows.
endo64

У мене на сервері Windows 2016 встановлений MySQL 8.0.16, я виконав SET GLOBAL local_infile = true;команду, але я все одно отримую ту ж помилку, ERROR 1148 (42000): The used command is not allowed with this MySQL versionале підключення до mysql з --load-infile = 1 працювавmysql --local-infile=1 -u root -p
Молодший

13

якщо ваш аромат mysql в ubuntu НІ за будь-яких обставин не працює, і ви все одно отримаєте помилку 1148, ви можете запустити load data infileкоманду за допомогою командного рядка

відкрити вікно терміналу

бігати mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

Вам буде запропоновано вставити пароль mysqluser

ви будете запускати MySQLMonitor, і ваш командний рядок буде mysql>

запустіть свою load data infileкоманду (не забудьте закінчити крапкою з комою ; )

подобається це:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

9

Дивіться нижче зображення ...

Я додав --local-infile=1до звичайної команди mysql mysql -u root -p

Таким чином, загальна лінія буде такою:

mysql --local-infile = 1 -u корінь -p

введіть тут опис зображення


Це працювало для мене, коли SET GLOBAL ..цього не робило. Чи команда 'source' ( \. file.sql) якось запускає новий сеанс чи скидає це? Я не намагався ввести налаштування в сценарій mmy sql.
toddkaufmann

5

Крім того, для інших читачів, якщо ви намагаєтеся зробити це в Django AND, ваш сервер дозволяє local_infile (ви можете перевірити, ввівши SHOW VARIABLES через mysql-клієнт), ви можете додати це у файл settings.py (оскільки python MySQLdb не ' t за замовчуванням прочитайте файл .my.cnf):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}

3

Ви повинні подбати про те, як встановити зв'язок mysqli. Повна заслуга цього рішення припадає на Хорхе Альбаренка, джерела

Щоб виправити це, мені довелося:

  • Додайте local-infile = 1 до розділів [mysqld] та [mysql] my.cnf (як пояснено у коментарях вище)
  • Використовуйте функцію mysqli_real_connect ( документація на PHP ).

Суть полягає в тому, що за допомогою цієї функції ви можете чітко включити підтримку для НАВАНТАЖЕННЯ ДАНИХ МІСЬКОГО ІНФІЛЮ. Наприклад (процедурний стиль):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

або об'єктно-орієнтовані

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);

1
@Mask Неможливо підтвердити. Моє рішення працює 5,5.46 (Ubuntu)
sieppl

3

якщо ваш файл csv розташований однаково з db, вам потрібно видалити LOCAL у INFILE LOAD DATA INFILE , інакше ви отримаєте помилку

Використовувана команда заборонена в цій версії MySQL


Це зробило це для мене, але тоді я також повинен був дотримуватися відповіді Нельсона тут
Домінік

1

Ще один спосіб - використання mysqlimportклієнтської програми.

Ви викликаєте його наступним чином:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

Це генерує LOAD DATAоператор, який завантажується tableName.txtв tableNameтаблицю.

Майте на увазі наступне:

mysqlimportвизначає назву таблиці з наданого файлу; використовуючи весь текст від початку імені файлу до першого періоду в якості імені таблиці. Отже, якщо ви хочете завантажити декілька файлів в одній таблиці ви могли відрізнити їх як tableName.1.txt, tableName.2.txt... і т.д., наприклад.


1

Це стало для мене трохи дивним: від одного дня до другого сценарій, який працює з днів, просто перестає працювати. Не було нової версії mysql або будь-якого виду оновлення, але я отримував таку ж помилку, тому я останній спробую файл CSV і зауважую, що в кінці рядків використовується \ n замість очікуваного (за моїм сценарієм ) \ r \ n, тому я зберігаю його з правильним EOL і запускаю сценарій знову без проблем.

Я думаю, що для mysql це не дивно, що для цієї версії MySQL використана команда заборонена, оскільки причина зовсім інша.

Моя робоча команда виглядає так:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.

1

Я використовував метод нижче, який не потребує змін конфігурації , протестований на mysql-5.5.51-winx64 та 5.5.50-MariaDB:

помістіть 'load data ...' у файл .sql (наприклад: LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

тоді:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"

1

У випадку, якщо Mysql 5.7 ви можете використовувати "показати глобальні змінні типу" local_infile ";" що надасть статус локального інфіле, ви можете увімкнути його, використовуючи "встановити глобальний local_infile = ON;".


0

Гаразд, тут відбувається щось дивне. Щоб зробити цю роботу, НЕ потрібно вносити будь-які зміни конфігурації в /etc/mysql/my.cnf. Все, що вам потрібно зробити - це перезапустити поточну службу mysql в терміналі:

sudo service mysql restart

Потім, якщо я хочу "відтворити" помилку, я просто перезапускаю службу apache:

sudo service apache2 restart

Що потім можна знову виправити, ввівши таку команду:

sudo service mysql restart

Отже, виявляється, що apache2 робить щось для того, щоб не дозволити цю функцію під час її запуску (яка потім повертається назад / виправляється при перезапуску служби mysql).

Дійсні в дистрибутивах на базі Debian.

service mysqld restart
service httpd restart

Дійсні в дистрибутивах на основі RedHat


0

Для тих із вас, хто шукає відповіді, щоб змусити LOCALINFILE ЗАВАНТАЖЕННЯ ДАНИХ працювати так само, як я, можливо, це спрацює. Добре це працювало для мене, так ось воно і йде. Встановіть perconaяк ваш сервер та клієнт mysql, дотримуючись кроків із посилання. Під час встановлення буде запропоновано пароль, тому вкажіть його та запам’ятайте його пізніше. Після того, як установка виконана, перезавантажте систему та перевіряйте, чи працює сервер та працює, перейшовши на terminalта ввівши, mysql -u root -pа потім пароль. Спробуйте запустити команду LOAD DATA LOCAL INFILEзараз. Сподіваюся, вона працює :)

До речі, я працював над Rails 2.3 з Ruby 1.9.3 на Ubuntu 12.04.


0

Все: Очевидно, що це працює за задумом. Перегляньте нову людину посилання від 2019-7-23, Розділ 6.1.6, Проблеми безпеки з МІСЦЕВОГО ЗАБЕЗПЕЧЕННЯ ДАНИХ .


0

Додайте local_infileв обох clientі mysqldрозділ.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Тестується в MySQL 8.x і в Windows, і в Linux.


0

Я використовую xampp v3.2.4 та mysql сервер 8.0.20.

Я додав local-infile=1до [mysql]та [mysqld]у файл "my.ini". Файл знаходиться за адресою "C: \ xampp \ mysql \ bin \ my.ini".

Потім я вставив дані з файлу csv, використовуючи наступний код LOAD DATA INFILE ... . Важливо рухатись LOCAL. Інакше це не спрацює.

Дякуємо за всі пропозиції вище. Нарешті, для мене склалася комбінація.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.