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

时间:2009-12-16 11:11:45

标签: mysql permissions

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

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

  

'bugsy'@'internalfoo'可以访问'bugsy'DB。

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

  

'bugsy'@'10.0.0。%'可以访问'bugsy'DB。

6 个答案:

答案 0 :(得分:110)

作为参考,解决方案是:

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;

答案 1 :(得分:81)

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

我建议使用:

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

根据MySQL documentation

  

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

答案 2 :(得分:5)

更一般的答案是

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

答案 3 :(得分:1)

我没有必要这样做,所以请耐心等待“测试,测试,测试”。

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

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

答案 4 :(得分:1)

我获得权限的类似问题失败。在我的设置中,我仅使用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)

我需要将这些用户移至“ localhost”。所以我发表了以下内容:

UPDATE mysql.user SET host = 'localhost' WHERE user = 'foo';
UPDATE mysql.user SET host = 'localhost' WHERE user = 'bar';

从mysql.user运行SELECT用户,主机,主机<>'%';再次,我们看到:

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)]>

答案 5 :(得分:0)

我在RENAME USER上遇到了相同的错误,并且当前接受的解决方案未涵盖GRANTS:

最可靠的方法似乎是为旧用户运行SHOW GRANTS,找到/替换您要更改的关于用户名和/或主机的内容,然后运行它们,最后DROP USER老用户。别忘了运行FLUSH PRIVILEGES(最好在添加新用户的授权后运行它,测试新用户,然后删除旧用户并再次刷新以取得良好效果)。

    > SHOW GRANTS FOR 'olduser'@'oldhost';
    +-----------------------------------------------------------------------------------+
    | Grants for olduser@oldhost                                                        |
    +-----------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'olduser'@'oldhost' IDENTIFIED BY PASSWORD '*PASSHASH'      |
    | GRANT SELECT ON `db`.* TO 'olduser'@'oldhost'                                     |
    +-----------------------------------------------------------------------------------+
    2 rows in set (0.000 sec)

    > GRANT USAGE ON *.* TO 'newuser'@'newhost' IDENTIFIED BY PASSWORD '*SAME_PASSHASH';
    Query OK, 0 rows affected (0.006 sec)

    > GRANT SELECT ON `db`.* TO 'newuser'@'newhost';
    Query OK, 0 rows affected (0.007 sec)

    > DROP USER 'olduser'@'oldhost';
    Query OK, 0 rows affected (0.016 sec)