MySQL: включить ЗАГРУЗИТЬ ЛОКАЛЬНЫЙ ИНФАЙЛ ДАННЫХ


127

Я использую Mysql 5.5 на Ubuntu 12 LTS. Как мне включить LOAD DATA LOCAL INFILE в my.cnf?

Я пробовал добавить local-infile в свою конфигурацию в разных местах, но все еще получаю сообщение «Используемая команда не разрешена в этой версии MySQL»

Ответы:


197

На странице руководства 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], чтобы включить функцию "локальный файл" на стороне сервера.

Это ограничение безопасности.


4
Спасибо. Кстати, my.cnfпуть находится /etc/mysql/my.cnfна моей машине (AWS EC2).
SparkAndShine

Интересно, что файл my.cnf находился для меня в каталоге / etc.
SgtRock 01

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

2
обновление mySQL до 6.2.5 решило эту проблему для меня
Оруэлл Хинденберг

Ответ в правильном направлении. Но для тех, кто сталкивается с этой проблемой, есть еще одна проблема. Если в вашей системе включен apparmor и проблема не устранена, проверьте системный журнал, чтобы узнать, не блокируется ли демон 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] уже указаны, просто найдите их в файле и добавьте под каждым из них local-infile .

У меня это работает на 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.
user3260912

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,

28

Я решил эту проблему в 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. Возможно это последнее решение. Огромное спасибо.
mathsyouth

1
К сожалению, после перезапуска сервера переменная снова отключена.
Педро

Mohit, я как-то решил это, потому что теперь глобальная переменная local_infile всегда включена, даже после перезагрузки. И, похоже, я не использовал для этого файл my.cnf. Не могли бы вы войти в последнюю версию PhpMyAdmin с правами root, перейти в раздел «Переменные», найти «local_infile», затем щелкнуть «Изменить», изменить его на «ВКЛ.» И, наконец, нажать «Enter». Это сработало?
Алексей Музалев

2
Только этот ответ работал у меня 8.0.12 MySQL Community Serverв Windows.
endo64

У меня MySQL 8.0.16 установлен на Windows server 2016, я выполнил 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
Junior

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) как-то запускает новый сеанс или сбрасывает его? Однако я не пробовал устанавливать эту настройку в sql-скрипт mmy.
toddkaufmann 06

5

Кроме того, для других читателей, если вы пытаетесь сделать это в 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,
        },
    }
}

3

Вы должны позаботиться о том, как установить соединение mysqli. Полная заслуга за это решение принадлежит Хорхе Альбаренке, источнику

Чтобы это исправить, мне пришлось:

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

Загвоздка в том, что с помощью этой функции вы можете явно включить поддержку 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);

1
@Mask Не удалось подтвердить. Мое решение работает на 5.5.46 (Ubuntu)
sieppl

3

если ваш файл csv расположен так же, как и db, вам нужно удалить LOCAL в 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:

поместите 'загрузить данные ...' в файл .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»; который предоставит статус локального файла. Вы можете включить его, используя "set global 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

Для тех из вас, кто ищет ответы, чтобы заставить LOAD DATA 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, Проблемы безопасности с LOAD DATA LOCAL .


0

Добавить local_infileв обоих clientи mysqldсекции.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Протестировано в MySQL 8.x как в Windows, так и в Linux.


0

Я использую 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. Иначе не получится.

Спасибо за все предложения выше. Комбинация наконец-то сработала для меня.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.