Chipmunk & Panda

-- 鼠熊部落格

All work and no play makes Jack a dull boy.

MySQL 创建用户并授权远程访问

核心思路

首先查一下 user 表。

1
2
3
4
5
6
7
8
9
10
11
12
use mysql;
select user, host from user;

+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

表里只有个 root@localhost,因此在远程登录的时候,由于找不到能匹配的 user 对,登录会失败。解决方法很简单,要么修改已有的 user 行,将其 host 值改为远程访问所用的 ip(不推荐),要么添加一个新的 user。

添加新 user 代码如下:

1
2
3
USE mysql;
GRANT ALL PRIVILEGES ON database.table TO 'username'@'host' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

上述代码创建了一个用户名为 username,主机为 host,密码为 password 的用户,并将 database 数据库中的 table 表的所有操作权限都赋予了该用户,最后刷新了访问权限表。

用户名可以重复,但 username@host 对不可以,即在已有 root@localhost 的情况下,可以再创建一个 root@192.168.0.1,但不能再创建一个同样的 root@localhost 记录。在存在多个重复用户名时,登录时,MySQL 会按照一定顺序进行匹配,选择最先匹配到的记录进行登录尝试,大致顺序就是从最具体的 host 到最宽泛的 host,即‘%’(通配)。

MySQL 8.0 新变化

参考自 How to grant all privileges to root user in MySQL 8.0

MySQL 8.0 不再允许直接使用 GRANT 语句创建用户,因此上面的代码应当被拆分,首先使用 CREATE 创建用户,而后使用 GRANT 授权。

1
2
3
4
USE mysql;
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.table TO 'username'@'host' WITH GRANT OPTION;
FLUSH PRIVILEGES;