如何授予用户对mysql服务器的远程访问权限?


118

如果我SHOW GRANTS在mysql数据库中进行操作

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
    IDENTIFIED BY PASSWORD 'some_characters' 
    WITH GRANT OPTION

如果我没记错的话,则root@localhost意味着用户root只能从访问服务器localhost。我如何告诉MySQL授予root从其他每台机器(在同一网络中)访问该mysql服务器的权限?


6
进行简单更改,localhost即可%授予对公共网络的根访问权限。别忘了flush privileges;

6
添加root @%会给您带来很大的风险,因此不应该这样做。我知道这是一个旧帖子,但是警告应该在这里。root帐户是攻击者针对的第一个帐户,root @'%'表示root用户可以从任何喜欢的地方连接到您的MySQL帐户。注释中包含太多内容,但是您应该尝试删除尽可能多的users @'%',并且在此声明的任何对象都应具有非常有限的特权。无论如何,您绝对不应添加root @'%',并且您的应用程序也不应期望该帐户也存在。
戴蒙2014年


大家好,应该删除此命令的PASSWORD字符串...这会导致错误...只需以IDENTIFIED BY结尾,然后输入密码本身即可。
马里奥德萨维拉

Answers:


143

这会授予来自以下任何计算机的root用户访问权限,并使用相同的密码*.example.com

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.example.com' 
    IDENTIFIED BY 'some_characters' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

如果名称解析不起作用,您还可以通过IP或子网授予访问权限:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%'
    IDENTIFIED BY 'some_characters'  
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

MySQL GRANT语法文档。


15
...TO 'root'@'%' IDENTIFIED...想会从任何地方授予访问权限?
2011年

3
我在mysql中执行了该命令,但SHOW GRANTS仍然显示相同的命令(与我的问题相同)。我什至做到了FLUSH PRIVILGES。我有什么想念的吗?
Aufwind 2011年

@Aufwind除了之外,我不会要求您其他任何东西FLUSH PRIVILEGES。注销并重新登录,如果可以访问,请重新启动mysqld服务。另外,请确保skip networking您未启用该行,my.cnf尽管这不能说明您SHOW GRANTS仍然不一样。
Michael Berkowski

@Aufwind失败了,您可能需要在ServerFault.com上提问。
Michael Berkowski

10
请注意,IDENTIFIED BY PASSWORD它附带一个哈希的41位十六进制数字。使用IDENTIFIED BY 'password',如果你想直接包含密码。
Rainulf

94

尝试:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Pa55w0rd' WITH GRANT OPTION;

1
嗯,这Pa55w0rd看起来很愚蠢,请不要告诉我您要输入的密码。对于每个尝试登录您的mysql的人?
SSpoke 2014年

23
它只是通常用于为占位符提供密码,说“在此位置输入您已读的好密码”。
moshe beeri 2014年

2
该命令带有通常的警告,您只想将其用于不涉及安全性的应用程序中,例如dev或QA。
einnocent

如果它在Mac上不起作用,请尝试使用您要授予特权的计算机的'root'@'localhost'或/ etc / hosts名称更改'root'@'%'。
moshe beeri 2015年

2
不要忘记在以下时间运行此命令:FLUSH PRIVILEGES;
dane

44

您需要采取一些步骤来确保先从外部访问mysql,然后再访问root用户:

  1. 禁止skip-networkingmy.cnf(即:/etc/mysql/my.cnf

  2. 检查bind-addressin的值(my.cnf如果将其设置为)127.0.0.1,可以将其更改0.0.0.0为允许从所有IP或要连接的任何IP访问。

  3. 授予来自任何IP的root用户远程访问权限(或指定您的IP代替%

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. 重新启动mysql服务:

    sudo service mysql restart

您还需要从防火墙打开mysql端口3306,否则远程客户端将无法连接
David Okwii

只需@Khashayar关于第2点的简短通知:0.0.0.0表示任何IPv4地址。*表示任何地址,可以是IPv4或IPv6。
古斯塔沃·平沙德

34
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'YOUR_PASS' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;  

*.* = DB.TABLE 您可以将用户限制为特定的数据库和特定的表。

'root'@'%'您可以使用创建的任何用户更改root用户,并且%允许所有IP。您也可以通过更改%.168.1.1等来限制它。


如果仍不能解决问题,请同时修改my.cnf或my.ini并注释以下行

bind-address = 127.0.0.1#bind-address = 127.0.0.1

skip-networking#skip-networking

  • 重新启动MySQL并再次重复上述步骤。

Raspberry Pi,我在下面找到了绑定地址配置 \etc\mysql\mariadb.conf.d\50-server.cnf


2
仅回答说明*.*'user'@'address'部分。谢谢!:)
菲利普

授予上的所有权限邀请在黑客的攻击。
里克·詹姆斯

这就是为什么我解释*。*的原因
Wasim A.

8

那些其他共享的SQL许可起作用。如果仍然无法访问数据库,则可能是该端口受到防火墙限制。如何打开连接取决于服务器类型(及其之间的任何路由器)。打开入站的TCP端口3306,并为外部计算机(全部/子网/单个IP /等)提供类似的访问规则。



3

就我而言,我试图连接到cent OS上的远程mysql服务器。经过许多解决方案(授予所有特权,删除ip绑定,启用网络连接)之后,问题仍然没有得到解决。

事实证明,在研究各种解决方案时,我遇到了iptables,这使我意识到mysql端口3306不接受连接。

这是有关我如何检查和解决此问题的小注释。

  • 检查端口是否接受连接:
telnet(mysql服务器ip)[portNo]

-添加ip表规则以允许端口上的连接:

iptables -A输入-i eth0 -p tcp -m tcp --dport 3306 -j接受

-不建议在生产环境中使用此功能,但是如果您的iptables配置不正确,则添加规则可能仍无法解决问题。在这种情况下,应执行以下操作:

服务iptables停止

希望这可以帮助。


3

两步:

  1. 使用通配符设置用户:
    create user 'root'@'%' identified by 'some_characters'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'some_characters' WITH GRANT OPTION

  2. vim /etc/my.cnf
    添加以下内容:
    bind-address=0.0.0.0

重新启动服务器,连接到它应该没有任何问题。


接下来,出现“错误1827(HY000):密码哈希没有预期的格式。请检查PASSWORD()函数是否使用了正确的密码算法。” 你能解释我在这里错了吗?
lampShadesDrifter

2

在mysql 8和更高版本中,不能通过授予特权来添加用户。这意味着此查询:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'type-root-password-here' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

mysql将返回此错误:

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“ IDENTIFIED BY'书面密码”附近使用

这意味着您没有%域的root用户。因此,您需要先插入用户,然后授予如下特权:

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

不要忘记用您的特定密码替换密码。


0

这对我有用。但是有一个奇怪的问题,即使我首先尝试了那些没有影响的问题。我更新了phpmyadmin页面,并以某种方式使其工作。

如果您需要访问local-xampp-mysql。您可以转到xampp-shell->打开命令提示符。

然后使用mysql -uroot -p --port = 3306或mysql -uroot -p(如果设置了密码)。之后,您可以从mysql shell页面授予这些访问权限(也可以从localhost / phpmyadmin运行)。

如果有人找到此主题并且遇到初学者问题,只需添加这些内容即可。


0

Ubuntu 18.04

安装并确保mysqld我们正在运行。

进入数据库并设置root用户:

sudo mysql -u root
SELECT User,Host FROM mysql.user;
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'obamathelongleggedmacdaddy';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

编辑mysqld权限并重新启动:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

# edit the line to be this:
bind-address=0.0.0.0

sudo systemctl stop mysql
sudo systemctl start mysql

从另一台机器进行测试。mysqld机器上的Obvs端口(3306)必须允许来自测试机器的连接。

mysql -u root -p -h 123.456.789.666

MySql的所有其他“安全性”根本没有帮助安全性,它只是使问题变得复杂和模糊不清,实际上,与过去使用一个非常长的密码的日子相比,现在更容易搞砸它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.