Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将主机访问权限重新分配给MySQL用户_Mysql_Permissions - Fatal编程技术网

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

将主机访问权限重新分配给MySQL用户,mysql,permissions,Mysql,Permissions,我有几千个MySQL用户,所有这些用户都设置为允许从特定主机进行访问。问题是,现在我将有两台机器(将来会更多),它们需要使用相同的帐户来访问各自的数据库 我想要一种快速简便(尽可能自动化)的方法来运行和修改每个用户帐户的主机部分,以适应内部网络通配符。例如: “bugsy”@“internalfoo”可以访问“bugsy”数据库 我现在想允许bugsy从内部网络的任何地方访问 “bugsy”@“10.0.0.%”可以访问“bugsy”数据库 我没必要这么做,所以,把这个和一粒盐一起吃,并帮我“测

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

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

“bugsy”@“internalfoo”可以访问“bugsy”数据库

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

“bugsy”@“10.0.0.%”可以访问“bugsy”数据库

我没必要这么做,所以,把这个和一粒盐一起吃,并帮我“测试,测试,测试”

如果(在安全控制的测试环境中)您直接修改
mysql.user
中的
Host
列,并且可能修改
mysql.db
表,会发生什么情况?(例如,使用
update
语句)我不认为MySQL使用用户主机作为密码编码的一部分(密码
password
函数不建议这样做),但您必须尝试一下才能确定。您可能需要发出命令(或停止并重新启动服务器)


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

作为参考,解决方案是:

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;

更一般的答案是

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

接受的答案仅重命名了用户,但保留了特权

我建议使用:

RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5';
根据:

重命名用户会使旧用户所拥有的权限变为新用户所拥有的权限


我获取权限的类似问题失败。在我的设置中,我只使用SSH。所以我纠正这个问题的方法是

sudo MySQL
SELECT User, Host FROM mysql.user WHERE Host <> '%';
MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | 192.168.0.% |
| bar   | 192.168.0.% |
+-------+-------------+
4 rows in set (0.00 sec)
运行SELECT User,Host FROM mysql.User WHERE Host“%”;我们再次看到:

MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | localhost   |
| bar   | localhost   |
+-------+-------------+
4 rows in set (0.00 sec)

我在
重命名用户
时收到了相同的错误,当前接受的解决方案不包括授权:

最可靠的方法似乎是为老用户运行
SHOW GRANTS
,查找/替换您想要更改的用户名和/或主机,然后运行它们,最后
DROP user
老用户。不要忘记运行
FLUSH PRIVILEGES
(最好在添加新用户的授权后运行此操作,测试新用户,然后删除旧用户并再次刷新以获得良好的效果)

>显示“olduser”@“oldhost”的授权; +-----------------------------------------------------------------------------------+ |补助金olduser@oldhost | +-----------------------------------------------------------------------------------+ |将**上的用法授予由密码“*PASSHASH”标识的“olduser”@“oldhost”| |将“db`.*上的选择权授予“olduser”@“oldhost”| +-----------------------------------------------------------------------------------+ 一组2行(0.000秒) >将**上的用法授予由密码“*SAME_PASSHASH”标识的“newuser”@“newhost”; 查询正常,0行受影响(0.006秒) >将“数据库”上的SELECT授予“新用户”@“新主机”; 查询正常,0行受影响(0.007秒) >删除用户'olduser'@'oldhost'; 查询正常,0行受影响(0.016秒)
我想知道这是否会在serverfault.com上更幸运谢谢T.J.我也会去serverfault.com(我不知道!)既然你已经在那里发布了这个问题,我建议在这里关闭它。这与编程无关,更多的是服务器故障。感谢您的回复T.J。我尝试修改mysql.user和mysql.db的用户记录,尽管更改似乎执行得很好,但除了允许用户访问的原始主机之外,我仍然无法从内部网络上的任何主机连接。我不知道如何修改.frm文件(它们是二进制的)。。。我假设您指的是mysql/目录中的数据库(而不是用户可以访问的适用数据库)。不过,我不太愿意直接在文件里乱搞。在MySQL中真的没有支持的方法吗?这似乎是相当短视的。更改了表后,我希望您需要执行
FLUSH PRIVILEGES
命令(请参阅),或者,当然,停止并启动服务。我谈论的
frm
文件将用于数据库中的视图,数据库子目录中也是如此。我熟悉的MyISAM存储引擎是纯文本;YMMV,“熟悉”?我的打字技能真的变差了……;)作为参考,解决方案是:updatemysql.user SET host='10.0.0.%'其中host='internalfoo'和user!='根';更新mysql.db SET host='10.0.0.%'其中host='internalfoo'和user!='根';同花顺特权;好买卖!(是的,将此作为答案发布比原始评论要好得多。我当时错过了您的评论…)这并没有正确地重新分配所有权限,@pedrocheckos answer在下面正确地执行所需的操作。我收到
错误1396(HY000):为“foo”@“%”重命名用户的操作失败。
foo
是一个示例-用数据库中的实际用户名替换
foo
。我已将其更改为用户名<代码>'foo'只是我和你的别名。这应该是可以接受的答案,因为只更新
hostname
列不会维护特权,谢谢
MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | localhost   |
| bar   | localhost   |
+-------+-------------+
4 rows in set (0.00 sec)
$ mysql -u foo -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>