Відповіді:
На сторінці керівництва 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], щоб увімкнути сторону сервера функцій "локальний файл".
Це обмеження безпеки.
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.
Файл 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.
Ubuntu 14.04.2 LTS not working
.
/mysql/my.cnf
не існує за замовчуванням. Просто створіть каталог і файл і вставте ці рядки у файл.
/etc/mysql/conf.d/enable-local-infile.cnf
також. Не забудьте sudo service mysql restart
після зміни конфігурації, щоб вона набула чинності.
Замініть драйвер php5-mysql рідним драйвером
На debian
apt-get install php5-mysqlnd
Я вирішив цю проблему на 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. Можливо, це останнє рішення. Дуже дякую.
8.0.12 MySQL Community Server
в Windows.
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
якщо ваш аромат 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';
Дивіться нижче зображення ...
Я додав --local-infile=1
до звичайної команди mysql mysql -u root -p
Таким чином, загальна лінія буде такою:
mysql --local-infile = 1 -u корінь -p
SET GLOBAL ..
цього не робило. Чи команда 'source' ( \. file.sql
) якось запускає новий сеанс чи скидає це? Я не намагався ввести налаштування в сценарій mmy sql.
Крім того, для інших читачів, якщо ви намагаєтеся зробити це в 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,
},
}
}
Ви повинні подбати про те, як встановити зв'язок mysqli. Повна заслуга цього рішення припадає на Хорхе Альбаренка, джерела
Щоб виправити це, мені довелося:
Суть полягає в тому, що за допомогою цієї функції ви можете чітко включити підтримку для НАВАНТАЖЕННЯ ДАНИХ МІСЬКОГО ІНФІЛЮ. Наприклад (процедурний стиль):
$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);
якщо ваш файл csv розташований однаково з db, вам потрібно видалити LOCAL у INFILE LOAD DATA INFILE , інакше ви отримаєте помилку
Використовувана команда заборонена в цій версії MySQL
Ще один спосіб - використання mysqlimport
клієнтської програми.
Ви викликаєте його наступним чином:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
Це генерує LOAD DATA
оператор, який завантажується tableName.txt
в tableName
таблицю.
Майте на увазі наступне:
mysqlimport
визначає назву таблиці з наданого файлу; використовуючи весь текст від початку імені файлу до першого періоду в якості імені таблиці. Отже, якщо ви хочете завантажити декілька файлів в одній таблиці ви могли відрізнити їх як tableName.1.txt
, tableName.2.txt
... і т.д., наприклад.
Це стало для мене трохи дивним: від одного дня до другого сценарій, який працює з днів, просто перестає працювати. Не було нової версії 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.
Я використовував метод нижче, який не потребує змін конфігурації , протестований на 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"
Гаразд, тут відбувається щось дивне. Щоб зробити цю роботу, НЕ потрібно вносити будь-які зміни конфігурації в /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
Для тих із вас, хто шукає відповіді, щоб змусити LOCAL
INFILE ЗАВАНТАЖЕННЯ ДАНИХ працювати так само, як я, можливо, це спрацює. Добре це працювало для мене, так ось воно і йде. Встановіть percona
як ваш сервер та клієнт mysql, дотримуючись кроків із посилання. Під час встановлення буде запропоновано пароль, тому вкажіть його та запам’ятайте його пізніше. Після того, як установка виконана, перезавантажте систему та перевіряйте, чи працює сервер та працює, перейшовши на terminal
та ввівши, mysql -u root -p
а потім пароль. Спробуйте запустити команду LOAD DATA LOCAL INFILE
зараз. Сподіваюся, вона працює :)
До речі, я працював над Rails 2.3 з Ruby 1.9.3 на Ubuntu 12.04.
Додайте local_infile
в обох client
і mysqld
розділ.
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
Тестується в MySQL 8.x і в Windows, і в Linux.
Я використовую 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. Інакше це не спрацює.
Дякуємо за всі пропозиції вище. Нарешті, для мене склалася комбінація.
my.cnf
шлях/etc/mysql/my.cnf
у моїй машині (AWS EC2).