Y Cheung 最近將系統中很久沒更新的 MySQL Docker Image更新到了最新的lts版本1,結果容器就起不來了,哭哭,一直不停重啟。
修復 unknown variable default-authentication-plugin 錯誤
查閱docker log信息發現:
1[Server] unknown variable 'default-authentication-plugin=mysql_native_password'.
啊,原來之前在MySQL升級到8的時候 Y Cheung 曾寫過需要使用 --default-authentication-plugin=mysql_native_password
這個參數將預設密碼加密方式改為mysql_native_password
,而現在MySQL升級到8.4後,這個參數也失效啦2,需要改成 --mysql_native_password=ON
。
修復 case insensitive 警告
另外因為這次Y Cheung又用了windows平台做開發,發現了一個新的Warning信息(可能以前沒留意到),也順便在這裡說下:
1[Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
查了下 lower_case_table_names
參數是用來控制表名的大小寫敏感性以此兼容不同操作系統的文件系統3:
操作系統 | 大小寫敏感性 | lower_case_table_names預設值 | lower_case_table_names可能的值 |
---|---|---|---|
Unix/Linux | 預設區分大小寫 | lower_case_table_names=0 | 0或1 |
Windows | 預設不區分大小寫 | lower_case_table_names=1 | 1或2 |
macOS | 預設小寫 | lower_case_table_names=2 | 1或2 |
⚠️
如果在不區分大小寫的文件系統上將lower_case_table_names設為0,MySQL會拒絕啟動以防止數據損壞。
⚠️
在 Unix/Linux 系统上,不支持lower_case_table_names=2,MySQL會強制將其設為0。
⚠️
lower_case_table_names只能在MySQL服務器初始化時設置,啟動後不能修改。如果需要修改,必須先將所有大小寫不一致的表名改為小寫,然後重啟服務器並設置新值。因此,在安裝MySQL時就應該根據實際需求預先設置好lower_case_table_names。
綜合來看,為了提高MySQL的跨平台可移植性,建議將lower_case_table_names參數設置為1。
不過 Y Cheung這個是臨時用開發環境,不會遷移去別的平台,所以按照提示改就是了。那麼就在參數中加上 --lower_case_table_names=2
吧。
示範 docker-compose.yml 內容
總的來說,在Windows平台上使用MySQL 8.4 版本以上的Docker鏡像時,示例docker-compose.yml
內容為:
1version: '3'
2services:
3 yoast-db:
4 image: mysql:lts
5 restart: always
6 volumes:
7 - 'D:\Projects\mysql\data:/var/lib/mysql'
8 ports:
9 - '127.0.0.1:23306:3306'
10 environment:
11 - MYSQL_ROOT_PASSWORD=your_password
12 - MYSQL_DATABASE=your_database
13 command: --mysql-native-password=ON --lower_case_table_names=2
-
Important Change: The deprecated
mysql_native_password
authentication plugin is now disabled by default. It can be enabled by starting MySQL with the new--mysql-native-password=ON
server option, or by addingmysql_native_password=ON
to the[mysqld]
section of your MySQL configuration file. Deprecation and Removal Notes - Changes in MySQL 8.4.0 (2024-04-30, LTS Release) ↩︎