Así que trato de importar el 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 operationEl contenido sql real 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_user no existe en rds, así que lo hago:
GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';Todavía no hay suerte.
Quite la DEFINER=.. de su archivo sqldump o reemplace los valores de usuario con CURRENT_USER .
El servidor MySQL proporcionado por RDS no permite una sintaxis DEFINER para otro usuario (según mi experiencia).
Puede usar un script sed para eliminarlos del archivo:
sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sqlPara importar un archivo de base de datos en formato .sql.gz , elimine el definidor e importe usando el siguiente comando
zcat path_to_db_to_import.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db_nameAnteriormente, exporte la base de datos en formato .sql.gz usando el siguiente comando.
mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;
Importe esa base de datos exportada y elimine el definidor usando el siguiente comando,
zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db
Cuando restaure la copia de seguridad, asegúrese de probar con el mismo nombre de usuario para el anterior y el nuevo.
Todas las soluciones anteriores están bien. Y aquí voy a combinar todas las soluciones para que funcione en todas las situaciones.
Para Linux y Mac
sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql Para ventanas
descargue atom o notepad ++, abra su archivo sql de volcado con atom o notepad ++, presione Ctrl + F
busque la palabra DEFINER y elimine la línea DEFINER= admin @ % (o puede ser un poco diferente para usted) de todas partes y guarde el archivo.
Como por ejemplo
antes de eliminar esa línea: CREATE DEFINER= admin @ % PROCEDURE MyProcedure
Después de eliminar esa línea: CREATE PROCEDURE MyProcedure
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;Necesita configurar el parámetro del servidor "on" "log_bin_trust_function_creators" en el lado del servidor. Este se puede encontrar fácilmente en la hoja del lado izquierdo si es azul maria db.
Ninguna de las soluciones anteriores funcionó para mí. Tuve que hacer lo siguiente:
Use las siguientes banderas con mysqldump :
mysqldump --databases <db1> <db2> --master-data=1 --single-transaction --order- by-primary --foce -r all.sql -h<host> -u<user> -p<password>Elimina la línea que se parece a:
CHANGE MASTER TO MASTER_LOG_FILE='binlog.....sed -i '22d' all.sqlImporte los datos a su RDS:
mysql -h<host> -u<user> -p<password> $ source all.sqlCuando creamos una nueva instancia de base de datos de RDS, el usuario maestro predeterminado no es el usuario raíz. Pero solo obtiene ciertos privilegios para esa instancia de base de datos. Este permiso no incluye el permiso SET . Ahora, si su usuario maestro predeterminado intenta ejecutar los comandos SET de mysql, se enfrentará a este error: Acceso denegado; necesita (al menos uno de) los privilegios SUPER o SYSTEM_VARIABLES_ADMIN para esta operación
Comenta o elimina estas líneas
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; SET @@SESSION.SQL_LOG_BIN= 1; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';También puede ignorar los errores usando la opción -f para cargar el resto del archivo de volcado.
mysql -f <REPLACE_DB_NAME> -u <REPLACE_DB_USER> -h <DB_HOST_HERE> -p < dumpfile.sqlSi ayuda, cuando intenté restaurar un volcado de base de datos en mi AWS MySQL RDS, recibí este error:
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operationNo tuve que cambiar el DEFINITOR o eliminar/comentar líneas. Lo acabo de hacer:
GRANT SESSION_VARIABLES_ADMIN ON *.* TO myuser@'myhost'; GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO myuser@'myhost';Y pude hacer la restauración.
Emisión en basurero.
Intente obtener el volcado de la siguiente manera:
mysqldump -h databasehost --user=databaseusername --password --single-transaction databasename | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | gzip > /tmp/database.sql.gzLuego, intente importar de la siguiente manera:
zcat /tmp/database.sql.gz | mysql -h database_host -u username -p databasenameOtro truco útil es invocar mysqldump con la opción --set-gtid-purged=OFF que 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 sobre el DEFINER.
* La respuesta solo puede ser aplicable a MacOS *
Al intentar importar un archivo .sql en un contenedor docker, encontré el mensaje de error:
Acceso denegado; necesita (al menos uno de) los privilegios SUPER para esta operación
Luego, mientras probaba algunas de las otras sugerencias, recibí el siguiente error en mi MacOS (osx)
sed: RE error: secuencia de bytes ilegal
Finalmente, el siguiente comando de este recurso resolvió mi problema de "Acceso denegado".
LC_ALL=C sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' fileName.sqlEntonces podría importar a la base de datos docker con:
docker exec -i dockerContainerName mysql -uuser -ppassword table < importFile.sql¡Espero que esto ayude! :)
Problema : está intentando importar datos (usando el archivo mysqldump) a su base de datos mysql, pero parece que no tiene permiso para realizar esa operación.
Solución : suponiendo que sus datos se migran, se siembran y actualizan en su base de datos mysql, tome una instantánea usando mysqldump y expórtelo a un archivo
mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sqlDe la documentación de mysql:
GTID : un identificador de transacción global (GTID) es un identificador único creado y asociado con cada transacción comprometida en el servidor de origen (maestro). Este identificador es único no solo para el servidor en el que se originó, sino que es único en todos los servidores en una configuración de replicación determinada. Hay un mapeo 1 a 1 entre todas las transacciones y todos los GTID.
--set-gtid-purged=OFF SET @@GLOBAL.gtid_purged no se agrega a la salida y SET @@SESSION.sql_log_bin=0 no se agrega a la salida. Para un servidor donde los GTID no están en uso, use esta opción o AUTO. Solo use esta opción para un servidor donde se usan GTID si está seguro de que el conjunto de GTID requerido ya está presente en gtid_purged en el servidor de destino y no debe cambiarse, o si planea identificar y agregar cualquier GTID que falte manualmente.
Luego, conéctese a su mysql con el usuario root, otorgue permisos, vacíelos y verifique que sus privilegios de usuario se hayan actualizado correctamente.
mysql -u root -p UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%'; FLUSH PRIVILEGES; mysql> SHOW GRANTS FOR 'johnDoe'; +------------------------------------------------------------------+ | Grants for johnDoe | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `johnDoe` | | GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe` | +------------------------------------------------------------------+Ahora vuelva a cargar los datos y la operación debería estar permitida .
mysql -h [host] -u [user] -p[pass] [db_name] < [mysql_dump_name].sqlComenté que todas las líneas comienzan con SET en el archivo *.sql y funcionó.
Si su archivo de volcado no tiene DEFINER , asegúrese de que estas líneas a continuación también se eliminen si están allí, o se comenten 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;Solo una actualización adicional de MacOS para la respuesta hjpotter92.
Para que sed reconozca el patrón en MacOS, deberá agregar una barra invertida antes del signo = , así:
sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sqlAsunto
Debajo de la declaración o alinee su problema de creación de archivo de volcado
DEFINITOR= nombre de
username@`%
Solución simple
La solución que puede solucionar es eliminar todas las entradas del archivo de volcado de SQL e importar datos desde la consola de GCP .
cat DUMP_FILE_NAME.sql | sed -e 's/DEFINER=`<username>`@`%`//g' > NEW-CLEANED-DUMP.sqlEl comando anterior ayudará a eliminar todas esas líneas del archivo de volcado y crear el nuevo archivo de volcado sin Definer .
Intente importar un archivo nuevo (NEW-CLEANED-DUMP.sql).
Si está en AWS RDS
Es posible que vea un problema de cara, si su archivo de volcado es más grande, puede verificar las primeras 20 líneas usando
head -30 filenameuna vez que pueda ver la salida, busque la línea y el número de línea
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ ''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;eliminaremos estas líneas por números de línea, por ejemplo, 17,18,24 número de línea
sed -e '24d;17d;18d' file-name.sql > removed-line-file-name.sql