web-dev-qa-db-fra.com

Comment changer le DEFINER d'une VUE dans Mysql?

Lorsque j'exécute 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 foobar est une machine héritée qui n'existe plus.

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

36
kfmfe04

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

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

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

vous pouvez faire ça comme ..

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

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

Essayez-le ....!

MISE À JOUR le 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. Veuillez visiter le lien

EDIT par @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';
33
Abdul Manaf

Plus facile à utiliser le --single-transaction commutateur:

mysqldump --single-transaction -u username -p db > db.sql
36
rod

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

CREATE USER 'root'@'foobar';

18
ColinM

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

Éditer views.sql et les recréer:

cat views.sql | mysql <DB>

Spécifiez -u et -p change si nécessaire.

5
x-yuri