一波三折的新项目启动

在本周转到了考试系统的项目,开始以前就知道会遇到问题,但没想到,会遇到这么多问题。html

FlywayEditionUpgradeRequiredException: Flyway Enterprise Edition or MySQL upgrade required: MySQL 5.6 is no longer supported

启动项目时遇到的第一个问题就是这样,不过这个很好解决,报错已经说得很明白了,要么升级flyway,要么升级mysql版本,毫无疑问是升级mysql版本了。
但当时为了偷懒,就用docker安装了最新版的mysql,这已是mysql8了,这又埋下坑。mysql

Public Key Retrieval is not allowed

新的问题出现了,这是由于MySQL8.0版本的加密方式和MySQL5.0的不同,mysql8.0 以前的版本中加密规则是mysql_native_password,而在mysql8以后,加密规则是caching_sha2_password,最简单的解决办法就是,在链接后面加上allowPublicKeyRetrieval=true
关于为何做出这个修改,官方给出了解释sql

若是用户使用了 sha256_password 认证,密码在传输过程当中必须使用 TLS 协议保护,可是若是 RSA 公钥不可用,可使用服务器提供的公钥;能够在链接中经过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以容许客户端从服务器获取公钥;可是须要注意的是 AllowPublicKeyRetrieval=True可能会致使恶意的代理经过中间人攻击(MITM)获取到明文密码,因此默认是关闭的,必须显式开启

navicat链接不上

上面的方法确实让项目启动了,可是这样的话navicat仍是没法链接的docker

连接不上的问题仍是由于上面这个,对此咱们有三个解决方案数据库

1.将mysql用户登陆的加密规则还原为mysql_native_password

ALTER USER 'test'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
 
  ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

2.修改/etc/my.cnf

加入default_authentication_plugin=mysql_native_password(重启生效)服务器

3.升级navicat版本

这个就不用多说了,navicat15是能连上的socket

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

没想到的是本身又遇到问题了,开始的时候网上看到的解决办法并不适合本身,对错暂且不论,毕竟用那种方法的好像不止一我的,因此就去下载了最新版的navicat,可是按照之前的方法链接数据库时却遇到了上面的问题,这个问题并非第一次遇到了,但之前遇到这个都是由于mysql没启动,但此次能够确定的是本身已经用docker启动了mysql,而且用老版navicat时,是能够链接的,因此确定不是mysql的问题。ui

通过搜索找到了问题:加密

这是因为咱们链接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”作为主机名。 使用主机名参数为“localhost”链接mysql服务端时,mysql客户端会认为是链接本机,因此会尝试以socket文件方式进行链接(socket文件链接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/mysql.cnf”的路径,未找到相应的socket文件,就会引起此错误。

因此能够猜想出,新版的navicat链接方式也变成了这样。mysql是经过docker启动的,天然本机就没有了相应的socket文件了。spa

关于这个问题的更多详细探索能够查看这篇文章

总结

感受遇到这些问题某种意义都是本身做的,一切都是由于装了个最新版的mysql,可是若不是由于此次做也就没法了解到这些如今看来没什么做用的知识了,做了可以解决遇到的问题,并能了解为何,我感受仍是值的。

参考文章

navicat链接MySQL8.0.11报2059错误的解决方案
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
MySQL 8.0 Public Key Retrieval is not allowed 错误的解决方法

相关文章
相关标签/搜索