背景介紹
今天開始做集成測試,需要把程序和環境重新部署在新的服務器上。項目的環境都是基於Docker來的,所以數據庫也是選擇從Docker官網上面拉官方的MySQL鏡像。(Tag = 8.0.12)
從部署到導入數據,一切正常。完事之后進入container里面簡單的查了下數據的個數,em~~~ 沒問題了。 於是邊和測試的同事說了一聲,下午可以看是集成測試了。
中午吃完發,頂着烈日出去辦點事,完事之后正往回走着突然就接到了測試同事的電話。。
QA:那個XX,你的數據庫部署好像有問題啊,我這邊用工具連不上。。。 好吧,
我: 沒問題啊,我上午檢查過的。。。 好吧,我一會就回去,咱們一起看看吧。
原因
回到公司,找到同事,發現報錯如下: “Authentication plugin 'caching_sha2_password' cannot be loaded”。
問題的原因:是從MySQL8.0 開始,默認的加密規則使用的是 caching_sha2_password。 我看了下我從官方拉下來的 docker 鏡像版本是8.0.12(完美中招)
解決方案
於是在網上搜了一下,很快就找到了解決方案。
1. 首先找到當前數據庫用戶root的加密規則
mysql>use mysql; mysql>select user, host, plugin from user
2. 修改加密規則為“mysql_native_password”
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
注: password 替換為 root 的密碼; 或者直接更新這一行 pluggin字段 的值為 “mysql_native_password”
完成后效果如下:
其實到了這兒,問題已經解決。 那么再想一下,既然這個設置是默認的,那么我們能不能在部署數據庫的把它修改掉呢?
更為優雅的解決方案
又重新回到了 MySQL 官方在docker的倉庫中,仔細的閱讀了一遍官方的說明。其實,我們在啟動MySQL 容器的時候,是可以修改一些設置的。主要有2種方式。1. 自定義配置文件,並 mount 到 container里。這樣在MySQL啟動時,會加載我們的配置文件。 2. 啟動MySQL容器是傳入CMD,通過命令修改默認加密規則(下面綠色部分)
# docker run -d -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=weather_db -p 3307:3306 --name test-mysql --restart always -v /home/ct/mysql/data:/var/lib/mysql
mysql:8.0.12 --default-authentication-plugin=mysql_native_password
另外,還有通過 docker-compose 方式來實現的,這里就不再贅述,請參考官方描述。
OK!感謝收看,同時也歡迎大家積極留言討論哈~~
參考
https://majing.io/posts/10000021021192
https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded
https://hub.docker.com/r/_/mysql/