Importar CSV a MySQL desde consola

PhpMyAdmin no puede importar ficheros CSV de gran tamaño, para ello habrá que usar la consola de MySQL y realizar desde allí la importación.

El comando MySQL LOAD DATA INFILE permite leer registros desde un fichero de texto (CSV), donde se pueden determinar las características de los datos a importar, como el carácter de separación (coma, punto y coma, etc.) entre campo o el carácter de fin de línea (CR, CRLF, etc.) y más.

Si nos muestra el siguiente error:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Se corrige así: mysql –local-infile=1 -u user -p

Un ejemplo:

USE nombre-de-la-basededatos;
LOAD DATA
LOCAL INFILE '/home/user/fichero.csv'
INTO TABLE nombre-de-la-tabla
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r\n'
CHARACTER SET  'utf8'
IGNORE 1 LINES;

El ejemplo procesará el archivo sitiuado en /home/user y con nobre fichero.csv, añadiendo los datos en la tabla «nombre-de-la-tabla», indicando que los campos están separados por punto y coma y las líneas acaban con «CRLF» (Windows). Además se salta la línea, donde suelen estar los nombre de cabecera (IGNORE) .

Otro ejemplo:

USE nombre-de-la-basededatos;
LOAD DATA INFILE '/home/user/fichero.csv' 
INTO TABLE nombre-de-la-tabla 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
LINES TERMINATED BY '\n';

 

En este caso indica que los campos están separados por coma y delimitados por comillas (CSV estándar) y las líneas acaban con «LF» (Linux).

Si en el proceso de importación os nuestra el error:

ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement

Quiere decir que MySQL server tiene activado –secure-file-priv una opción que sólo permite leer ficheros subidos a un directorio determinado para  leer ficheos con la función LOAD DATA INFILE.

Se puede averiguar el directorio SECURE_FILE_PRIV con la sentencia:

SHOW VARIABLES LIKE "secure_file_priv";

o

mysql> SELECT @@GLOBAL.secure_file_priv;

Se puede hacer dos cosas

  1. Mover el .csv al directrio secure-file-priv.
  2. Desactivar secure-file-priv en el fichero de configuración my.ini:

Editar: /etc/mysql/my.cnf

[mysqld]
.
.
.
secure_file_priv=/var/lib/mysql-files/
.
.
.

Modificar la línea secure_file_priv por directorio deseado.
Reinciar MySql.