2008-09-30 19 views
19

Estoy usando mysqldump para replicar una base de datos entre cuentas en una máquina en particular. Todo funciona muy bien, excepto cuando llegamos a nuestros puntos de vista definidos. Debido a que el volcado incluye una línea como la siguiente ...¿Cómo puedo usar mysqldump para replicar vistas entre cuentas?

/*!50013 DEFINER=`user_a`@`localhost` SQL SECURITY DEFINER */ 

... al cargar el volcado en MySQL en usuario_b recibimos un error:

ERROR 1227 (42000) at line 657: Access denied; you need the SUPER privilege for this operation 

Ni que decir tiene, no lo creo tener SUPER privilegio en esta instancia de mysql ¿Hay alguna manera de convencer al mysqldump para volcar las vistas de una manera independiente del usuario? No puedo encontrar nada en el manual sobre este punto. ¿Debo analizar realmente el archivo de volcado para reemplazar los nombres de usuario? ¿O me estoy perdiendo algo?

Respuesta

27

mismo problema. Lo resuelto de esa manera:

mysqldump -uuser1 -ppassword1 database1 > backup.sql 

sed '/^\/\*\!50013 DEFINER/d' backup.sql > backup_without_50013.sql 

mysql -u user2 -ppassword2 -D database2 < backup_without_50013.sql 

Lo interesante es el comando sed la que, aquí, elimina todas las líneas que comienzan con/* 50013!.

Heidy

+2

Gracias, en realidad terminé haciendo lo mismo, excepto que usé grep -v en lugar de sed, pero el resultado fue el mismo. :) –

2

Las cláusulas de SQL SECURITY determinan qué cuenta MySQL usar cuando se verifican los privilegios de acceso para la vista (como probablemente ya se haya dado cuenta).

Cuando crea una vista, puede definir un par de opciones para la seguridad de esa vista. Puede leer más here, pero esencialmente, por defecto, el acceso está restringido al 'definidor' de la vista, es decir, el usuario que lo creó.

+0

Gracias, Max. Lo comprobé y no parece que jugar con estas opciones afecte la forma en que mysqldump produce resultados. Si simplemente omitiera la línea DEFINER, estaría dorado. :) –

0

Run mysqldump con la opción "--skip-triggers"

+0

Interesante idea, pero esto no hace nada para afectar las líneas @DEFINER en la salida de volcado. Mientras afirme un definidor que no sea el usuario de MySQL conectado, aparece el error de seguridad. –

12

Usted tendrá que procesar el archivo de copia de seguridad y cambiar DEFINER:

DEFINER = user_a @localhost

me gusta cambiarlo a:

DEFINER = CURRENT_USE R

Se asociará automáticamente a la cuenta que lo carga.

+3

gracias por la sugerencia! Uso (Necesito escapar el '): sed -ri s/DEFINER = \' [^ \ '] + \' @ \ '% \'/DEFINER = CURRENT_USER/g archivo.sql – brunoqc

+2

Esto! Y con un poco de magia 'sed' de @brunoqc, es perfecto – Matthew

Cuestiones relacionadas