¿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'?


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';

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

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';


¿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.


Esta es la respuesta más limpia
Wolfe
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.