Acceso denegado; necesita (al menos uno de) los privilegios SUPER para esta operación

Resuelto kenpeter asked hace 54 años • 21 respuestas

Entonces intento importar un archivo sql a rds (1G MEM, 1 CPU). El archivo sql es como 1.4G

mysql -h xxxx.rds.amazonaws.com -u usuario -ppass --max-allowed-packet=33554432 db < db.sql

Se quedó atascado en:

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

El contenido real de SQL es:

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
        SET NEW.created_at = NOW();
END IF */;;

another_userno existe en rds, entonces lo hago:

GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';

Todavía no hubo suerte.

kenpeter avatar Jan 01 '70 08:01 kenpeter
Aceptado

Elimine la DEFINER=..declaración de su archivo sqldump o reemplace los valores del usuario con CURRENT_USER.

El servidor MySQL proporcionado por RDS no permite una DEFINERsintaxis para otro usuario (en mi experiencia).

Puede utilizar un sedscript para eliminarlos del archivo:

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql
hjpotter92 avatar May 17 '2017 04:05 hjpotter92

Elimine las 3 líneas a continuación si están allí, o coméntelas con -- :

Al principio:

-- SET @@SESSION.SQL_LOG_BIN= 0;
-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';

Al final:

-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

Tenga en cuenta que los caracteres de comentario son "espacio de guión", incluido el espacio.

Una mejor solución es evitar que estas líneas se escriban en el archivo de volcado incluyendo la opción --set-gtid-purged=OFFen su mysqldumpcomando.

Jeremy Jones avatar Dec 23 '2019 11:12 Jeremy Jones

Otro truco útil es invocar mysqldump con la opción --set-gtid-purged=OFFque no escribe las siguientes líneas en el archivo de salida:

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

No estoy seguro del DEFINER.

quimm2003 avatar Mar 10 '2020 16:03 quimm2003