J'ai des problèmes sauvegarde de 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?
Créez un fichier texte avec toutes les définitions de vue:
mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql
Vous modifiez AllMyViews.sql à partir de là. Ensuite, supprimez les vues
mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A
Après avoir modifié AllMyViews.sql, rechargez-les
mysql -uusername -ppassword -A < AllMyViews.sql
Essaie !!!
Vous pouvez utiliser ALTER VIEW conjointement avec le schéma d'information . Vous avez mentionné le vider dans un fichier texte, alors peut-être quelque chose comme ça:
SELECT CONCAT("ALTER DEFINER=`youruser`@`Host` VIEW `",table_name,"` AS ", view_definition,";")
FROM information_schema.views WHERE table_schema='databasename'
Mélangez cela avec la ligne de commande mysql (en supposant que * nix, pas familier avec Windows):
> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql
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.
En automatisant la solution de Derek, cela changera DEFINER en root@localhost
Et mettre SQL SECURITY INVOKER
(assurez-vous de le vouloir en premier!) dans toutes les vues de toutes les bases de données:
mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do
mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
mysql $DB
done
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:
mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do
mysql -BNe 'show tables' $DB | \
while read t
do
echo "check table $t;"
done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'
il ne devrait plus se plaindre de définitions invalides dans les vues.
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
(change definer) et recréez-les:
cat views.sql | mysql <DB>
Spécifiez -u
et -p
change si nécessaire.
J'ai créé un simple script python qui remplace le db definer de production par le db definer local. Ce script modifiera les fichiers de vidage et importera automatiquement les bases de données spécifiées.
Repo GIT: https://github.com/mjakal/db-auto-import