更改MySQL用户的主机权限

我有以下授予用户/数据库

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更改为% (并返回)而不撤销权限本身?

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

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

…和一个类似的UPDATE语句来改变它。

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

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

我也偶然发现了这个问题,并且提出的解决scheme也不能工作,因为数据库特定的权限也不会被移动。 我做了什么:

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

要更改权限,请首先撤销对用户的所有权限

  revoke all privileges on *.* from 'username'@'localhost'; grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%'; flush privileges; 

如果你拥有除简单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; 

在Stackoverflowbuild议使用复制用户权限的RENAME USER的最佳答案。