¿Cómo cambio el DEFINER de una VISTA en Mysql?

35

Cuando ejecuto mysqldump, aparece un error:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

Esto tiene sentido porque foobares una máquina heredada que ya no existe.

¿Cómo cambio el definidor de todas mis tablas a 'root' @ 'localhost'?

kfmfe04
fuente
44
¿Tienes vistas? Las tablas no tienen definidores, estoy seguro ... Consulte también dba.stackexchange.com/q/4129/630
gbn
1
@gbn +1 tenías razón, eran vistas, gracias por el enlace, pero no pude hacerlo funcionar del todo bien. Sin embargo, pude modificar las vistas en SQLyog para poder hacer el volcado.
kfmfe04
Funciona para mi. {{conceder todo encendido . a 'root' @ '%' identificado por 'contraseña' con la opción de concesión; }}
Muhammad Azeem

Respuestas:

33

Lo que creo es que la base de datos que está intentando volcar contiene procedimientos / métodos que fueron definidos por un usuario mientras estaba conectado como root @ 'foobar'.

Ahora la solución es que tienes que reemplazar el definidor para esos procedimientos / métodos

entonces puede generar el volcado sin el error.

puedes hacer esto como ...

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

Tenga cuidado, porque esto cambiará todos los definidores para todas las bases de datos.

Intentalo....!

ACTUALIZACIÓN el 9 de febrero de 2012

Como vi el enlace dado por @gbn que es una respuesta dada por @Rolando que también puede ser el caso. Por favor visite el enlace

EDITAR por @RolandoMySQLDBA 2011-12-16 11:20 EDT

Si bien es arriesgado, esta respuesta es buena. Solo para aclarar: puede especificar la base de datos en su consulta de esta manera:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';
Abdul Manaf
fuente
1
El enlace de arriba muestra cómo hacerlo con declaraciones ALTER que pueden ser menos riesgosas ... Además, consulte mi actualización para ver los definidores en su ACTUALIZACIÓN
gbn
UPDATEcambiado la mesa, pero mysqldumpno verlo: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Incluso después de reiniciar mysql. Estoy corriendo mysql-5.5.31.
x-yuri
Mi error. Tuve puntos de vista con un definidor equivocado tampoco. update mysql.procenfoque de hecho funciona.
x-yuri
No funcionó ...
カ オ ナ シ
3
Esta respuesta funciona para cambiar los definidores de procedimientos y funciones, pero no cambia el definidor de una Vista .
Anthony G - justicia para Mónica
35

Más fácil de usar el --single-transactioninterruptor:

mysqldump --single-transaction -u username -p db > db.sql
barra
fuente
1
Lo sentimos, ¿cómo aborda esto el problema descrito en la pregunta original? Parece que respondiste la pregunta equivocada ...
dezso
66
La estructura de la respuesta es incorrecta, porque la transacción individual debe ser anterior al nombre de la base de datos, pero la respuesta es realmente correcta. La especificación de esta opción soluciona el problema cambiando el comportamiento de bloqueo de mysqldump, por lo que el error en la pregunta original ya no se produce.
Michael - sqlbot el
Me enfrenté al mismo problema. trabajado - transacción única.
No estoy seguro de lo que hace, ¡pero funcionó! Gracias
Sri Harsha Kappala
17

La solución más rápida sería volver a crear el definidor para que exista, siempre que no cree ningún conflicto con los usuarios existentes.

CREATE USER 'root'@'foobar';

ColinM
fuente
¿Qué pasa si el usuario era 'root' @ '%'? Simplemente niego tal cosa en un servidor del que somos responsables.
Attila Fulop
@AttilaFulop Sí, la seguridad definitivamente debería ser una consideración, pero dije que esta era la solución "más rápida", no la perfecta. Una vez que se completa la importación, el usuario podría eliminarse para mitigar los riesgos de tener usuarios adicionales.
ColinM
Tienes razón en eso. Solo quería llamar la atención sobre este aspecto en particular también. Mis compañeros de trabajo habrían agregado 'root' @ '%' y lo dejarían allí mientras Chuck Norris esté vivo, es decir. forever;)
Attila Fulop
6

Exporte todas las vistas de la base de datos <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

o:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Edítelos views.sqly vuelva a crearlos:

cat views.sql | mysql <DB>

Especifique -uy -pcambie si es necesario.

x-yuri
fuente
Esta es la respuesta más limpia
Wolfe