之前一直在用简单的sqlite,没怎么使用过mysql,今天配置mysql的时候,本来以为相关的问题应该很成熟很好查找并解决了,但是实际使用的时候发现有很多莫名其妙的问题。我在这里做一个记录。
真正让这些问题难以解决的原因是,我无法从对方简单的报错中找到解决问题的有效信息。如果连接失败,你只会知道对方拒绝了链接,但并不知道它为什么拒绝。于是我只好猜测是否是网络原因,wsl与windows通信异常等。这样一来方向就错了。我想这种设计的理由也许是安全考虑?
mysql配置文件更改
要想让mysql访问外部网络,首先要让它的3306监听对象设置为0.0.0.0,而非localhost。这需要在配置文件中进行更改。位置/etc/mysql/mysql.conf.d/mysqld.cnf:
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
# mysqlx-bind-address = 127.0.0.1
如上所示,这里在bind-address以及mysqlx-bind-address前面加上 # 即可。(mysqlx-bind-address可加可不加)。
更改后重启服务:
service mysql restart
然后验证一下,netstat -ap | grep mysql:
tcp6 0 0 [::]:mysql [::]:* LISTEN 278/mysqld
tcp6 0 0 [::]:33060 [::]:* LISTEN 278/mysqld
第三列(local address)出现 [::]或者0.0.0.0即可。
用户权限更改
- 进入到mysql命令行控制台的配置界面。根据root用户的插件不同,可能是
mysql
或者
mysql -uroot -p
- 进入mysql配置数据库(注意分号):
use mysql;
- 查看当前用户信息:
select user,host,plugin from user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | auth_socket |
+------------------+-----------+-----------------------+
假定你想使用root用户作为远程链接的对象,那么你需要修改host为%(代表mysql中的链接通配符),且plugin不能是auth_socket。MySQL 8 对 root默认使用 auth_socket 插件进行认证,这会导致你在命令行下(同一台机器)无需输入密码就可登录,但远程连接会被拒绝。使用如下命令进行修改:
update user set plugin="caching_sha2_password" where user='root';
update user set host = '%' where user = 'root';
链接客户端配置
有的时候会出现这个报错:
Public Key Retrieval is not allowed
在客户端的属性配置里面需要打开这个选项:
allowPublicKeyRetrieval=True
dbeaver为例: