¿Cómo debo abordar --secure-file-priv en MySQL?


358

Estoy aprendiendo MySQL e intenté usar una LOAD DATAcláusula. Cuando lo usé como a continuación:

LOAD DATA INFILE "text.txt" INTO table mytable;

Tuve el siguiente error:

El servidor MySQL se ejecuta con la opción --secure-file-priv, por lo que no puede ejecutar esta declaración

¿Cómo abordo este error?

He comprobado otra pregunta sobre el mismo mensaje de error , pero todavía no puedo encontrar una solución.

Estoy usando MySQL 5.6


compartir ruta de su archivo csv
Zafar Malik

1
Por supuesto, obtienes este error cuando intentas usarlo mysqldump --tab, como si no fuera lo suficientemente difícil sacar tus propios datos de mysql.
William Entriken

1
Además de la respuesta de Vhu, busque a continuación la respuesta de Wolfsshield. necesita cambiar a '/' para que funcione (estoy usando win10)
Rsc Rsc

44
use LOCAL. LOAD DATA LOCAL INFILE ...
mpoletto

Respuestas:


474

Funciona según lo previsto. Su servidor MySQL se inició con la opción --secure-file-priv que básicamente limita desde qué directorios puede cargar archivos LOAD DATA INFILE.

Puede usar SHOW VARIABLES LIKE "secure_file_priv";para ver el directorio que se ha configurado.

Tienes dos opciones:

  1. Mueva su archivo al directorio especificado por secure-file-priv.
  2. Desactivar secure-file-priv. Esto debe eliminarse del inicio y no puede modificarse dinámicamente. Para hacer esto, verifique los parámetros de inicio de MySQL (según la plataforma) y my.ini.

44
Por defecto, my.ini se puede encontrar en "C: \ ProgramData \ MySQL \ MySQL Server 5.6" cuando se ejecuta MySQL 5.6 en el servidor W2012. También es posible que desee comprobar los parámetros de inicio del servicio (por ejemplo, --defaults-file = "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini), ya que también pueden --secure-file-priv
aparecer en la

2
@Mohitbhasi, my-default.ini debe estar en la carpeta "C: \ Archivos de programa \ MySQL \ MySQL Server 5.6". La ubicación a la que se refería vhu es "C: \ ProgramData \ MySQL \ MySQL Server 5.6". Por si no te has dado cuenta.
NurShomik

67
Valor: NULL FML
William Entriken

11
Tenga en cuenta que si usa "select .. into outfile" debe especificar la ruta completa y la ruta completa debe coincidir con los resultados deSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnight

99
"verificar los parámetros" y "verificar my.ini" no es una muy buena respuesta
Roland Seuhs

234

Tuve el mismo problema Finalmente resolví usando la LOCALopción en el comando

LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

Puede encontrar más información aquí http://dev.mysql.com/doc/refman/5.7/en/load-data.html

Si se especifica LOCAL, el programa del cliente lee el archivo en el host del cliente y lo envía al servidor. El archivo se puede proporcionar como un nombre de ruta completo para especificar su ubicación exacta. Si se proporciona como un nombre de ruta relativo, el nombre se interpreta en relación con el directorio en el que se inició el programa cliente.


2
Esto funcionó para mí y para nadie más. He intentado: 1. a subir mi archivo txt en C:\ProgramData\MySQL\MySQL Server 5.7\Uploads, 2. incapacitante secure_file_priven my.iniy reiniciar MySQL 3. Éste! Gracias :)
Kamal Nayan

10
Recibí este mensaje de error para MariaDB: "ERROR 1148 (42000): el comando utilizado no está permitido con esta versión de MariaDB". La versión exacta: "mysql Ver 15.1 Distrib 10.1.22-MariaDB, para Linux (x86_64) usando readline 5.2"
jciloa

11
Obtuve "El comando utilizado no está permitido con esta versión de MySQL" para mysql versión 5.7.19.
Alison S

2
@AlisonS Intente agregar la --local-infilebandera cuando se ejecuta mysql. stackoverflow.com/questions/10762239/…
Illya Moskvin

1
The used command is not allowed with this MySQL versiondesde MySQL 8.0
bitfishxyz

118

En Ubuntu 14 y Mysql 5.5.53, esta configuración parece estar habilitada de forma predeterminada. Para deshabilitarlo, debe agregarlo secure-file-priv = ""a su archivo my.cnf en el grupo de configuración mysqld. p.ej:-

[mysqld]
secure-file-priv = ""

1
Esto funcionó para mí también. Misma versión de Ubuntu y MySQL
Rodney

1
+1 funcionó para mí. Si está usando Ubuntu, no olvide reiniciar el servicio mysql: sudo service mysql restart
Emiliano Sangoi

1
Esto es lo que funciona si necesita que apunte a una ubicación que seleccione por declaración, cuando corresponda. Esto funciona con MySQL 5.7 en Windows Server tal como lo explicó. Si simplemente comenta la línea como # secure-file-priv = ~sigue, aún tiene el error, ya que el valor que se muestra al NULLhacerlo de esta manera resuelve el problema cuando desea elegir a qué directorios puede exportar en el servidor, etc.
Bitcoin Murderous Maniac

1
Me funcionó con MySQL 5.7 en Windows, mientras que las otras soluciones no.
CGritton

NB: si hace esto en Docker, debe reiniciar el contenedor Docker.
user1717828

38

Estoy trabajando en MySQL5.7.11 en Debian, el comando que me funcionó para ver el directorio es:

mysql> SELECT @@global.secure_file_priv;

Con lo SHOW VARIABLES LIKE "secure_file_priv";que obtengo ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existtambién se lanza en otras circunstancias y tendré que lidiar eventualmente. Sin SELECT @@global.secure_file_priv;embargo, el comando produjo el resultado esperado.
Majid Fouladpour

1
Esto funcionó para mí - Ubuntu Mysql 5.7.21: cambió el archivo de salida al directorio /var/lib/mysql-files/output.txt
Shanemeister el

2
¿Cómo lo editas entonces? Traté de editarlo en /etc/mysql/my.cnf y parece que no tiene ningún efecto, permanece NULO
Slavik

25

Esto es lo que funcionó para mí en Windows 7 para deshabilitar secure-file-priv(Opción # 2 de la respuesta de vhu ):

  1. Detenga el servicio del servidor MySQL entrando services.msc.
  2. Ir a C:\ProgramData\MySQL\MySQL Server 5.6( ProgramDataera una carpeta oculta en mi caso).
  3. Abra el my.iniarchivo en el Bloc de notas.
  4. Busque 'secure-file-priv'.
  5. Comente la línea agregando '#' al comienzo de la línea. Para MySQL Server 5.7.16 y superior, comentar no funcionará. Tienes que configurarlo en una cadena vacía como esta:secure-file-priv=""
  6. Guarda el archivo.
  7. Inicie el servicio del servidor MySQL entrando services.msc.

16
A partir de MySQL Server 5.7.16, comentar la línea no funcionará, porque luego volverá al valor predeterminado, lo que deshabilita las operaciones de importación y exportación. Ahora debe establecerlo en una cadena vacía si desea permitir estas operaciones desde cualquier directorio.
dbc

1
Ramnath, por favor, edita tu respuesta con los detalles de @dbc para la versión 5.7.x. Gracias.
Rafael Gomes Francisco

Agregar una cadena vacía funciona para mí; cambie la respuesta para agregar una cadena vacía como secure-file-priv = ""
Rajesh Goel

Para Windows, asegúrese de utilizar barras diagonales
Oliver Oliver

22

Si el archivo es local para su máquina, use LOCAL en su comando

LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;

15

@vhu

Hice el SHOW VARIABLES LIKE "secure_file_priv";y regresó, C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\así que cuando lo conecté, todavía no funcionaba.

Cuando fui directamente al archivo my.ini descubrí que la ruta tiene un formato un poco diferente: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

Luego, cuando lo ejecuté con eso, funcionó. La única diferencia es la dirección de las barras.


tu respuesta funcionó para mí, muchas
gracias

Sí, sí, sí ... ¿Por qué esta respuesta está tan abajo? Luché por mucho tiempo y luego lo conseguí. Regresé para agregar esto como respuesta, pero está tan lejos que no lo vi antes de perder el tiempo.
Rsc Rsc

No todos los héroes usan capa.
JRK

9

Tuve el mismo problema con 'secure-file-priv'. Los comentarios en el archivo .ini no funcionaron y tampoco lo hizo mover archivos en el directorio especificado por 'secure-file-priv'.

Finalmente, como sugirió dbc, funcionó 'secure-file-priv' igual a una cadena vacía. Entonces, si alguien está atrapado después de intentar las respuestas anteriores, espero que esto ayude.


9

Lo que funcionó para mí:

  1. Coloque su archivo dentro de la carpeta especificada en secure-file-priv.

Para encontrar ese tipo:

mysql> muestra variables como "secure_file_priv";


  1. Comprueba si tienes local_infile = 1.

Haz eso escribiendo:

mysql> muestra variables como "local_infile";

Si lo consigues:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+

Luego configúrelo en uno escribiendo:

mysql> set global local_infile = 1;


  1. Especifique la ruta completa para su archivo. En mi caso:

mysql> cargar el archivo de datos "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt" en la prueba de tabla;


6

Este hilo ha sido visto 522k veces al momento de esta publicación. Honestamente, ¿ cuándo se convirtió MySQL en nuestra madre irracional sobreprotectora ? ¡Qué intento de seguridad que lleva mucho tiempo, que realmente solo sirve para encadenarnos!

Después de muchas búsquedas y muchos intentos, todo falló.
Mi solución:

  1. Importe el archivo .csv a través de la importación PhpMyAdmin en el cuadro anterior (si es grande, haga en la línea cmd)
  2. generar un archivo .sql
  3. descargar archivo .sql
  4. Importar archivos .sql a través del banco de trabajo MySQL

4

Creé un script de importación de NodeJS si está ejecutando nodeJS y sus datos están en la siguiente forma (comillas dobles + coma y \ n nueva línea)

INSERT INTO <your_table> VALUEs( **CSV LINE **)

Este está configurado para ejecutarse en http: // localhost: 5000 / import .

Voy línea por línea y creo una cadena de consulta

"city","city_ascii","lat","lng","country","iso2","iso3","id"
"Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
...

server.js

const express = require('express'),
   cors = require('cors'),
   bodyParser = require('body-parser'),
   cookieParser = require('cookie-parser'),
   session = require('express-session'),
   app = express(),
   port = process.env.PORT || 5000,
   pj = require('./config/config.json'),
   path = require('path');

app.use(bodyParser.json());
app.use(cookieParser());
app.use(cors());


app.use(
   bodyParser.urlencoded({
      extended: false,
   })
);

var Import = require('./routes/ImportRoutes.js');

app.use('/import', Import);
if (process.env.NODE_ENV === 'production') {
   // set static folder
   app.use(express.static('client/build'));

   app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
   });
}

app.listen(port, function () {
   console.log('Server is running on port: ' + port);
});

ImportRoutes.js

const express = require('express'),
   cors = require('cors'),
   fs = require('fs-extra'),
   byline = require('byline'),
   db = require('../database/db'),
   importcsv = express.Router();

importcsv.use(cors());

importcsv.get('/csv', (req, res) => {

   function processFile() {
      return new Promise((resolve) => {
         let first = true;
         var sql, sqls;
         var stream = byline(
            fs.createReadStream('../PATH/TO/YOUR!!!csv', {
               encoding: 'utf8',
            })
         );

         stream
            .on('data', function (line, err) {
               if (line !== undefined) {
                  sql = 'INSERT INTO <your_table> VALUES (' + line.toString() + ');';
                  if (first) console.log(sql);
                  first = false;
                  db.sequelize.query(sql);
               }
            })
            .on('finish', () => {
               resolve(sqls);
            });
      });
   }

   async function startStream() {
      console.log('started stream');
      const sqls = await processFile();
      res.end();
      console.log('ALL DONE');
   }

   startStream();
});

module.exports = importcsv;

db.js es el archivo de configuración

const Sequelize = require('sequelize');
const db = {};
const sequelize = new Sequelize(
   config.global.db,
   config.global.user,
   config.global.password,
   {
      host: config.global.host,
      dialect: 'mysql',
      logging: console.log,
      freezeTableName: true,

      pool: {
         max: 5,
         min: 0,
         acquire: 30000,
         idle: 10000,
      },
   }
);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Descargo de responsabilidad: esta no es una solución perfecta: solo la publico para desarrolladores que están bajo una línea de tiempo y tienen muchos datos para importar y se encuentran con este problema ridículo. Perdí mucho tiempo en esto y espero ahorrarle a otro desarrollador el mismo tiempo perdido.


3

Tuve todo tipo de problemas con esto. Estaba cambiando my.cnf y todo tipo de locuras que otras versiones de este problema intentaron mostrar.

Lo que funcionó para mí:

El error que estaba recibiendo

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Pude solucionarlo abriendo /usr/local/mysql/support-files/mysql.server y cambiando la siguiente línea:

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" -- $other_args >/dev/null &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

a

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" --secure-file-priv="" $other_args >/dev/null &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

3

Si está ejecutando en Ubuntu, también puede necesitar configurar Apparmor para permitir que MySQL escriba en su carpeta, por ejemplo, aquí está mi configuración:

Agregue esta línea al archivo /etc/apparmor.d/usr.sbin.mysqld:

/var/lib/mysql-files/* rw

Luego agregue estas 2 líneas de configuración a las secciones /etc/mysql/my.cnf:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

Aquí está mi SQL:

select id from blahs into outfile '/var/lib/mysql-files/blahs';

Funcionó para mi. ¡Buena suerte!


Sí, poner la ruta del archivo con "/var/lib/mysql-files/filename.csv" funcionó para mí.
Anidhya Bhatnagar

3

Para la versión mysql 8.0 puede hacer esto:

  1. mysql.server stop
  2. mysql.server start --secure-file-priv = ''

Funcionó para mí en Mac High Sierra


1

Tuve este problema en Windows 10. "--secure-file-priv en MySQL" Para resolver esto, hice lo siguiente.

  1. En la búsqueda de Windows (abajo a la izquierda), escribí "powershell".
  2. Haga clic derecho en powershell y se ejecutó como administrador.
  3. Navegado al archivo bin del servidor. (C: \ Archivos de programa \ MySQL \ MySQL Server 5.6 \ bin);
  4. Mecanografiado ./mysqld
  5. Presione enter"

El servidor se inició como se esperaba.


1

MySQL usa esta variable del sistema para controlar dónde puede importar sus archivos

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+

Entonces, el problema es cómo cambiar las variables del sistema como secure_file_priv.

  1. apagar mysqld
  2. sudo mysqld_safe --secure_file_priv=""

ahora puedes ver así:

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+

0

En macOS Catalina, seguí estos pasos para configurar secure_file_priv

1.Detener el servicio MySQL

 sudo /usr/local/mysql/support-files/mysql.server stop

2. Reinicie la asignación MYSQL --secure_file_priv variables del sistema

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=YOUR_FILE_DIRECTORY

Nota: Agregar un valor vacío solucionó el problema y MYSQL exportará datos al directorio / usr / local / mysql / data / YOUR_DB_TABLE / EXPORT_FILE

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=

Gracias


0

Sin cambiar ninguno de los archivos de configuración.

  1. Busque el valor de secure_file_privuso del comando Publicado por @vhu: SHOW VARIABLES LIKE "secure_file_priv".
  2. defina la ruta completa para su consulta como: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

esto funcionó para mi en mysql-shell en ubuntu 18.04 LTS mysql 5.7.29

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.