2012-04-19 151 views
47

我一直在使用SQL Server,现在正在使用MySQL作为项目。使用SQL Server,如果我们的开发人员知道主机,用户名和密码,就可以连接到本地计算机上的远程数据库。与MySQL,不过,给从本地机器上开发者访问,我一直有登录到MySQL和执行:允许所有远程连接,MySQL

GRANT ALL ON *.* to [email protected] IDENTIFIED BY 'password'; 
flush privileges; 

哪里address是开发人员的机器的IP地址。当然,如果他们改变网络,我必须再次执行它。有没有办法像我曾经使用SQL Server一样允许所有的远程连接,或者出于某种原因这是一个坏主意?我们有用户名和密码仍然..我显然有点困惑。

另外:这是一个开发数据库,​​只能从我们的内部网络访问。我明白为什么让每个人都能访问生产数据库是一个坏主意。

+0

嗨。我有同样的问题,并做了所有建议的命令,但我无法访问远程访问。请帮帮我。 – 2017-05-24 19:01:24

回答

114

正如指出的瑞恩以上,你需要的命令是

GRANT ALL ON *.* to [email protected]'%' IDENTIFIED BY 'password'; 

但是,请注意,文件表明,为了使这项工作,从localhost另一个用户帐户必须为同一用户创建;否则,由mysql_install_db自动创建的匿名帐户优先,因为它具有更具体的主机列。

换句话说;为了使用户user能够从任何服务器连接; 2个帐户都必须创建如下:

GRANT ALL ON *.* to [email protected] IDENTIFIED BY 'password'; 
GRANT ALL ON *.* to [email protected]'%' IDENTIFIED BY 'password'; 

阅读完整的文档here.

而这里的参考相关片:

连接到服务器的根目录后,您可以添加新帐户。该 下面的语句使用GRANT来设置四个新账户:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass'; 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' 
    ->  WITH GRANT OPTION; 
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' 
    ->  WITH GRANT OPTION; 
mysql> CREATE USER 'admin'@'localhost'; 
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; 
mysql> CREATE USER 'dummy'@'localhost'; 

这些语句创建的账户有以下 属性:

其中两个账户有蒙蒂的用户名和密码 some_pass。这两个帐户都是具有完全权限的超级用户帐户 可以做任何事情。只有当从本地主机连接 时,才能使用'monty'@'localhost'帐户。 'monty'@'%'帐户使用'%' 通配符作为主机部分,所以它可以用于从任何 主机连接。

有必要有两个账户monty能够连接 从任何地方作为monty。如果没有本地主机帐户, mysql_install_db创建的localhost的 匿名用户帐户优先于monty从 本地主机连接。因此,monty将被视为匿名用户。 原因是匿名用户帐户具有比'monty'@'%'帐户更多的 特定主机列值,因此在用户表排序顺序中更早地出现 。 (user表排序第6.2.4节中讨论 ,“访问控制,阶段1:连接核实”。)

这似乎是愚蠢的,我必须我误解这一点。

+0

完美工作。谢谢! – 2012-04-19 20:51:33

10
GRANT ALL ON *.* to [email protected]'%' IDENTIFIED BY 'password'; 

将允许特定用户从任何地方登录。

这很糟糕,因为它删除了一些安全控制,即如果一个帐户被泄密。

+2

希望我也能接受你的。谢谢! – 2012-04-19 20:51:23

+2

我不得不做的另一件事是TCP绑定接口。由于我必须连接到托管在云中的mysql实例,因此我在/etc/mysql/my.cnf中更改了“bind-address = 0.0.0.0”,默认值为127.0.0.1,其中mysql仅侦听本地环回接口并且不接受来自外部网络的呼叫。 – 2013-08-10 14:21:26

+0

我一直在努力弄清楚如何连接任何和这些soltuions只是帮助我解决了最初的问题。非常感谢,但我遇到了另一个问题。 我试图将端口号从80更改为8080.现在,当我使用http:// servername:8080/mysite时,它会快速恢复为http:// servername/mysite给出404 - 文件或目录未找到错误。我如何使它与端口8080一起工作? 伟大的东西 – Kenny 2018-02-05 16:27:14

18

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

[mysqld] 
skip-grant-tables 
+0

不错的一个!谢谢! :) – Adrian 2014-05-22 19:34:10

+0

我喜欢这个! – adbarads 2014-07-15 15:55:13

2

另外你需要禁用以下配置文件行: 绑定地址127.0.0.1 =

1
mysql> CREATE USER 'monty'@'192.168.%.%' IDENTIFIED BY 'some_pass'; 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'192.168.%.%' 
3

安装和设置mysql以远程连接远程

不适用于mysql_secure_installation! (https://dev.mysql.com/doc/refman/5.5/en/mysql-secure-installation.html

在Ubuntu上,使用安装MySQL:

sudo apt-get install mysql-server 

刚刚在/etc/mysql/my.cnf

[mysqld] 
#### Unix socket settings (making localhost work) 
user   = mysql 
pid-file  = /var/run/mysqld/mysqld.pid 
socket   = /var/run/mysqld/mysqld.sock 

#### TCP Socket settings (making all remote logins work) 
port   = 3306 
bind-address = 0.0.0.0 

登录以下为DB服务器从使用

mysql -u root -p

使用以下语句创建数据库用户

grant all privileges on *.* to ‘username’@‘%’ identified by ‘password’; 

打开防火墙:

sudo ufw allow 3306 

重启MySQL

​​
+0

如果有的话,'授予*。*所有特权给'用户名'@'%'由'密码'标识;'......但无论如何不起作用 – 2017-06-26 10:49:56

+0

sudo ufw允许3306 这对我来说很神奇:) – 2017-10-21 17:26:01

+0

最完整的答案,谢谢! – 2018-01-06 12:28:22