讀完書回來, 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 才可以