远程连接
打开 3306 端口
Windows 在高级安全防火墙,入站规则中,允许 3306。
允许 root 远程连接
默认情况下,只能在本机使用 root 连接 MySQL,怎样允许在互联网上也连接它呢?
注意:这里只是说如何操作,并不是建议你开放 root。
连接 MySQL,先看看情况:
select user, host from mysql.user;
mysql 是系统数据库,后面的 user 是其表名。
可以看出,root 只能在 127.0.0.1、::1(IPv6)、localhost 上连接。
grant all privileges on *.* to root@'%' identified by 'password';
grant all privileges 是授予所有权限,可省略 privileges 写作 grant all。
on *.* 是所有数据库、所有表。
to root@'%' 是对 root 用户的所有 IP,这个 % 是通配符。
identified by 'password' 是指定密码:必须指定,而且比较有意思的是可以指定跟之前不一样的密码,也就是说可以实现不同的 IP 有不同的密码。
% 和密码,必须使用引号,不能省略,其他的通常都可以省略。但规范的写法是:数据库名称使用 `(即 ~ 下面那个),用户名也加上单引号('root')。
% 不能省略引号是因为字符特殊,如果是 localhost 就可以省略,而密码不能省略是密码就是要引起来。
前面说了 % 是通配符,也说了可以指定不一样的密码,那其实我们在使用 localhost 连接时,还是 localhost 对应的密码优先,并不是 % 对应的密码优先。
如果是 MySQL-Front 创建用户的话,就简单了,图形界面,但是不知道是我版本的原因还是怎么的,选择所有权限时会出错,也就是说授不了 all privileges,只得还是用命令行。
另外,查看当前用户的权限,查看特定用户的权限,分别如下:
show grants; show grants for root@localhost;
注意 MySQL 的用户,总是跟主机绑在一起的,所以有个 @,但是我们在连接字符串中用不着指定主机,比如:
server=123.123.123.123;port=3306;database=test;uid=test;pwd=mytestpassword;Charset=utf8;Allow Zero Datetime=True;SslMode=None
创建用户和授权
其实创建用户就是前面讲的,也就是说创建用户和授权一体化操作:
grant all on test.* to test@'%' identified by 'mytestpassword';
此法比较有用,通常是对这个数据库授一个管理员。
收回权限和删除用户
revoke all on test.* from test@'%';
有时候收回权限时会说没这个权限,收回失败。此时可以用前面说的 show grants for user@host,看看,到底有什么权限。
删:
drop user test@'%';
我很奇怪:我明明已经删除了,前后对比可以看出用户由 6 变成 5 了,可是 MySQL 执行时提示:0 rows affected。看来看这个提示不可靠。
如果对应还有相同的用户(只是主机不同),此时建议重启 SQL。
图形化操作就更简单了。