Ответы:
На странице руководства MySQL 5.5:
ЛОКАЛЬНЫЙ работает только в том случае, если ваш сервер и ваш клиент настроены на это разрешение. Например, если 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] уже указаны, просто найдите их в файле и добавьте под каждым из них local-infile .
У меня это работает на 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:
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
) как-то запускает новый сеанс или сбрасывает его? Однако я не пробовал устанавливать эту настройку в sql-скрипт mmy.
Кроме того, для других читателей, если вы пытаетесь сделать это в Django, И ваш сервер разрешает 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. Полная заслуга за это решение принадлежит Хорхе Альбаренке, источнику
Чтобы это исправить, мне пришлось:
Загвоздка в том, что с помощью этой функции вы можете явно включить поддержку LOAD DATA LOCAL INFILE. Например (процедурный стиль):
$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 в 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:
поместите 'загрузить данные ...' в файл .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
Для тех из вас, кто ищет ответы, чтобы заставить LOAD DATA 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 server 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).