解決 MySQL 升級 8.4 Docker 容器啟動問題

Posted by Y Cheung on Fri, Jun 14, 2024

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

  1. docker-library/mysql 8.4 ↩︎

  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 adding mysql_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) ↩︎

  3. lower_case_table_names - Server System Variables ↩︎