MySQL: Habilitar CARGAR DATOS LOCALES INFILE

127

Estoy ejecutando Mysql 5.5 en Ubuntu 12 LTS. ¿Cómo debo habilitar LOAD DATA LOCAL INFILE en my.cnf?

He intentado agregar local-infile en mi configuración en varios lugares, pero sigo recibiendo el mensaje "El comando utilizado no está permitido con esta versión de MySQL"

Krt_Malta
fuente

Respuestas:

197

Desde la página del manual de MySQL 5.5:

LOCAL funciona solo si su servidor y su cliente han sido configurados para permitirlo. Por ejemplo, si mysqld se inició con --local-infile = 0, LOCAL no funciona. Consulte la Sección 6.1.6, “Problemas de seguridad con LOAD DATA LOCAL”.

Debe configurar la opción:

local-infile=1

en su entrada [mysql] del archivo my.cnf o llame al cliente mysql con la opción --local-infile :

mysql --local-infile -uroot -pyourpwd yourdbname

Debe asegurarse de que el mismo parámetro esté definido en su sección [mysqld] también para habilitar el lado del servidor de la función "archivo local".

Es una restricción de seguridad.

dAm2K
fuente
44
Gracias. por cierto, la my.cnfruta está /etc/mysql/my.cnfen mi máquina (AWS EC2).
SparkAndShine
Curiosamente, el archivo my.cnf estaba en el directorio / etc para mí.
SgtRock 01 de
Alguna idea sobre dónde ir si esto todavía falla. Agregué local-infile = 1 al archivo my.cnf en [cliente], [mysqld] y [mysql] y utilicé combinaciones de estos. Todo con los mismos resultados. He intentado reiniciar el banco de trabajo pero no tuve suerte. También detuve y comencé mySQL workbench entre cada cambio.
OrwellHindenberg
2
una actualización de mySQL a 6.2.5 resolvió este problema para mí
OrwellHindenberg
La respuesta está en la dirección correcta. Pero para aquellos que enfrentan este problema aquí hay otro problema. Si tiene habilitado apparmor en su sistema y el problema persiste, verifique el registro del sistema para ver si el demonio mysqld está siendo bloqueado. Tenía este problema: 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. La solución es muy simple. Simplemente actualice su /etc/apparmor.d/local/usr.sbin.mysqldy vuelva a cargar el servicio apparmor.
Leo
60

El archivo my.cnf que debe editar es el archivo /etc/mysql/my.cnf . Sólo:

sudo nano /etc/mysql/my.cnf

Luego añade:

[mysqld]
local-infile 

[mysql]
local-infile 

Los encabezados [mysqld] y [mysql] ya están dados, solo ubíquelos en el archivo y agregue el archivo local debajo de cada uno de ellos.

Funciona para mí en MySQL 5.5 en Ubuntu 12.04 LTS.

hlosukwakha
fuente
1
Esto definitivamente me lo solucionó con Ubuntu 12.04.
John Fiala
44
Puedo confirmar Ubuntu 14.04.2 LTS not workingtambién.
Ain Tohvri
Funciona también para Mac. Para usuarios de Mac, /mysql/my.cnfno existe de forma predeterminada. Simplemente cree el directorio y el archivo, y pegue estas líneas en el archivo.
Zheng Liu
Si no desea que esta configuración se sobrescriba cuando se actualiza mysql, debe poner esto en. /etc/mysql/conf.d/enable-local-infile.cnf Además, no olvide sudo service mysql restartdespués de realizar el cambio de configuración para que surta efecto.
Stephen Ostermiller
Esta es la solución adecuada. La solución más votada no menciona que debes poner [mysqld] primero antes de la línea local-infile.
user3260912
30

Reemplace el controlador php5-mysql por el controlador nativo

En debian

apt-get install php5-mysqlnd
BeniSK
fuente
Esto funcionó! Usando stock aws 12.04 ubuntu, necesitaba 'local' ya que me estoy conectando a RDS. ¡Un millón de gracias!
James Bowler
Muchas gracias, esta solución funcionó para mí. He hecho la pregunta stackoverflow.com/questions/36526102/…
user75472
Sin éxito ubuntu 12.04
Zbyszek
¡otro cliente feliz! ubuntu 14.04 mysql 5.7
nodoze
27

Resolví este problema en MySQL 8.0.11 con el comando de terminal mysql:

SET GLOBAL local_infile = true;

Quiero decir, inicié sesión primero con lo habitual:

mysql -u user -p*

Después de eso, puede ver el estado con el comando:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Debería estar encendido. No escribiré sobre seguridad emitida con la carga de archivos locales en la base de datos aquí.

Oleksiy Muzalyev
fuente
Intenté muchas otras soluciones, pero solo el comando SET GLOBAL local_infile = true; funciona. Mi versión de MySQL es 8.0.12. Quizás esta sea la última solución. Muchas gracias.
mathsyouth
1
Desafortunadamente, la variable está APAGADA nuevamente después de reiniciar el servidor.
Pedro
Mohit, de alguna manera lo resolví, porque ahora la variable global 'local_infile' siempre está activada, incluso después de reiniciar. Y parece que no usé el archivo my.cnf para esto. ¿Podría, por favor, intentar iniciar sesión en PhpMyAdmin, última versión, como root, ir a la sección Variables, buscar 'local_infile', luego hacer clic en Editar, cambiarlo a ON y finalmente presionar Entrar. ¿Funcionó?
Oleksiy Muzalyev
2
Solo esta respuesta funcionó para mí 8.0.12 MySQL Community Serveren Windows.
endo64
Tengo MySQL 8.0.16 instalado en Windows Server 2016, ejecuté el SET GLOBAL local_infile = true;comando pero todavía recibo el mismo error, ERROR 1148 (42000): The used command is not allowed with this MySQL versionpero la conexión a mysql con --load-infile = 1 funcionómysql --local-infile=1 -u root -p
Junior
13

en caso de que su sabor de mysql en ubuntu NO funcione bajo ninguna circunstancia y todavía obtenga el error 1148, puede ejecutar el load data infilecomando a través de la línea de comando

abrir una ventana de terminal

correr mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

se le pedirá que inserte la contraseña de mysqluser

ejecutará MySQLMonitor y su símbolo del sistema será mysql>

ejecuta tu load data infilecomando (no olvides terminar con un punto y coma ; )

Me gusta esto:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Tony Gil
fuente
9

Ver la imagen de abajo ...

He agregado --local-infile=1al comando mysql normal mysql -u root -p

Entonces la línea total sería:

mysql --local-infile = 1 -u root -p

ingrese la descripción de la imagen aquí

Jagadeesh Pulamarasetti
fuente
Esto funcionó para mí cuando SET GLOBAL ..no lo hizo. ¿Un comando 'fuente' ( \. file.sql) de alguna manera inicia una nueva sesión o la restablece? Sin embargo, no intenté poner la configuración en el script mmy sql.
toddkaufmann
5

Además, para otros lectores, si está intentando hacer esto en Django Y su servidor permite local_infile (puede verificar escribiendo SHOW VARIABLES a través de un cliente mysql), entonces puede agregar esto a su archivo settings.py (ya que python MySQLdb no lo hace) t por defecto lee el archivo .my.cnf):

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

Debe tener cuidado de cómo establecer su conexión mysqli. El crédito total de esta solución es para Jorge Albarenque, fuente

Para solucionarlo tuve que:

  • Agregue local-infile = 1 a las secciones [mysqld] y [mysql] de my.cnf (como se explica en los comentarios anteriores)
  • Utilice la función mysqli_real_connect ( documentación de PHP ).

El problema es que con esa función puede habilitar explícitamente el soporte para LOAD DATA LOCAL INFILE. Por ejemplo (estilo de procedimiento):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

u orientado a objetos

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
sieppl
fuente
1
@Mask No se puede confirmar. Mi solución se ejecuta en 5.5.46 (Ubuntu)
sieppl
3

si su archivo csv se encuentra igual con db, debe eliminar LOCAL en LOAD DATA INFILE , o recibirá el error

El comando utilizado no está permitido con esta versión de MySQL

wingoo
fuente
Esto lo hizo por mí, pero también tuve que seguir la respuesta de Nelson aquí
Dominic
1

Otra forma es usar el mysqlimportprograma cliente.

Lo invocas de la siguiente manera:

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

Esto genera una LOAD DATAdeclaración que se carga tableName.txten eltableName tabla.

Tenga en cuenta lo siguiente:

mysqlimportdetermina el nombre de la tabla a partir del archivo que proporciona; usando todo el texto desde el comienzo del nombre del archivo hasta el primer período como el nombre de la tabla. Por lo tanto, si desea cargar varios archivos a la misma mesa que podría distinguirlos como tableName.1.txt, tableName.2.txt, ..., etc., por ejemplo.

Schalk
fuente
1

Esto fue un poco extraño para mí, de un día para otro el guión que ha estado funcionando desde hace días deja de funcionar. No había una versión más reciente de mysql ni ningún tipo de actualización, pero recibía el mismo error, así que le di una última oportunidad al archivo CSV y noté que el final de las líneas usaba \ n en lugar de lo esperado (según mi script ) \ r \ n así que lo guardo con la EOL correcta y ejecuto el script nuevamente sin ningún problema.

Creo que es un poco extraño que mysql me lo diga. El comando usado no está permitido con esta versión de MySQL ya que el motivo era completamente diferente.

Mi comando de trabajo se ve así:

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.
Oscar Nevarez
fuente
1

Utilicé el siguiente método, que no requiere ningún cambio en la configuración , probado en mysql-5.5.51-winx64 y 5.5.50-MariaDB:

ponga 'cargar datos ...' en el archivo .sql (por ejemplo: 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);

luego:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
Jawad Al Shaikh
fuente
1

En caso de que Mysql 5.7 pueda usar "mostrar variables globales como" local_infile ";" que le dará el estado del archivo local. Puede activarlo usando "set global local_infile = ON;".

Midhunlal
fuente
0

Ok, algo extraño está sucediendo aquí. Para que esto funcione, NO es necesario realizar ningún cambio de configuración en /etc/mysql/my.cnf. Todo lo que necesita hacer es reiniciar el servicio mysql actual en la terminal:

sudo service mysql restart

Luego, si quiero "recrear" el error, simplemente reinicio el servicio apache:

sudo service apache2 restart

Que luego se puede arreglar nuevamente ingresando el siguiente comando:

sudo service mysql restart

Entonces, parece que apache2 está haciendo algo para no permitir esta característica cuando se inicia (que luego se invierte / corrige si reinicia el servicio mysql).

Válido en distribuciones basadas en Debian.

service mysqld restart
service httpd restart

Válido en distribuciones basadas en RedHat

bradymiller
fuente
0

Para aquellos de ustedes que buscan respuestas para hacer que LOAD DATA LOCALINFILE funcione como yo, probablemente esto funcione. Bueno, funcionó para mí, así que aquí va. Instale perconacomo su servidor y cliente mysql siguiendo los pasos del enlace. Se le solicitará una contraseña durante la instalación, así que proporcione una que recuerde y úsela más tarde. Una vez realizada la instalación, reinicie su sistema y pruebe si el servidor está en funcionamiento yendo a terminaly escribiendo mysql -u root -py luego la contraseña. Intente ejecutar el comando LOAD DATA LOCAL INFILEahora. Espero que funcione :)

Por cierto, estaba trabajando en Rails 2.3 con Ruby 1.9.3 en Ubuntu 12.04.

Varun Natraaj
fuente
0

Todos: Evidentemente, esto funciona según lo diseñado. Consulte el nuevo representante con fecha del 7 de julio de 2019, Sección 6.1.6, Problemas de seguridad con LOAD DATA LOCAL .

viejo
fuente
0

Agregue local_infileen ambos clienty la mysqldsección.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Probado en MySQL 8.x tanto en Windows como en Linux.

Madan Sapkota
fuente
0

Estoy usando xampp v3.2.4 y mysql server 8.0.20.

He añadido local-infile=1a [mysql]y [mysqld]en el archivo "my.ini". El archivo se encuentra en "C: \ xampp \ mysql \ bin \ my.ini".

Luego inserté los datos del archivo csv usando el siguiente código LOAD DATA INFILE .... Es importante moverse LOCAL. De lo contrario, no funcionará.

Gracias por todas las sugerencias anteriores. Una combinación finalmente funcionó para mí.

usuario7849670
fuente