将主机访问权限重新分配给MySQL用户

我有几千个MySQL用户都设置为允许从特定的主机访问。 问题是,现在我将有两台机器(将来更多),这将需要使用相同的帐户来访问他们的每个数据库。

我想要一个快速简单(尽可能自动化)的方式来运行并修改每个用户帐户的主机部分,以适应内部networking通配符。 例如:

'bugsy'@'internalfoo'可以访问'bugsy'数据库。

我想现在允许从内部networking上的任何地方访问bugsy

'bugsy'@'10.0.0.%'可以访问'bugsy'数据库。

作为参考,解决scheme是:

UPDATE mysql.user SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; FLUSH PRIVILEGES; 

被接受的答案只改名了用户,但是权限被留下了。

我build议使用:

 RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5'; 

根据MySQL文档 :

RENAME USER会使旧用户拥有的权限成为新用户拥有的权限。

更一般的答案是

 UPDATE mysql.user SET host = {newhost} WHERE user = {youruser} 

我没有必要这样做,所以拿一点盐和一个“testing,testing,testing”的帮助。

如果(在安全的受控testing环境中)直接修改mysql.usermysql.db表中的Host列,会发生什么? (例如,用update语句。)我不认为MySQL使用用户的主机作为密码编码的一部分( PASSWORD函数不build议这样做),但你必须尝试确保它。 您可能需要发出FLUSH PRIVILEGES命令(或停止并重新启动服务器)。

对于某些存储引擎(例如MyISAM),您可能还需要检查/修改.frm文件,用户创build的任何视图。 .frm文件存储定义者,包括定义者的主机。 (我必须这样做,当主机之间移动数据库时,错误的configuration导致错误的主机被logging…)