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:
mysql-community-server-5.5.37-4.el6.x86_64
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 |
+------------------+--------------+
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
--lock-tables
)Vous devez exécuter cette commande:
SHOW GRANTS FOR [email protected];
Si SHOW VIEW
n'est pas là, c'est la raison.
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
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.
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
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.
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