Error de MySQL / Amazon RDS: "no tiene SUPER privilegios ..."

97

Estoy intentando copiar mi base de datos mysql de un Amazon EC2 a un RDS:

Hice con éxito una parte mysqldumpde mi base de datos en mi carpeta raíz usando esto:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Luego intenté transferir este archivo .sql a mi nueva base de datos RDS:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Desafortunadamente, recibo el siguiente mensaje de error:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Lo intenté de GRANT SUPER..varias formas, pero también obtengo errores cuando trato de hacerlo. Escribir mysql > FLUSH privileges;tampoco funciona.

Soy un principiante de mysql, lo siento por una pregunta tan fácil. Pensamientos

tim peterson
fuente
9
No puedes GRANT SUPERen RDS. RDS no ofrece ninguna forma de obtener SÚPER privilegios.
ceejayoz
Utilice el mismo nombre de usuario de MySQL para crear un volcado y restaurarlo (para la conexión y la palabra clave DEFINER en el volcado). Cambiar log_bin_trust_function_creators no es la solución deseada. Lo peor es usar el parámetro -f en este caso
ad4s
en mi caso, mi sqlarchivo tiene una CREATE FUNCTIONdeclaración que necesita un usuario privilegiado. ver esto
Contador م

Respuestas:

63

Según http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , debe establecerlo log_bin_trust_function_creatorsen 1 en la consola de AWS para cargar su archivo de volcado sin errores.

Si desea ignorar estos errores y cargar el resto del archivo de volcado, puede usar la -fopción:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

El -finformará errores, pero continuará procesando el resto del archivo de volcado.

Ross Smith II
fuente
hola @Ross, gracias por esto. Desafortunadamente, el uso -fno ayudó. Tengo el mismo error. Al usar su enlace, tengo problemas con la sintaxis de las herramientas RDS Cli. Es decir, cuando voy a cambiar los privilegios, aparece el siguiente error:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson
aquí está mi comando que me da el error anterior: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"sé que tiene que ser una cita o un problema de doble guión, pero ninguno de esos tipos de cambios está funcionando hasta ahora, ¡uf!
tim peterson
4
La -fopción no hará que desaparezcan los errores, solo permitirá que se procesen las declaraciones SQL no infractoras en el archivo. Por lo que he leído, RDS se está ahogando con los procedimientos almacenados en el archivo de volcado. Intente crear un archivo de volcado sin los procedimientos de la tienda y vea si se carga bien:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II
2
- @ Ross, increíble que funcionó, mi base de datos está ahí, vaya, es un problema molesto, siento que AWS debería hacer algo al respecto.
tim peterson
Al menos puedo cargar todos los datos con la -fopción. La segunda fase podría ser volcar solo rutinas / stred proc,
etc.por
134
  1. Abra la consola web de RDS.
  2. Abra la pestaña "Grupos de parámetros".
  3. Cree un nuevo grupo de parámetros. En el cuadro de diálogo, seleccione la familia MySQL compatible con la versión de su base de datos MySQL, asígnele un nombre y confirme. Seleccione el grupo de parámetros recién creado y emita "Editar parámetros".
  4. Busque el parámetro 'log_bin_trust_function_creators' y establezca su valor en '1 ′.
  5. Guarde los cambios.
  6. Abra la pestaña "Instancias". Expanda su instancia de MySQL y emita la "Acción de instancia" llamada "Modificar".
  7. Seleccione el grupo de parámetros recién creado y habilite "Aplicar inmediatamente".
  8. Haga clic en "Continuar" y confirme los cambios.
  9. Espere a que se complete la operación "Modificar".
  10. Nuevamente, abra la pestaña "Instancias". Expanda su instancia de MySQL y expanda la pestaña "Acción de instancia" y seleccione "Reiniciar".
arun-r
fuente
> qué hace el punto 9 ... ajusta su instancia para usar el grupo de parámetros definido previamente. Para obtener más detalles, consulte esta publicación de blog original de Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL
¿Detendrá esto la replicación de RDS Mysql?
Ramratan Gupta
hola @ arun-r, sigo los pasos que explicaste, pero el parámetro 'log_bin_trust_function_creators' no está disponible en el caso. Creo que algo ha cambiado en la última versión de AWS RDS. ¿Me pueden ayudar, por favor, cómo puedo hacer esto ahora? gracias,
Pawan Developers
@RamratanGupta No se detendrá
arun-r
1
@ arun-r gracias por tu respuesta. Resolví mi problema. De hecho, encontré log_bin_trust_function_creators en la lista. pero mi problema se resuelve poniéndome en contacto con el soporte de AWS
Pawan Developers
33

El problema con los desencadenadores y los procedimientos almacenados en el archivo de volcado es que estas definiciones incluyen al usuario que debe crear el procedimiento almacenado, el DEFINER. Es muy probable que el usuario no exista en el RDS, por lo que se genera un error. Para poder cargar el archivo de volcado, puede eliminar el DEFINER usando sed o Perl y crear el procedimiento almacenado / disparador con el usuario que está realizando la importación.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Ahora debería poder cargar el archivo de volcado fijo

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Como se dijo en la respuesta anterior, debe configurar el parámetro DB:

log_bin_trust_function_creators = 1
anders
fuente
1
La limpieza de definidores también se puede lograr con sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar
14

Para mí, solo había 2 comandos en mi archivo de volcado que requerían SUPER privilegios:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

De acuerdo con los documentos de mysqldump , puede desactivarlos con --set-gtid-purged=OFF.

Luego, mirando al hombre mysqldump :

Use ON si la intención es implementar un nuevo esclavo de replicación usando solo algunos de los datos del servidor volcado. Use OFF si la intención es reparar una tabla copiándola dentro de una topología. Use OFF si la intención es copiar una tabla entre topologías de replicación que están disjuntas y lo seguirán siendo.

Así que decidí agregar --set-gtid-purged=OFFa mi mysqldumpcomando y luego pude importar con éxito el archivo de volcado resultante.

Sí_yo_yo
fuente
1
Sí, eso fue todo. Mi archivo de volcado era relativamente pequeño, por lo que eliminé todas las apariciones de estos 2 comandos.
Zolbayar
6

Como se define en la documentación de AWS, los desencadenantes, los procedimientos y las funciones están deshabilitados de forma predeterminada porque el registro binario está habilitado de forma predeterminada. La desactivación básicamente hace que su base de datos sea más segura, pero si la ha protegido correctamente a través de la red, no importará.

Siga estos pasos y su problema se solucionará https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Además, no debe utilizar definidores al crear procedimientos. Un simple comando sed puede eliminarlo.

Josh Woodcock
fuente
1

Después de usar la respuesta arun-r, si el problema no se resuelve, debe modificar su archivo de volcado. Es simple.

En el archivo de volcado encontrará líneas como:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Tienes que reemplazar:

  • username_from_dumped_database por su nombre de usuario en la base de datos rds.
  • host_from_dumped_databse por %

No sé por qué, pero este truco me funcionó. Un simple editor de texto es suficiente para hacer esto.

Damien Frances
fuente