habilitar - MySQL: habilite LOAD DATA LOCAL INFILE
mysql import data from csv using load data infile (14)
Estoy ejecutando Mysql 5.5 en Ubuntu 12 LTS. ¿Cómo debo habilitar LOAD DATA LOCAL INFILE en my.cnf?
Intenté agregar local-infile en mi configuración en varios lugares, pero sigo recibiendo el mensaje "El comando usado no está permitido con esta versión de MySQL"
Además, para otros lectores, si intentas hacer esto en Django Y tu servidor permite local_infile (puedes verificarlo escribiendo SHOW VARIABLES a través de un cliente mysql) entonces puedes agregar esto a tu archivo settings.py (ya que python MySQLdb doesn '' 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,
},
}
}
Debes tener cuidado de cómo establecer tu conexión mysqli. El crédito completo de esta solución es para Jorge Albarenque, source
Para arreglarlo tuve que:
- Agregue local-infile = 1 a las secciones [mysqld] y [mysql] de my.cnf (como se explica en los comentarios anteriores)
- Use la función mysqli_real_connect ( documentación de PHP ).
El truco 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);
Desde la página de manual de MySQL 5.5:
LOCAL funciona solo si su servidor y su cliente ambos 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".
Debes establecer 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 "infile local".
Es una restricción de seguridad.
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 local-infile debajo de cada uno de ellos.
Funciona para mí en MySQL 5.5 en Ubuntu 12.04 LTS.
En el caso si Mysql 5.7 puede usar "mostrar variables globales como" local_infile ";" que le dará el estado local de infile, puede activarlo usando "set global local_infile = ON;".
Esto fue un poco extraño para mí, de un día para el siguiente, el guión que ha estado funcionando desde hace días simplemente deja de funcionar. No había una versión más reciente de mysql o 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 estaba usando / n en lugar de lo esperado (según mi script ) / r / n entonces lo guardo con la EOL correcta y ejecuto el script nuevamente sin ningún problema.
Creo que es extraño que mysql me diga que el comando usado no está permitido con esta versión de MySQL porque la razón 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.
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
Entonces, si quiero "recrear" el error, simplemente reinicio el servicio apache:
sudo service apache2 restart
Que luego se puede arreglar nuevamente al ingresar el siguiente comando:
sudo service mysql restart
Por lo tanto, parece que apache2 está haciendo algo para no permitir esta característica cuando se inicia (que luego se invierte / se corrige si se reinicia el servicio de mysql).
Válido en distribuciones basadas en Debian.
service mysqld restart
service httpd restart
Válido en distribuciones basadas en RedHat
Otra forma es usar el programa de cliente mysqlimport
.
Lo invocas de la siguiente manera:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
Esto genera una instrucción LOAD DATA
que carga tableName.txt
en la tabla tableName
.
Tenga en cuenta lo siguiente:
mysqlimport
determina el nombre de la tabla del archivo que proporcionas; 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 en la misma tabla, podría distinguirlos como tableName.1.txt
, tableName.2.txt
, ..., etc., por ejemplo.
Para aquellos de ustedes que buscan respuestas para hacer que LOAD DATA LOCAL
INFILE funcione como yo, esto probablemente funcione. Bueno, funcionó para mí, así que aquí va. Instala percona
como tu servidor y cliente mysql siguiendo los pasos del enlace. Se le pedirá una contraseña durante la instalación, así que proporcione una que recuerde y úsela más adelante. Una vez realizada la instalación, reinicie su sistema y compruebe si el servidor está en funcionamiento accediendo a la terminal
y escribiendo mysql -u root -p
y luego la contraseña. Intenta ejecutar el comando LOAD DATA LOCAL INFILE
ahora ... Espero que funcione :)
Por cierto, estaba trabajando en Rails 2.3 con Ruby 1.9.3 en Ubuntu 12.04.
Reemplace el controlador php5-mysql por el controlador nativo
En Debian
apt-get install php5-mysqlnd
Usé 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:
poner ''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);
entonces:
mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:/Work/LoadTableName.sql"
en caso de que tu sabor de mysql en ubuntu NO funcione bajo ninguna circunstancia y load data infile
teniendo el error 1148, puedes ejecutar el comando load data infile
través de la línea de comando
abrir una ventana de terminal
ejecuta mysql -u YOURUSERNAME -p --local-infile YOURDBNAME
se le pedirá que ingrese la contraseña de mysqluser
ejecutará MySQLMonitor y el símbolo del sistema será mysql>
ejecuta tu comando load data infile
(no te olvides de 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'';
si su archivo csv está ubicado igual que con db, necesita eliminar LOCAL en LOAD DATA INFILE , o obtendrá el error
El comando usado no está permitido con esta versión de MySQL