Я запускаю Mysql 5.5 на Ubuntu 12 LTS. Как включить LOCAL INFILE LOAD DATA в my.cnf?
Я попытался добавить локальную-infile в свой config в разных местах, но я все еще получаю "Использованная команда не допускается с этой версией MySQL"
Я запускаю Mysql 5.5 на Ubuntu 12 LTS. Как включить LOCAL INFILE LOAD DATA в my.cnf?
Я попытался добавить локальную-infile в свой config в разных местах, но я все еще получаю "Использованная команда не допускается с этой версией MySQL"
На странице руководства 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], чтобы включить серверную функцию на стороне локального доступа.
Это ограничение безопасности.
Файл 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.
Замените драйвер php5-mysql на собственный драйвер
На debian
apt-get install php5-mysqlnd
если ваш вкус 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';
Кроме того, для других читателей, если вы пытаетесь сделать это в 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,
},
}
}
Вы должны заботиться о том, как вы устанавливаете соединение 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);
Другой способ - использовать клиентскую программу mysqlimport
.
Вы вызываете его следующим образом:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
Это генерирует оператор LOAD DATA
, который загружает tableName.txt
в таблицу tableName
.
Имейте в виду следующее:
mysqlimport
определяет имя таблицы из предоставленного вами файла; используя весь текст от начала имени файла до первого периода как имя таблицы. Итак, если вы хотите загрузить несколько файлов в одну и ту же таблицу, вы можете отличить их, например, tableName.1.txt
, tableName.2.txt
,... и т.д., Например.
если ваш файл csv расположен тот же с db, вам нужно удалить LOCAL в LOAD DATA INFILE, или вы получите сообщение об ошибке
Используемая команда не допускается с этой версией MySQL
Это немного странно для меня, от одного дня до следующего, который 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.
Хорошо, здесь происходит нечто странное. Чтобы сделать эту работу, НЕ нужно делать какие-либо изменения конфигурации в файле /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
сейчас.. Надеюсь, она работает:)
BTW Я работал над Rails 2.3 с Ruby 1.9.3 на Ubuntu 12.04.
Я использовал ниже метод, который не требует изменений в конфигурации, проверен на 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"
В случае, если Mysql 5.7 вы можете использовать "показать глобальные переменные типа" local_infile "; который даст локальный статус, вы можете включить его, используя" set global local_infile = ON".