MySQL 添加远程访问用户

192

我创建了用户user@'%',密码为'password'。但是我无法连接:

mysql_connect('localhost:3306', 'user', 'password');

我创建了用户user@'localhost',为什么能连接成功?难道'%'不是代表任何主机吗?


请注意,用户@localhost和用户@%的密码通常不同,以及权限。 - Jose Manuel Gomez Alvarez
5个回答

499

为了远程连接,您必须在my.cnf中将MySQL绑定端口3306到您机器的IP地址。然后,您必须在本地主机和“%”通配符上创建用户,并授予所有数据库的权限。请参见以下内容:

my.cnf(Windows上的my.ini)

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

那么:

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;

根据您的操作系统,您可能需要打开端口 3306 以允许远程连接。


1
这篇文章帮助我使用WebFaction的私有MySQL实例。我按照您的CREATE USER和GRANT ALL步骤操作,将mysql.default_port = <private instance port>设置在我的php.ini中,然后在整个过程中都使用了127.0.0.1作为我的数据库主机名。 - spex
9
别忘了执行FLUSH PRIVILEGES;) - louffi
2
还要检查 /etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf 位置以更改 bind-address=0.0.0.0 - Vishnu S. Divetia
11
为什么要同时使用localhost和%,是什么原因? - nights
1
@VishnuS.Divetia 0.0.0.0 不是必需的。只需要知道远程访问将通过哪个接口的IP地址即可。 - stackprotector
显示剩余10条评论

28

按照以下步骤操作(在Windows中不需要步骤1至3):

  1. 找到要编辑的mysql配置文件:

/etc/mysql/my.cnf (Mysql 5.5)

/etc/mysql/conf.d/mysql.cnf (Mysql 5.6+)

  1. 在配置文件中查找bind-address=127.0.0.1并将其改为bind-address=0.0.0.0(您可以将绑定地址设置为其中一个接口IP,或者像我一样使用0.0.0.0)

  2. 在控制台上运行service mysql restart以重启mysql服务。

  3. 为远程连接创建一个安全密码的用户。要执行此操作,请在mysql中运行以下命令(如果您是Linux用户,则可以通过运行mysql进入mysql控制台,如果您为root设置了密码,则运行mysql -p):

GRANT ALL PRIVILEGES ON *.* TO 'remote'@'%' IDENTIFIED BY 'safe_password' WITH GRANT OPTION;
现在您应该拥有一个用户名为user,密码为safe_password,并具备远程连接能力的用户。

2
更改bind-address=0.0.0.0...对我有用。并授予权限。 - IgorAlves
允许在全局范围内绑定地址会带来很大的安全问题。我们可以添加特定的IP地址或地址范围,而不是这样做。 - guru rajender
第三步应该是:service mysql restart。 - quanly_mc
@quanly-mc 你说得对,我刚刚修复了它。谢谢。 - MSS
根据这篇文章(https://serverfault.com/a/257517),假设您要允许所有外部/非本地连接,0.0.0.0是可以的,甚至在后期版本的mysql中也是默认设置。 - Kevin Wheeler

15

这个用户使用哪个数据库?看看这个例子:

mysql> create database databasename;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on databasename.* to cmsuser@localhost identified by 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

回到你的问题,"%" 运算符表示你网络中的所有计算机。

就像 aspesa 所说,我也确定你必须创建或更新一个用户。查找所有你的 MySQL 用户:

SELECT user,password,host FROM user;

一旦您设置好用户,您应该能够像这样连接:

mysql -h localhost -u cmsuser -p

希望它能帮助到你


通常情况下,对于所有的数据库,我只想连接,而不是选择数据库。 codemysql_connect('localhost:3306', 'user', 'password'); code - user2333586
你用的是什么操作系统,Windows 还是 Linux? - apesa
您需要确保将IP地址绑定到端口3306。在Windows中,您可以使用netstat -n命令查看哪些端口绑定到您的IP地址。如果您看到127.0.0.1:3306,则只能从本地主机连接,无法从其他任何地方进行连接。 - apesa

3

我曾使用一个已存在的用户,该用户的密码是使用mysql_navtive_password加密的。

CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

不是
CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';

因此,它无法连接。删除旧的并创建一个没有mysql_native_password的新的解决了问题。


0
另一种方法是使用MySql Workbench。 进入Administration -> Users and privileges -> 并将“Limit to Host Matching”(From host)属性中的“localhost”更改为“%”,以便为您想要提供远程访问权限的用户授予访问权限。或者创建一个新用户(添加帐户按钮),在此属性中使用“%”代替localhost。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接