mysql8.0 授权远程登录连接

mysql8不可以root用户直接授权,需要新建用户。

问题

使用docker安装mysql8,需求开启远程登录连接,但使用grant操作一直报错。之前使用5.7版本的时候是没有问题的,所以认为应该是版本问题导致的,MySQL8应该修改了赋予权限的方式。

1
2
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'root'' at line 1

原因

新版本将创建账户和赋予权限的方式分开,mysql8不可以root用户直接授权,需要新建用户。

解决方法

  1. 创建dev用户(以dev用户为例)
    1
    2
    3
    # 新建dev用户
    mysql> create user 'dev'@'%' identified with mysql_native_password by 'dev';
    Query OK, 0 rows affected (0.11 sec)

MySQL8和5的密码加密方式不同,mysql_native_password是5的加密方式。mysql已经将之前的mysql_native_password认证,修改成了caching_sha2_password认证方式。所以,使用类似于navicat或是sqlyog这些客户端时,默认使用还是mysql_native_password认证方式,所以即使输入正确的用户和密码依然登录不成功。客户端新版未测试过,不清楚是否已经支持

  1. 查看下表里是否有dev用户,host是否为%

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 查看mysql库user表
    mysql> select user,host from user;
    +------------------+-----------+
    | user | host |
    +------------------+-----------+
    | dev | % |
    | healthchecker | localhost |
    | mysql.infoschema | localhost |
    | mysql.session | localhost |
    | mysql.sys | localhost |
    | root | localhost |
    +------------------+-----------+
    6 rows in set (0.00 sec)
  2. 赋予权限, (修改权限时在后面加with grant option)

    1
    2
    3
    # 将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
    mysql> grant all on *.* to 'dev'@'%';
    Query OK, 0 rows affected (0.10 sec)
  3. 刷新权限

    1
    2
    3
    # 刷新权限
    mysql> flush privileges;
    Query OK, 0 rows affected (0.05 sec)
  4. 再次使用Navicat测试,连接成功!