MySQL 不能用 mysql_native_password 了

| | 0 Comments| 08:48
Categories:

幾年前有寫了一篇《自行透過 Docker 建立 WordPress 網站》,來記錄一下怎麼透過 Docker Compose 來架設WordPress 網站。

當時參考的版本是使用 MySQL 8.0.20 的版本,而他在 docker/config/my.cnf 裡面也還有針對 MySQL 做一些設定。而當時 Heresy 當時也沒多想,把 MySQL 的版本改成 latest、設定就直接照抄了;但是現在看來,有的設定似乎是有需要調整的。

主要的問題,是前一陣子在升級的時候、把 MySQL 升級到 8.4.0 之後,就出現了資料庫的容器不斷重啟的問題了。 orz

追了一下後,發現他主要的錯誤是:

[ERROR] [MY-000067] [Server] 
unknown variable 'default-authentication-plugin=mysql_native_password'.

而回去看 my.cnf 這個檔案的內容:

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
secure-file-priv= NULL
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=UTF8MB4
default-authentication-plugin=mysql_native_password

恩,裡面確實有這行設定。 orz

而如果傻傻地直接把這行拿掉的話,看來確實可以跑起來,但是卻會導致本來的連線方法無法正確登入,所以還是不能用。


本來想說就先把 MySQL 降回舊版再說吧?恩,不行,他會說不能從 8.4.0 降回 8.3.0:

[ERROR] [MY-014061] [InnoDB] 
Invalid MySQL server downgrade: Cannot downgrade from 80400 to 80300.
Downgrade is only permitted between patch releases.
mysqld: Can't open file: 'mysql.ibd' (errno: 0 - )

不過這時候也發現了,原來它早就有警告 default_authentication_plugin 要被廢棄、要求使用者改用 authentication_policy 了;只是這邊都用 Docker 跑,所以都沒看到…

[Warning] [MY-010918] [Server] 
'default_authentication_plugin' is deprecated and will be removed in a future release.
Please use authentication_policy instead.

所以該怎麼辦呢?在《How to correctly replace ‘default_authentication_plugin’ with ‘authentication_policy’?》這篇有提供一個臨時性可以繞過問題的方法。

基本上,就是先把 my.cnf 裡面的

default-authentication-plugin=mysql_native_password

這行,改成:

mysql_native_password=ON

這樣就可以讓他暫時可以按照本來的方法繼續使用了!

不過,這樣的玩法他會提出其他的警告:

[Warning] [MY-013360] [Server] 
Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release.
Please use caching_sha2_password instead'

所以基本上,為了以後好,這邊還是需要想辦法處理的。


針對已經建立好的資料庫,要怎麼去修改帳號呢?

這邊可以透過 docker exec -it heresy_db bash 這個指令進到資料庫的容器裡面,然後輸入「mysql -p$MYSQL_ROOT_PASSWORD」後就可以連到資料庫了。

之後,透過「select host, user, plugin from mysql.user;」就可以確認現在 MySQL 裡面有哪些使用者、使用哪種認證方式了。

mysql> select host, user, plugin from mysql.user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| %         | heresy_db        | mysql_native_password |
| %         | root             | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | mysql_native_password |
+-----------+------------------+-----------------------+
6 rows in set (0.00 sec)

這邊可以看到,WordPress 建立的使用者都是使用即將被移除的「mysql_native_password」。

而要修改的話,主要指令如下:

ALTER USER 'heresy_db'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'db_password';
ALTER USER 'root'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'db_password4root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY 'db_password4root';

這邊要記得要把密碼修改成自己的。

而把登入驗證的方法修改好了之後,再回去修改 my.cnf、把 mysql_native_password=ON 這行直接拿掉、然後重起資料庫的容器就可以了。


總之,目前這樣大概是把問題解決了,但是實際上好像還是有其他警告在…

其中一個是警告:

[Warning] [MY-010915] [Server] 
'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode.
They will be merged with strict mode in a future release.

不過目前還沒研究要怎麼把這個警告消掉就是了。

另外,附帶一提,在 my.cnf 裡面第一行的「general_log = 1」會產生大量的紀錄,如果沒有搭配 logrotate 之類的工具來定時拆分、封存的話,檔案會無止盡地增大…這邊後來是把它改成 0、關掉這個紀錄功能了。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *