允许从任何IP地址远程访问MySQL数据库


280

我知道此命令:

GRANT ALL PRIVILEGES
ON database.*
TO 'user'@'yourremotehost'
IDENTIFIED BY 'newpassword';

但是,这只允许我授予特定的IP地址来访问此远程MySQL数据库。如果我想要它,以便任何远程主机都可以访问该MySQL数据库怎么办?我怎么做?基本上,我将此数据库公开,以便每个人都可以访问它。


1
在执行此操作之前,请考虑安全隐患:security.stackexchange.com/questions/63881/…–
e18r

7
并非每个系统都是生产系统。有些人需要这个来发展。
康拉德·琼斯

Answers:


272
TO 'user'@'%'

%是通配符- 如果需要,您也可以执行'%.domain.com''%.123.123.123'等操作。


@kristopolous有很多原因可能导致这种情况。此命令是关于远程访问(两台不同的计算机)。如果那不是您要执行的操作,那么这不是正确的命令。您仍然需要正确的密码和其他东西。
Ariel 2015年

11
您必须使用“刷新特权”;使更改生效
Didier Sampaolo 2015年

连接到在同一OS实例(例如,开发计算机)上运行的数据库实例时的技巧是传递-h my_machine_name参数。这会欺骗客户识别您的身份'user'@my_machine_name.example.com,而不是'user'@localhost。这样,您无需为localhost网络访问权限创建和维护双重帐户和授权。而且,当然,可以肯定mysqld必然要0.0.0.0127.0.0.1
查理·里策

173

启用远程访问(授予)主页/教程/ Mysql /启用远程访问(授予)如果您尝试从远程计算机连接到mysql服务器,并遇到以下错误,则本文适合您。

错误1130(HY000):不允许主机“ 1.2.3.4”连接到该MySQL服务器

更改mysql配置

从编辑mysql配置文件开始

vim /etc/mysql/my.cnf

注释掉以下几行。

#bind-address           = 127.0.0.1
#skip-networking

如果找不到跳过网络行,请添加并注释掉它。

重启mysql服务器。

~ /etc/init.d/mysql restart

更改GRANT权限

您可能会惊讶地发现,即使进行了上述更改,您仍无法获得远程访问权限或无法访问所有数据库。

默认情况下,允许您使用的mysql用户名和密码在本地访问mysql-server。因此需要更新特权。

运行如下命令从所有机器访问。(替换USERNAMEPASSWORD通过您的凭据。)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

运行以下命令,以允许从特定IP进行访问。(替换USERNAMEPASSWORD通过您的凭据。)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'1.2.3.4' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

您可以用IP替换1.2.3.4。您可以多次运行以上命令,以从多个IP授予访问权限。

您也可以为远程访问指定一个单独的USERNAMEPASSWORD

您可以通过以下方式检查最终结果:

SELECT * from information_schema.user_privileges where grantee like "'USERNAME'%";

最后,您可能还需要运行:

mysql> FLUSH PRIVILEGES;

测试连接

从终端/命令行:

mysql -h HOST -u USERNAME -pPASSWORD

如果您使用的是mysql shell,请不要忘记运行show database。检查您是否具有远程计算机的正确权限。

奖励提示:撤消访问权限

如果您不小心将访问权限授予了用户,则最好使用撤销选项。

以下操作将撤消所有计算机上USERNAME的所有选项:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'%';
Following will revoke all options for USERNAME from particular IP:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'1.2.3.4';
Its better to check information_schema.user_privileges table after running REVOKE command.

如果在运行REVOKE命令后看到USAGE特权,就可以了。根本没有特权。我不确定是否可以撤销。


7
请注意,我必须更改/etc/mysql/mysql.conf.d/mysqld.cnf文件而不是/etc/mysql/my.cnf注释掉bind-address零件。#skip-networking缺少该行,添加和注释该行应该没有效果。
Pawan

1
在MariaDB 10.1.26上,配置文件是/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz '18年

如果你已经完成了所有的上方,仍然无法连接,请检查你的防火墙设置,可能会阻止端口3306或其他任何端口您已经设置了
AVN

37

假设上述步骤已完成,并且可以免费远程访问MySql端口3306;不要忘记在mysql配置文件中绑定公共IP地址。

例如在我的ubuntu服务器上:

#nano /etc/mysql/my.cnf

在文件中,搜索[mysqld]节,并添加新的绑定地址,在本示例中为192.168.0.116。看起来像这样

......    
.....    
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

bind-address        = 127.0.0.1    
bind-address        = 192.168.0.116

.....    
......

您可以选择删除localhost(127.0.0.1)绑定,但是必须专门提供IP地址才能访问本地计算机上的服务器。

然后,最后一步是重新启动MySql服务器(在ubuntu上)

stop mysql

start mysql

#/etc/init.d/mysql restart其他系统

现在可以通过以下方式远程访问MySQL数据库:

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reload应该足够了
Lorenz Lo Sauer 2013年

我只是这样做,无法远程连接到mysql服务器。然后,我尝试注释掉绑定地址,然后它起作用了。我还尝试了使用mysql -u <user> -p登录服务器而不指定主机,并且该主机正常工作,因此看来“如果您选择可以删除localhost(127.0.0.1)绑定,但是您必须专门提供IP地址以访问本地计算机上的服务器。” 是不正确的。(ubuntu 12.04 LTS服务器mysql Ver 14.14 Distrib 5.5.34)
Programster

5
bind-address指令确定mysql 服务器监听的IP地址。不是服务器接受连接的IP地址。
GoZoner 2014年

1
遵循每个步骤后,它将不起作用。注释掉bind-addresslocalhost或remotehost地址时出现错误。mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
baermathias

是否可以提供abc.abc:1234之类的地址,而不是192.168.0.116?
比拉斯

26

对于任何对此感到困惑的人,这就是我必须授予的特权,希望它能对某人有所帮助

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY
'yourRootPassword';

如前所述,%通配符将允许任何IP地址连接到您的数据库。我在这里所做的假设是,当您连接时,您将有一个名为root(虽然是默认值)的用户。输入root密码,您一切顺利。请注意,我'的用户root周围没有单引号()。


为什么从用户中删除单引号很重要?为什么这与其他答案(和手册)不同?
DMCoding

26

需要更改配置文件才能启用通过本地主机的连接。

要通过远程IP连接,请以“ root”用户身份登录并在mysql中运行以下查询。

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

这将创建一个新用户,该用户可以从localhost以及从远程IP访问。

还注释位于/etc/mysql/my.cnf中的my.cnf文件中的以下行

bind-address = 127.0.0.1

使用以下命令重新启动mysql

sudo service mysql restart

现在,您应该可以远程连接到mysql了。


2
这不能回答问题。
CHarris '16

1
@ChristopheHarris为什么会这样?答案显然给出了有关如何在MySQL中创建新用户的分步说明,该用户允许localhost和使用该用户的远程访问数据库。你能请plesae解释吗?
harishannam

1
对我不起作用。仍然有同样的错误。无论我是root用户还是新用户都可以尝试:无法连接到xxx.xxx.xxx.xxx上的MySQL服务器([Errno 61]连接被拒绝)
baermathias

21

使用以下命令:

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY 'yourRootPassword';

然后:

FLUSH PRIVILEGES; 

然后在文件“ /etc/mysql/mysql.conf.d/mysqld.cnf”中注释掉以下行(必需!):

bind-address = 127.0.0.1 

为我工作!


很好。重要的补助金。如果不是这样,很多错误的像请求your-password-does-not-satisfy-the-current-policy-requirements
亚历杭德罗·特谢拉·穆尼奥斯

21

为了能够通过任何IP地址与您的用户连接,请执行以下操作:

允许mysql服务器接受远程连接。对于此打开的mysqld.conf文件:

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

搜索以“ bind-address”开头的行,并将其值设置为0.0.0.0

bind-address                    = 0.0.0.0

最后保存文件。

注意:如果您正在运行MySQL 8+,默认情况下该bind-address指令将不在mysqld.cnf文件中。在这种情况下,请将指令添加到文件的底部/etc/mysql/mysql.conf.d/mysqld.cnf

现在,使用systemd或使用旧service命令重新启动mysql服务器。这取决于您的操作系统:

sudo systemctl restart mysql # for ubuntu    
sudo systemctl restart mysqld.service # for debian

最后,mysql服务器现在可以接受远程连接。

现在,我们需要创建一个用户并为其授予权限,这样我们就可以使用该用户远程登录。

以root或具有root特权的任何其他用户连接到MySQL数据库。

mysql -u root -p

现在,在localhost和'%'通配符中都创建所需的用户,并按原样授予所有数据库的权限。

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

然后,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

最后不要忘记刷新权限

FLUSH PRIVILEGES;

注意:如果您已在数据库服务器上配置了防火墙,则还需要打开端口3306MySQL的默认端口以允许到MySQL的通信。

希望这可以帮助 ;)


2
sudo systemctl restart mysqld.service是针对debian的,我不得不使用sudo systemctl restart mysql.service是针对ubuntu的
ani0904071

我更新了答案并为两个发行版添加了mysql restart命令。感谢@ ani0904071
Imtiaz Shakil Siddique

17

运行以下命令:

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to root@'ipaddress' IDENTIFIED BY 'mysql root password';     
mysql> FLUSH PRIVILEGES;     
mysql> exit

然后尝试从您指定的IP地址进行连接:

mysql -h address-of-remove-server -u root -p   

您应该能够连接。




7

要远程访问数据库Mysql服务器8:

CREATE USER 'root'@'%' IDENTIFIED BY 'Pswword@123';

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

FLUSH PRIVILEGES;

5
  • 使用管理员用户启动MYSQL
    • mysql -u admin-user -p(在提示时输入密码)
  • 创建一个新用户:
    • 创建用户'newuser'@'%'由'密码'标识;(%-> anyhost)
  • 授予特权:
    • 在db_name上进行GRANT SELECT,DELETE,INSERT,UPDATE。*至'newuser'@'%';
    • 冲洗特权;

如果您正在运行EC2实例,请不要忘记使用MYSQL / Aurura在安全组中添加入站规则。


5

编辑文件:

/etc/mysql/percona-server.cnf

在文件中追加以下代码。

[mysqld] bind-address = 0.0.0.0

创建用于远程访问的用户。

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to snippetbucketdotcom@'%' IDENTIFIED BY 'tejastank';   
mysql> FLUSH PRIVILEGES;    
mysql> exit

所有linux服务器都能正常工作,

对于MSWin c:\查找安装位置\文件路径


[mysqld]需要添加文件,否则将无法正常工作
Tejas Tank

3

只需将用户创建到某些数据库即可

GRANT ALL PRIVILEGES ON <database_name>.* TO '<username>'@'%' IDENTIFIED BY '<password>'

然后去

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf并将行更改bind-address = 127.0.0.1bind-address = 0.0.0.0

之后,您可以从任何IP连接到该数据库。


3

打开您的服务器mysql console并执行以下命令(输入您的数据库名称,用户名和密码):

*授予admin @'%',由'yourRootPassword'标识;

然后执行:

冲洗特权;

打开命令行,然后/etc/mysql/mysql.conf.d/mysqld.cnf使用任何编辑器打开文件root privileges

例如:

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

然后注释掉以下行:

绑定地址= 127.0.0.1

使用以下命令重新启动mysql以反映更改:

sudo service mysql restart

请享用 ;)


2

您需要更改mysql配置文件:

从编辑mysql配置文件开始

vim /etc/mysql/my.cnf

加:

bind-address = 0.0.0.0

0

在cPanel之类的网站面板中,您可以%在允许的主机名中添加一个(百分号)来访问您的MySQL数据库。

通过添加一个,%您可以从任何IP或网站甚至从桌面应用程序访问数据库。


提出直接查询时,请不要引用cPanel之类的东西,否则永远不会显示其他任何人的工作结果
Tobias Hagenbeek

@TobiasHagenbeek感谢您的反馈。这种方法/技巧不是我发明的(在互联网上很常见)。但是我是该方法的测试者之一,我发现它是最简单且可行的方法,因此我将其发布在这里。我知道这种方法存在一些安全隐患,可以忽略。
穆罕默德·萨奇布

0

例如在我的CentOS中

须藤gedit /etc/mysql/my.cnf

注释掉以下几行

#bind-address = 127.0.0.1

然后

sudo服务mysqld重新启动


0

如果要授予从任何IP地址对数据库的远程访问权限,请运行mysql命令,然后运行以下命令。

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

0

在Ubuntu上工作的是向用户授予所有特权:

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

并在中设置绑定地址/etc/mysql/mysql.conf.d/mysqld.cnf

bind-address            = 0.0.0.0

然后重启mysql守护进程:

service mysql restart

-7

您可以通过编辑/etc/my.cnf禁用所有安全性:

skip-grant-tables

这会删除所有密码要求
kristopolous

5
请注意,不建议在生产环境中启用此选项,因为这允许任何人无需密码即可连接!
AStopher

但是,这对于开发环境非常理想
DMCoding '16

这使人们无需使用密码即可破解您的数据库。
MilkyWay90

@DanielJames甚至对于开发环境来说也是一个糟糕的主意
Dragas
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.