He estado tratando de mover un db existente de MySQL que se ejecuta en EC2 a una nueva instancia de Amazon RDS (un experimento para ver si podemos movernos). Hasta ahora, no va bien. Estoy atascado en la importación inicial antes de configurar la replicación (instrucciones aquí ).
He preparado la instancia RDS como se describe y puedo conectarme a ella desde la instancia EC2 usando mysql. Ejecuté el comando mysqldump como:
mysqldump --master-data --databases db1 db2 > dump.sql
Luego intenté subirlo a RDS con:
mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql
El primer problema estaba en la línea 22 del basurero:
CAMBIAR MASTER A MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;
Esta línea causó un error ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
. No hay problema, solo comenté esa línea y espero arreglarla más tarde a través de mysql.rds_set_external_master (). Juzgados de la carga, y consiguió un error muy similar: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
. La sección alrededor de la línea 7844 se ve así:
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;
Al comentar las primeras 2 líneas y agregar un 'CREAR' a la tercera, pude superar esta. Pero hay toneladas de secciones como esta. ¿Hay alguna forma de evitar esto sin toda la edición? ¿Te gusta una opción para mysqldump
no producir nada que necesite SUPER privilegios?
¡Parece que muchas personas han tenido problemas similares, como tener que correr sed
contra la salida de mysqldump / mysqlbinlog! También voy a publicar en el foro de AWS, realmente creo que RDS debería tener una forma más tolerante de importar desde mysqldump, o una herramienta específica que se pueda ejecutar contra un db existente para crear un volcado que es una queja con la seguridad de RDS. Me preguntaba si alguien tenía otras recetas o trucos que pudieran ayudar aquí.
Gracias,
Dave
fuente
log_bin_trust_function_creators
parámetro a 1, pero sigo teniendo el mismo error en la línea 7844.--masterdata=2
. La línea se comentará en el volcado.Respuestas:
Es probable que necesite
log_bin_trust_function_creators
= 1 en RDS, pero ese no es el problema, aquí.Cuando se ejecuta un programa almacenado (proc, función, evento o desencadenador), todo lo que hace tiene los permisos del usuario que lo definió o del usuario que se declara explícitamente con una
DEFINER
declaración. Esto permite, entre otras cosas, que los programas almacenados permitan a otros usuarios hacer cosas con datos que no tienen permiso directo para manipular, siempre que tengan permiso para usar el programa almacenado.Sería una grave vulnerabilidad, entonces, si un no
SUPER
usuario pudiera crear un procedimiento con un definidor arbitrario, porque el usuario podría escalar sus privilegios a voluntad.Esto también se aplica a las vistas, por supuesto, cuando se utiliza el contexto de seguridad definitivo, como en el ejemplo que publicó.
Una de las mayores quejas que tengo con RDS es que no puede tener
SUPER
... y ahora también puede ser una de las suyas :) porque ese hecho es la causa del problema que está teniendo.Por supuesto, si estuviera ejecutando un servicio MySQL administrado, tampoco le daría a nadie
SUPER
, por lo que su modelo de seguridad tiene sentido, incluso si a veces es difícil de manejar.Si todos sus objetos tienen el mismo definidor, una solución sería restaurar el volcado usando esa cuenta en lugar de la que está usando ahora, pero eso parece poco probable.
Eliminar solo la línea con la
DEFINER
declaración debería hacer que el archivo de volcado funcione en los casos en que aparece en una línea por sí solo, o podría usar sed o perl para modificar el archivo ... una idea que ya sé que no le gusta, pero es realmente bueno acerca de MySQL que tal piratería es bastante legítima, y no está tan lejos del tipo de cosas que tengo que hacer como DBA incluso en un entorno que no es RDS.... posiblemente no sea la respuesta que esperaba, pero podría ejecutarla contra su archivo de volcado y debería terminar con un archivo un poco más utilizable.
fuente
En mi caso fue la línea "CHANGE MASTER TO MASTER_LOG_FILE = ..." en el volcado que me estaba dando el error. Esta línea fue agregada por la opción "--master-data" de mysqldump. En Amazon AWS, debe iniciar la replicación configurando los detalles maestros con el procedimiento "mysql.rds_set_external_master" en su lugar, lea aquí
Así que solo tomé notas de esa línea "head 22 backup.dump" donde la línea 22 informó en el error. Luego elimínelo antes de importar, para mi archivo grande uso: "sed '22d' backup.dump> backup_clean.dump"
fuente