J'ai des problèmes pour sauvegarder mes bases de données après une mise à jour. J'ai fouillé mon système pour essayer de comprendre pourquoi. Une requête que j'ai exécutée a renvoyé ce résultat.
Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES
Après quelques recherches, il apparaît que le définisseur de ces vues est un ancien compte de développeur qui a été purgé du système. Les bases de données et les vues présentant ce problème sont très rarement utilisées et la plupart sont conservées à des fins d'archivage.
Il y a environ 40 vues avec un définisseur qui n'existe plus. Existe-t-il un moyen simple de changer le définisseur en un compte différent sur tout à la fois? Existe-t-il un moyen pour que mysqldump vide simplement toutes les vues dans un fichier afin que je puisse éditer ce fichier et recréer les vues?
Réponses:
Créez un fichier texte avec toutes les définitions de vue:
Vous modifiez AllMyViews.sql à partir de là. Ensuite, supprimez les vues
Après avoir modifié AllMyViews.sql, rechargez-les
Essaie !!!
la source
The user specified as a definer ('abc'@'1.2.3.4') does not exist
CREATE USER 'abc'@'1.2.3.4';
. Ensuite, réessayez.Vous pouvez utiliser ALTER VIEW conjointement avec le schéma d'informations . Vous avez mentionné le vider dans un fichier texte, alors peut-être quelque chose comme ça:
Mélangez cela avec la ligne de commande mysql (en supposant que * nix, pas familier avec Windows):
Sidenote: Vous ne pouvez pas modifier directement les entrées information_schema . Note2: Cela ne fonctionne que pour une seule base de données à la fois, si vous laissez WHERE table_schema, vous devez insérer des commandes USE entre chacune.
la source
SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp';
retours| Staff | |
echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
En automatisant la solution Derek, cela changera DEFINER
root@localhost
et définiraSQL SECURITY INVOKER
(assurez-vous que vous le voulez d'abord!) Dans toutes les vues de toutes les bases de données:AVERTISSEMENT: assurez-vous d'avoir fait une sauvegarde complète de mysql (par exemple en arrêtant mysqld et en sauvegardant tous les fichiers dans / var / lib / mysql) avant de l'exécuter - juste au cas où ... Cela a fonctionné pour moi, mais YMMV .
vous devez également vérifier toutes vos tables / vues avec:
il ne devrait plus se plaindre de définitions invalides dans les vues.
la source
Exportez toutes les vues de la base de données
<DB>
:ou:
Editez
views.sql
(change definer) et recréez-les:Spécifiez
-u
et-p
changez si nécessaire.la source
views.sql
être modifiées? Aussi, comment les recréer?DEFINER = olduser@oldhost
pourDEFINER = newuser@newhost
,cat views.sql | mysql <DB>
recrée les vues.