幾年前有寫了一篇《自行透過 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、關掉這個紀錄功能了。