2009-12-16 43 views
49

我有几千个MySQL用户都设置为允许从特定主机访问。问题是,现在我将拥有两台机器(将来会更多),这将需要使用同一个帐户访问每个数据库。为MySQL用户重新分配主机访问权限

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

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

我想现在允许从任何地方内部网络

“bugsy'@'10.0.0.%”先后获得了“巴格西” DB上巴格西访问。

+1

我不知道这是否会有更多的运气在serverfault.com – 2009-12-16 12:11:27

+0

谢谢T.J.我也将结帐serverfault.com(不知道!) – 2009-12-16 12:25:05

+0

现在你已经发布了这个问题,我建议在这里关闭它。这不是真的与编程有关,更多的是服务器故障。 – 2009-12-16 13:03:58

回答

100

仅供参考,解决的办法是:

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; 
+0

好价钱! (是的,发布这个答案要比原来的评论好得多,当时我错过了你的评论......) – 2012-08-21 09:39:09

+3

这并没有正确地重新分配所有权限,下面的@pedrocheckos答案正确执行了所需的操作。 – 2017-03-31 13:12:52

1

我还没有做到这一点,所以借此与一粒盐和“测试,测试,测试”的一大帮忙。

如果(在安全控制的测试环境),你直接在mysql.user,可能mysql.db表修改Host列,会发生什么? (例如,update声明)。我不认为MySQL使用用户的主机作为密码编码的一部分(PASSWORD函数并未暗示它),但您必须尝试确定它。您可能需要发出FLUSH PRIVILEGES命令(或停止并重新启动服务器)。

对于某些存储引擎(例如MyISAM),您可能还需要检查/修改.frm文件的任何用户创建的视图。 .frm文件存储定义者,包括定义者的主机。 (我不得不这样做,在主机间移动数据库这里曾有过导致错误的主机要记录一个错误配置......时)

+0

感谢您的回复T.J. 我尝试修改mysql.user和mysql的用户记录。db,虽然这些更改似乎执行得很好,但我仍然无法从内部网络上的任何主机连接,而不是允许用户访问的原始主机。 我不知道如何修改.frm文件(它们是二进制文件)......我假设你是指mysql /目录中的那些文件(而不是用户可以访问的适用数据库)。我很犹豫是否直接在文件中进行操作。在MySQL中真的没有支持的方式吗?这似乎是相当短视的。 – 2009-12-16 12:13:52

+0

更改表格后,我希望您需要执行'FLUSH PRIVILEGES'命令(请参阅http://dev.mysql.com/doc/refman/5.0/en/flush.html),或者当然也可以停止并启动服务。我所讨论的'frm'文件将用于数据库中的视图,并且也将位于数据库子目录中。我为MyISAM存储引擎所熟悉的是纯文本;因人而异。 – 2009-12-16 12:57:00

+0

“家庭”?我的打字技巧真的恶化了......;) – 2009-12-16 12:57:43

4

更一般的答案是

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

接受的答案只重命名用户,但权限被留下。

我推荐使用:

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

根据MySQL documentation

重命名用户造成的老用户持有的权限是那些持有的新用户。

+0

我得到错误1396(HY000):操作RENAME USER'foo'@'%'失败 – 2017-09-12 06:07:34