我为用户/数据库提供了以下授予权限

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'              |
+---------------------------------------------------------------------------+


要启用对数据库的外部访问,我需要将localhost更改为%。一种方法是REVOKE所有权限,然后重新设置。问题是,存在一个我不知道的密码集,因此,如果我撤消了该权限,就无法将其重新设置。

是否可以将主机名localhost更改为%(然后再返回)而没有撤消权限本身?

#1 楼

如果您可以访问mysql数据库,则可以直接更改授权表:

此外,您可能还需要对UPDATE表进行更改:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';


,然后刷新以应用特权:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';


评论


一个小修复(mysql服务器版本:5.7.5-m15-MySQL社区服务器):来自phpmyadmin以及mysql命令提示符-更新mysql.user SET Host ='localhost'WHERE user.Host ='%'AND user。用户='XXXdbusr';

–杰迪(Jadeye)
15年7月21日在12:45

对于生产数据库,我会小心使用%,这可能会带来安全风险。如果您有多个Web服务器,则还可以使用通配符的主机,例如“ 192.168.0。%”或“%.example.com”。另一种选择是为每个主机多次添加同一用户,或为每个Web服务器创建一个单独命名的用户。

– Okdewit
17-2-28在11:22

如果像我一样尝试在本地测试机上允许root访问(在我的案例中为RasPi),则自MySQL 5.7起将无法使用。看到这个线程

–拉尔·平托
17-10-29在11:28

@RaulPinto:该线程似乎与phpMyAdmin有关,在这里并不完全相关,但是对于仅使用该线程的人来说要特别注意。

– nickgrim
17-10-30在12:16

最好使用有据可查的陈述RENAME USER

– Antonio Bardazzi
18年6月11日在13:54

#2 楼

建议使用RENAME USER来复制用户权限,这是Stackoverflow的最佳答案。

使用数据控制语言(声明为GRANT,REVOKE,RENAME等)不需要FLUSH PRIVILEGES;,并且在Galera或由于未复制MyISAM表,因此在mysql数据库中具有MyISAM表的MySQL版本中的组复制。

#3 楼

我也偶然发现了这一点,由于数据库特定的特权也不会被移动,因此提出的解决方案也无法正常工作。我做了什么:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;


评论


并且“它”起作用了吗?

– Pierre.Vriens
16年4月19日在17:09

#4 楼

要更改特权,请先撤消对用户的所有权限

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;


评论


那正是我的问题,由于密码,我无法撤消该许可。请阅读我的问题。

– Fu86
13年2月28日在10:32



您可以通过更新将密码哈希设置为与旧密码相同。您不需要知道实际的密码即可。

– drogart
13年3月3日在7:18

#5 楼

如果您具有除简单db以外的特权(例如表或列等),则会丢失许多表。根据用户授予的权限,您可能需要更新所有这些表或某些表:

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;