Comment changer le DEFINER d'une VIEW dans Mysql?

35

Quand je lance mysqldump, j'obtiens une erreur:

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

Cela a du sens car foobarc’est une machine héritée qui n’existe plus.

Comment changer le défineur de toutes mes tables en 'root' @ 'localhost'?

kfmfe04
la source
4
Avez-vous des vues? Les tableaux ne sont pas définisseurs je suis sûr ... Voir aussi dba.stackexchange.com/q/4129/630
gbn
1
@gbn +1 vous aviez raison - c'étaient des points de vue - merci pour le lien, mais je ne pouvais pas le faire fonctionner correctement. Cependant, j'ai pu modifier les vues dans SQLyog afin de pouvoir effectuer le dump.
kfmfe04
Ça marche pour moi. {{tout accorder sur . 'root' @ '%' identifié par 'mot de passe' avec option de subvention; }}
Muhammad Azeem

Réponses:

33

Ce que je pense, c'est que la base de données que vous essayez de vider contient des procédures / méthodes définies par un utilisateur alors que vous êtes connecté en tant que root @ 'foobar'.

Maintenant, la solution est que vous devez remplacer le définiteur pour que procédures / méthodes

alors vous pouvez générer le dump sans l'erreur.

tu peux faire ça comme ..

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

Soyez prudent, car cela changera tous les définisseurs de toutes les bases de données.

Essayez-le ....!

MISE À JOUR DU 9 FÉVRIER 2012

Comme j'ai vu le lien donné par @gbn qui est une réponse donnée par @Rolando qui peut aussi être le cas. S'il vous plaît visitez le lien

EDIT by @RolandoMySQLDBA 2011-12-16 11:20 EDT

Bien que risquée, cette réponse est bonne. Juste pour clarifier: Vous pouvez spécifier la base de données dans votre requête comme ceci:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';
Abdul Manaf
la source
1
Le lien ci-dessus montre comment le faire avec les déclarations ALTER qui risquent d’être moins risquées ... Consultez également ma mise à jour pour les définisseurs dans votre MISE À JOUR
gbn
UPDATEchangé la table, mais mysqldumpne le voit pas: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Même après le redémarrage mysql. Je cours mysql-5.5.31.
x-yuri
Ma faute. J'ai eu des vues avec un mauvais définition non plus. update mysql.procapproche fonctionne en effet.
x-yuri
N'a pas fonctionné ....
lundi
3
Cette réponse fonctionne pour changer les définisseurs de procédures et de fonctions mais ne change pas le défineur d'une vue .
Anthony G - justice pour Monica
35

Plus facile à utiliser le --single-transactioncommutateur:

mysqldump --single-transaction -u username -p db > db.sql
barre
la source
1
Désolé, comment cela résout le problème décrit dans la question initiale? On dirait que vous avez répondu à la mauvaise question ...
dezso
6
La structure de la réponse est fausse, car --single-transaction doit précéder le nom de la base de données, mais la réponse est en fait correcte. Spécifier cette option permet de contourner le problème en modifiant le comportement de verrouillage de mysqldump, de sorte que l'erreur dans la question d'origine ne se produise plus.
Michael - sqlbot
J'ai fait face au même problème. travaillé - single-transaction.
Je ne sais pas ce que ça fait, mais ça a marché! Merci
Sri Harsha Kappala
17

La solution la plus rapide serait simplement de recréer le définit afin qu'il existe, tant qu'il ne crée aucun conflit avec les utilisateurs existants.

CREATE USER 'root'@'foobar';

ColinM
la source
Que se passe-t-il si l'utilisateur était 'root' @ '%'? Je nie simplement une telle chose sur un serveur dont nous sommes responsables.
Attila Fulop
@ AttilaFulop Oui, la sécurité devrait certainement être une considération, mais j'ai dit que c'était la solution "la plus rapide", pas la solution parfaite. Une fois l'importation terminée, l'utilisateur peut être supprimé pour limiter les risques liés à la présence d'utilisateurs supplémentaires.
ColinM
Vous avez raison en cela. Je voulais seulement attirer l'attention sur cet aspect particulier également. Mes collègues auraient ajouté 'root' @ '%' et l'auraient laissée aussi longtemps que Chuck Norris serait en vie, c'est-à-dire. pour toujours;)
Attila Fulop
6

Exportez toutes les vues de la base de données <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

ou:

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

Editez views.sqlet recréez-les:

cat views.sql | mysql <DB>

Spécifiez -uet -ppermutez si nécessaire.

x-yuri
la source
Ceci est la réponse la plus propre
Wolfe