web-dev-qa-db-fra.com

Problème avec mysqldump et view

Lors de l'utilisation de mysqldump pour sauvegarder MySQL, j'ai eu l'erreur suivante.

mysqldump --all-databases --routines >> all.sql
mysqldump: Couldn't execute 'show table status like 'hdkien'': SELECT command denied to user 'tungbt'@'192.168.12.197' for column 'id' in table 'hdcn_hd' (1143)

hdkien est une vue

CREATE ALGORITHM=UNDEFINED DEFINER=`tungbt`@`192.168.12.197` SQL SECURITY DEFINER VIEW `hdcn`.`hdkien` AS (...striped...)

Utilisateur tungbt @ 192.168.12.197 a déjà eu le privilège de sélectionner sur la table hdcn_hd et je peux sélectionner dans la vue hdkien sans problème.

mysql> select * from hdkien limit 1;
+------+-----------+
| id   | shd       |
+------+-----------+
|  876 | ADFADFA1  |
+------+-----------+

Plus d'informations:

  • Version de MySQL: mysql-community-server-5.5.37-4.el6.x86_64
  • Système d'exploitation: CentOS 6.5

Pourquoi j'ai l'erreur lors de l'exécution de mysqldump et comment puis-je la résoudre?

Mise à jour 1 (2014/04/17)

J'exécute mysqldump avec l'utilisateur 'root'@'localhost'.

mysql> show grants for 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '...striped...' WITH GRANT OPTION                             |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+

L'utilisateur 'tungbt'@'192.168.12.197' est le définisseur de vue hdcn.hdkien (et le SQL SECURITY est DEFINER.

+------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tungbt'@'192.168.12.197' IDENTIFIED BY PASSWORD '...striped...'                             |
| GRANT ALL PRIVILEGES ON `hdcn`.* TO 'tungbt'@'192.168.12.197'                                                      |
+------------------------------------------------------------------------------------------------------------------+

mise à jour 2

$ mysql -ANe"SELECT USER(),CURRENT_USER()"
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+

mise à jour

mysql> SELECT COUNT(1) MySQLGrantsCount,VERSION() MySQLVersion FROM information_schema.columns WHERE table_schema='mysql' AND table_name='user';
+------------------+--------------+
| MySQLGrantsCount | MySQLVersion |
+------------------+--------------+
|               42 | 5.5.37-log   |
+------------------+--------------+
5
favadi

Vous devez avoir le privilège SHOW VIEW . J'ai écrit à propos de ce décembre 2013: Quels sont les privilèges minimum requis pour obtenir une sauvegarde d'un schéma de base de données MySQL?

Dans ce post, je montre ces privilèges minimum pour un mysqldump

Vous devez exécuter cette commande:

SHOW GRANTS FOR [email protected];

Si SHOW VIEW n'est pas là, c'est la raison.

MISE À JOUR 2014-04-16 23:06 EDT

Quand tu as fait ça

mysqldump --all-databases --routines >> all.sql

Je vois que vous n'avez pas spécifié l'utilisateur et le mot de passe. Cela étant, vous n'étiez pas connecté en tant que root@localhost. Vous devrez être explicite en spécifiant l'utilisateur root

mysqldump -uroot -p --all-databases --routines >> all.sql

Vous verrez l'invite de mot de passe. Entrez le mot de passe root @ localhost et vous êtes éteint et en cours d'exécution.

Vous pouvez également spécifier le mot de passe également

mysqldump -uroot -ppassword --all-databases --routines >> all.sql

Essaie !!!

SUGGESTIONS SAUVAGES

Si vous utilisez .~/my.cnf et toujours une erreur, vous pourriez rencontrer cette situation dans Bug # 70907 mysqldump: Impossible d'exécuter 'show table status': commande SELECT refusée à l'utilisateur '

Si le fichier de configuration est .~/my.cnf est vraiment /root/.my.cnf, vous n'êtes peut-être pas connecté en tant que root Linux. Vous devrez peut-être exécuter Sudo.

Veuillez exécuter cette commande

mysql -ANe"SELECT USER(),CURRENT_USER()"

Si vous ne voyez pas root@localhost deux fois, vous ne vous authentifiez pas correctement.

Dans .my.cnf vous devez vous assurer que l'utilisateur et le mot de passe sont sous [client] section

[client]
user=root
password=rootpassword

pas sous le [mysql] section.

MISE À JOUR 2014-04-17 13:53 EDT

Je ne peux pas m'empêcher de regarder ce rapport de bogue et de me demander ce qui suit: puisque vous avez DEFINER = tungbt @ 192.168.12.197, il est possible que root @ localhost se comporte comme tungbt @ 192.168.12.197? Je dis cela parce que selon la Documentation MySQL sur CREATE VIEW : At view definition time, the view creator must have the privileges needed to use the top-level objects accessed by the view. For example, if the view definition refers to table columns, the creator must have some privilege for each column in the select list of the definition, and the SELECT privilege for each column used elsewhere in the definition.

Vous pouvez changer le définisseur de la vue en root @ localhost et réessayer mysqldump

5
RolandoMySQLDBA

J'ai eu un problème similaire avec l'impossibilité de faire un mysqldump sur ma vue en tant que root:

mysqldump: Couldn't execute 'show create table `v_view01`': View 'my_db.v_view01' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them (1356)

Dans mon cas, c'était parce que mon schéma sous-jacent avait changé, de sorte que la vue qui en dépendait n'était plus valide. Même si j'exécutais le vidage en tant que root, il est toujours indiqué "ou l'invocateur de vue n'a pas de droits ...". La solution était simple:

drop view v_view01

Étant donné que la vue était déjà obsolète, je l'ai simplement supprimée, puis le mysqldump s'est déroulé comme d'habitude.

3
David B

Le mien ne pouvait pas afficher la création d'une vue sur une vue qui n'existait pas. J'ai donc fait ces deux choses:

create or replace view v_view01 as select * from any_table;
drop view v_view01;

Le plus gros problème est mysqldump par défaut pour s'arrêter sur une erreur - horrible idée !!!

Si vous avez besoin de toutes les autres bonnes tables sauvegardées, ajoutez l'option --force et des options comme celles-ci ...

mysqldump -u root -p${MP} --all-databases --lock-tables --debug-info --comments --dump-date --force --events --routines --add-drop-table --add-locks --log-error=/somewhere/mysqldump.err >all_db.`date "+%Y%m%d%H%M"`.sql
0
user153465