MySQL: включить LOAD DATA LOCAL INFILE

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

Я попытался добавить локальную-infile в свой config в разных местах, но я все еще получаю "Использованная команда не допускается с этой версией MySQL"

Ответ 1

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

LOCAL работает только в том случае, если ваш сервер и ваш клиент были чтобы разрешить это. Например, если mysqld был запущен с --local-infile = 0, LOCAL не работает. См. Раздел 6.1.6 "Проблемы безопасности с локальными данными LOAD DATA LOCAL".

Вы должны установить этот параметр:

local-infile=1

в ваш [mysql] файл my.cnf или вызовите mysql-клиент с опцией - локально-infile:

mysql --local-infile -uroot -pyourpwd yourdbname

Вы должны быть уверены, что один и тот же параметр определен в вашем разделе [mysqld], чтобы включить серверную функцию на стороне локального доступа.

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

Ответ 2

Файл 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.

Ответ 3

Замените драйвер php5-mysql на собственный драйвер

На debian

apt-get install php5-mysqlnd

Ответ 4

если ваш вкус mysql на ubuntu ни при каких обстоятельствах не работает, и вы все еще получаете ошибку 1148, вы можете запустить команду load data infile через командную строку

открыть окно терминала

run 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';

Ответ 5

Кроме того, для других читателей, если вы пытаетесь сделать это в Django, и ваш сервер разрешает local_infile (вы можете проверить, набрав SHOW VARIABLES через клиент mysql), вы можете добавить это в свой settings.py (поскольку python MySQLdb по умолчанию не читает файл .my.cnf):

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

Ответ 6

Вы должны заботиться о том, как вы устанавливаете соединение 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);

Ответ 7

Другой способ - использовать клиентскую программу mysqlimport.

Вы вызываете его следующим образом:

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

Это генерирует оператор LOAD DATA, который загружает tableName.txt в таблицу tableName.

Имейте в виду следующее:

mysqlimport определяет имя таблицы из предоставленного вами файла; используя весь текст от начала имени файла до первого периода как имя таблицы. Итак, если вы хотите загрузить несколько файлов в одну и ту же таблицу, вы можете отличить их, например, tableName.1.txt, tableName.2.txt,... и т.д., Например.

Ответ 8

если ваш файл csv расположен тот же с db, вам нужно удалить LOCAL в LOAD DATA INFILE, или вы получите сообщение об ошибке

Используемая команда не допускается с этой версией MySQL

Ответ 9

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

Я думаю, что для 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.

Ответ 10

Хорошо, здесь происходит нечто странное. Чтобы сделать эту работу, НЕ нужно делать какие-либо изменения конфигурации в файле /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

Ответ 11

Для тех из вас, кто ищет ответы, чтобы LOAD DATA LOCAL INFILE работал, как я, возможно, это сработает. Хорошо, это сработало для меня, так что вот оно. Установите percona в качестве сервера и клиента mysql, выполнив шаги из этой ссылки. Во время установки будет запрашиваться пароль, поэтому укажите тот, который вы запомните и используете позже. После завершения установки перезагрузите вашу систему и проверьте, запущен ли сервер, и перейдите в terminal и введите mysql -u root -p, а затем пароль. Попробуйте запустить команду LOAD DATA LOCAL INFILE сейчас.. Надеюсь, она работает:)

BTW Я работал над Rails 2.3 с Ruby 1.9.3 на Ubuntu 12.04.

Ответ 12

Я использовал ниже метод, который не требует изменений в конфигурации, проверен на 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 [email protected] -Ddatabasename -e "source D:\Work\LoadTableName.sql"

Ответ 13

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