database,  mysql,  ubuntu

Deshabilitar secure_file_priv en mysql Ubuntu

Quieres exportar una select a .csv y al ejecutar te encuentras con un error tipo: «Error Code: 1290. The MySQL server is running with the –secure-file-priv option so it cannot execute this statement«

En las últimas versiones de Mysql estamos viendo como la seguridad asume un papel cada vez más importante. En este caso encontramos que por defecto se deshabilita o mejor dicho, se condiciona, la escritura a archivo de sentencias SQL.

Si intentas ejecutar la siguiente sentencia para exportar la tabla alert a un archivo csv:

SELECT * FROM alert
INTO OUTFILE '/tmp/alert.csv' 
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

Lo más probable, es que el sistema devuelva algo así

23:08:29	SELECT * FROM alert INTO OUTFILE '/home/nusemod/Documents/bck/alert.csv'  FIELDS ENCLOSED BY '"'  TERMINATED BY ';'  ESCAPED BY '"'  LINES TERMINATED BY '\r\n'	Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement	0.0028 sec

Entonces, ¿se puede exportar una query a cvs?

La respuesta es si, claro, tenemos dos opciones.

Opción 1: Exportar al path de «secure_file_priv«

La primera y más segura es mantener la configuración actual y realizar la exportación al único sitio que permite mysql por defecto.

Mysql permite exportar únicamente a un directorio, definido por la variable «secure_file_priv«

Para conocer el mismo ejecuta en mysql:

SHOW VARIABLES LIKE "secure_file_priv";

El directorio en este caso es ‘/var/lib/mysql-files/’

Ahora solo tengo que indicar el directorio correcto en la sentencia:

SELECT * FROM alert
INTO OUTFILE '/var/lib/mysql-files/alert.csv' 
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

Opción 2: Deshabilitar «secure_file_priv«

Si bien en mi opinión es una opción menos segura que la anterior, en determinados casos puede que necesitemos exportar directamente a otra ruta.

En este caso podemos deshabilitar secure_file_priv.

Para ello, en caso de Ubuntu, editamos el archivo /etc/mysql/mysql.conf.d/mysqld.cnf

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Y dentro de [mysqld] añadimos la linea:

secure_file_priv=""

Guardamos y por último, para que coja los cambios, reiniciamos mysql con:

 sudo /etc/init.d/mysql restart

Con esto es posible especificar cualquier directorio de salida.

SELECT * FROM alert
INTO OUTFILE '/tmp/alert.csv' 
FIELDS ENCLOSED BY '"' 
TERMINATED BY ';' 
ESCAPED BY '"' 
LINES TERMINATED BY '\r\n';

Espero sea de utilidad!

Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada.