J'ai les subventions suivantes pour un utilisateur/une base de données
mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost' |
+---------------------------------------------------------------------------+
Pour activer l'accès externe à la base de données, je dois remplacer localhost par %
. Une façon de procéder consiste à REVOKE
toutes les autorisations et à le redéfinir. Le problème est qu'il existe un mot de passe défini que je ne connais pas, donc si je révoque l'autorisation, je ne peux pas la rétablir.
Existe-t-il un moyen de changer le nom d'hôte localhost
en %
(et inversement) sans révoquer l'autorisation elle-même?
Si vous avez accès à la base de données mysql
, vous pouvez modifier directement les tables de droits:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
... et une instruction UPDATE
- analogue pour la modifier.
Vous devrez peut-être également apporter des modifications à mysql.db
table également:
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
puis rincez pour appliquer les privilèges:
FLUSH PRIVILEGES;
Meilleure réponse sur Stackoverflow suggérant d'utiliser RENAME USER
qui copie les privilèges utilisateur.
L'utilisation du langage de contrôle des données (instructions GRANT, REVOKE, RENAME, etc.) ne nécessite pas FLUSH PRIVILEGES;
et est requis dans une architecture comme Galera ou la réplication de groupe dans les versions MySQL ayant des tables MyISAM dans la base de données mysql
car les tables MyISAM ne sont pas répliquées.
Je suis tombé sur celui-ci aussi, et la solution proposée n'a pas fonctionné, car les privilèges spécifiques à la base de données ne seraient pas déplacés également. ce que j'ai fait:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
Pour modifier les privilèges, révoquez d'abord toutes les autorisations accordées à l'utilisateur
revoke all privileges on *.* from 'username'@'localhost';
grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';
flush privileges;
Il manque beaucoup de tables si vous avez des privilèges autres que simplement db (comme les tables ou les colonnes, etc.). Selon les autorisations dont dispose votre utilisateur, vous devrez peut-être mettre à jour toutes ces tables ou certaines:
UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;