一波三折的新項目啓動

在本週轉到了考試系統的項目,開始以前就知道會遇到問題,但沒想到,會遇到這麼多問題。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 錯誤的解決方法

相關文章
相關標籤/搜索