web-dev-qa-db-fra.com

Modifier DEFINER sur plusieurs vues

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?

27
Zoredache

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 !!!

14
RolandoMySQLDBA

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.

26
Derek Downey

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.

3
Matija Nalis

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.

3
x-yuri

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

0
Martin