讀完書回來, MySQL 已經從 MySQL 5.7 升級到 MySQL 8 了. 具體我沒有了解太多, 就速度來說, 據說 MySQL 8 比 MySQL 5.7 要快兩倍
而 MySQL 8 的一個新特性, 也就是登錄使用全新的加密方式, 使我在安裝應用的時候, 撞到了很多錯誤
首先, MySQL 8 是一個全新的版本, 網路的討論區中對此的討論目前還不多, 本人總結一下本人在使用的時候遇到的一些錯誤
本篇博客假定, 你是按照之前本博客給出的 MySQL 安裝方式進行安裝. 如果閣下不是使用之前本博客給出的安裝方式進行安裝, 出現任何問題請 Google
1. phpMyAdmin 提示 The server requested authentication method unknown to the client
這個是因為 MySQL 8 更改了登錄的加密方式, 但是 MySQL 8 還保留了過去的加密方式
首先, 我們需要修改 MySQL 的設定 :
vim /etc/my.cnf
在最下面增加一行
default_authentication_plugin=mysql_native_password
其實上方有一行 #default-authentication-plugin=mysql_native_password
, 理論上來說取消註解之後效果也是一樣的, 但是本人沒有嘗試過
接下來重新啟動 mysqld
systemctl restart mysqld
這個時候還是不可以使用預設的 root 使用者登錄, 因為預設的 root 使用者使用的加密方式是新的, 我們需要建立一個新的使用者, 並且這個使用者擁有全域權限
mysql -uroot -p
然後輸入預設的 root 使用者的密碼
CREATE USER '使用者名稱'@'localhost' IDENTIFIED WITH mysql_native_password BY '使用者密碼';
GRANT ALL PRIVILEGES ON *.* TO '使用者名稱'@'localhost' WITH GRANT OPTION;
如果需要舊的加密方式登錄, 之後在建立新使用者的時候, 一定要帶有 WITH mysql_native_password
此時, 這個新建立的使用者在 localhost 中是擁有全域權限的, 也就是說, 這個權限和預設的 root 使用者是一樣的
這個時候, 我們使用新建立的使用者登錄 phpMyAdmin 登錄就可以了
2. Seafile 提示 Failed to connect to mysql server using user "root" and password "***": Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
這也是因為 MySQL 更改了加密方式引起的, 此時我們需要深入 Seafile 安裝的 Python 程式碼中去修改
首先進入 Seafile 目錄, 然後使用 Vim 進行編輯
vim setup-seafile-mysql.py
找到 validate_root_passwd
函式, 然後將其中的字串 root 修改為你剛剛建立的新使用者. 修改完的函式如下, 其中的使用者名稱就是需要去替換的字串 (記住下面的程式碼不可以直接複製, 請花費一點時間去審核, Python 對縮排極其敏感) :
def validate_root_passwd(self, password):
try:
self.root_conn = self.check_mysql_user('使用者名稱', password)
except InvalidAnswer:
# For MariaDB on Ubuntu 16.04, the msyql root user can only be
# accessed from localhost with unix socket. So we retry with
# localhost when failing with 127.0.0.1.
if self.mysql_host == '127.0.0.1':
self.root_conn = self.check_mysql_user('使用者名稱', password, host='localhost')
else:
raise
return password
然後重新開始安裝, 就可以了
目前, 上述只是針對程式的解決方案, 暫時還未有一個全域的解決方案. 猜測可能是因為 MySQL 8 的加密方式改變, 導致之前 PHP 以及 Python 寫好的資料庫連線函式失效, 並且擲出例外, 這個只能等程式庫更新之後支援 MySQL 8 才可以
自創文章, 原著 : Jonny, 如若需要轉發, 在已經授權的情況下請註明出處 :《對於 MySQL 8 的一些相容性提示》https://jonny.vip/2018/07/10/%e5%b0%8d%e6%96%bc-mysql-8-%e7%9a%84%e4%b8%80%e4%ba%9b%e7%9b%b8%e5%ae%b9%e6%80%a7%e6%8f%90%e7%a4%ba/
Leave a Reply