acceso denegado para cargar datos en MySQL

105

Utilizo consultas MySQL todo el tiempo en PHP, pero cuando intento

LOAD DATA INFILE

Obtuve el siguiente error

# 1045 - Acceso denegado para el usuario 'usuario' @ 'localhost' (usando contraseña: SÍ)

Alguien sabe que significa esto?

Brian
fuente

Respuestas:

197

También me encontré con este problema. Tuve que agregar LOCALa mi declaración SQL.

Por ejemplo, esto da el problema de permisos:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Agregue LOCALa su declaración y el problema de permisos debería desaparecer. Al igual que:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
jeremysawesome
fuente
12
Esto hace algo diferente. Carga su archivo en el servidor en un directorio temporal. Esto es necesario a veces, pero si el archivo ya está en el servidor MySQL, solo está haciendo un trabajo redundante.
jeffcook2150
1
sí, esto funcionó para mí, estaba reenviando el puerto del servidor de la base de datos a través de ssh y supongo que estaba buscando el archivo en el servidor de la base de datos remota sin la parte LOCAL
mike
2
@jeremysawesome para mí, esto produce el siguiente error: Código de error: 1148 El comando usado no está permitido con esta versión de MySQL. Intenté algunas respuestas para este problema, como modificar el archivo mysql a local-infile = 1 y eso también falló.
OrwellHindenberg
una actualización de mySQL a 6.2.5 me resolvió este problema
OrwellHindenberg
4
también puede tener que llamar a mysql con la --local-infileopción.
shabbychef
32

Tuve este problema. Busqué alrededor y no encontré una respuesta satisfactoria. A continuación resumo los resultados de mis búsquedas.

El error de acceso denegado podría significar que:

  • 'usuario' @ 'localhost' no tiene el privilegio FILE ( GRANT FILE on *.* to user@'localhost'); o,
  • el archivo que está intentando cargar no existe en la máquina que ejecuta el servidor mysql (si usa LOAD DATA INFILE); o,
  • el archivo que está intentando cargar no existe en su máquina local (si usa LOAD DATA LOCAL INFILE); o,
  • el archivo que está intentando cargar no es legible para todo el mundo (necesita que el archivo y todos los directorios principales sean legibles para todo el mundo: directorio chmod 755; y chmod 744 file.dat)
Yamir Encarnación
fuente
+1: Esto funcionó para mí: el archivo que está intentando cargar no es legible para todo el mundo (necesita que el archivo y todos los directorios principales sean legibles para todo el mundo: directorio chmod 755; y chmod 744 file.dat) . No había cambiado los permisos en todos mis directorios
gavdotnet
1
El usuario Tatiana señala que no puede otorgar el privilegio FILE por base de datos, solo para todo el servidor. El comando de concesión sería "GRANT FILE on . To user @ 'localhost' IDENTIFIED BY 'password');"
JAL
3
@JAL Creo que te refieres a "GRANT FILE ON *. * Al usuario ..." - probablemente los caracteres de asterisco fueron eliminados
Eugene M
como @Eugene M dijo que esto da un error Uso incorrecto de DB GRANT y PRIVILEGIOS GLOBALES
Contador م
19

Intente usar este comando:

load data local infile 'home/data.txt' into table customer;

Esto debería funcionar. Funcionó en mi caso.

shreyas-agrawal
fuente
3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Stewart
@ Stewart, elimine 'local' del comando anterior. Las versiones posteriores de mysql no parecen admitir este indicador cuando la variable global 'local_infile' se establece en 'ON' (como se muestra a continuación). Por tanto, el mandato será; mysql> cargar el archivo de datos 'home / data.txt' en la tabla cliente; + --------------- + ------- + | Variable_name | Valor | + --------------- + ------- + | local_infile | ON | + --------------- + ------- +
Kamran Hyder
@KamranHyder Parece que tienes una buena respuesta para mí. ¿Por qué no agregarlo como una respuesta completa?
Stewart
10

Asegúrese de que su usuario de MySQL tenga el privilegio FILE otorgado.

Si tiene un alojamiento web compartido, existe la posibilidad de que su proveedor de alojamiento lo bloquee.

tanerkay
fuente
En un alojamiento web compartido: ¿sería útil utilizar "LOAD DATA LOCAL INFILE"?
Peter
3

La cadena de Lyon me dio un muy buen consejo: en Windows, necesitamos usar barras oblicuas y no barras invertidas. Este código funciona para mí:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();
Matthias Wuttke
fuente
2

Me encontré con el mismo problema y lo resolví siguiendo esos pasos:

  • activar la variable load_infile
  • gran permiso de archivo para mi usuario mysql personalizado
  • desactivar la variable secure_file_priv (mi archivo fue subido por el servidor web a la carpeta / tmp que por supuesto no es el directorio seguro de myslq / var / lib / mysql-file)

Para este tercer punto, puede consultar: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

ANUNCIO

usuario7996813
fuente
2

Esto también me pasó a mí y a pesar de haber seguido todos los pasos descritos por Yamir en su publicación no pude hacerlo funcionar.

El archivo estaba en /tmp/test.csv con 777 permisos. El usuario de MySQL tenía permisos de archivo, la opción LOCAL no estaba permitida por mi versión de MySQL, así que me quedé atascado.

Finalmente pude resolver el problema ejecutando:

sudo chown mysql:mysql /tmp/test.csv
Giacomo
fuente
2

Encontré uno fácil si está usando la línea de comando

Iniciar sesión comomysql -u[username] -p[password] --local-infile

luego SET GLOBAL local_infile = 1;

seleccione su base de datos por use [db_name]

y finalmente LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;

Shantanu Khond
fuente
La adición de --local-inline me ayudó. Sin embargo, la variable global local_infile ya estaba activada en mi caso. Creo que es mejor que los usuarios averigüen primero qué valor han escrito en esta variable antes de modificarla.
Eugene Maysyuk
Para usuarios de RDS => Agregar el --local-infile me ayudó en RDS, sin embargo SET GLOBAL local_infile = 1;, no parece funcionar en RDS, pero de todos modos sin eso --local-infilefuncionó
Hecho
0

Descubrí que cargar tablas MySQL puede ser rápido y sencillo (estaba usando scripts del administrador de modelos de Python / Django):

1) crear una tabla con todas las columnas VARCHAR (n) NULL, por ejemplo:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) elimine los encabezados (primera línea) de csv, luego cargue (si olvida LOCAL, obtendrá "# 1045 - Acceso denegado para el usuario 'usuario' @ 'localhost' (usando contraseña: YES)"):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) alterar columnas:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!

magula
fuente
-5

Probablemente significa que la contraseña que proporcionó 'user'@'localhost'es incorrecta.

David Grant
fuente
1
No lo creo. Puedo hacer otras consultas con la misma contraseña.
Brian