Mysql docker部署8.0升级到8.4
1:背景概述
- 为修复某客户mysql安全漏洞,小版本更新已经无法修复---> CVE-2024-21176
- 部署方式: docker单机部署,采用docker-compose启动方式
yaml
services:
mysql:
image: mysql:8.0.39
container_name: mysql
environment:
- LANG=C.UTF-8
- TZ=${TIME_ZONE:-Asia/Shanghai}
- MYSQL_ROOT_PASSWORD=xxxxxxx
volumes:
- ./mysql/initdb.d:/docker-entrypoint-initdb.d
- ./mysql/data:/var/lib/mysql
- ./mysql/conf/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
ports:
- 3306:3306
restart: always
- 升级版本:8.0.39 -> 8.4.5
- 当前配置文件mysql.cnf:
ini
[client]
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default-storage-engine = InnoDB
default-authentication-plugin = mysql_native_password
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
init_connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake
explicit_defaults_for_timestamp
slow_query_log
long_query_time = 3
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
default-time-zone = '+8:00'
max_connections = 1000
innodb_buffer_pool_size = 1G
sort_buffer_size = 1M
join_buffer_size = 1M
[mysql]
default-character-set = utf8mb4
升级流程
graph LR
备份 --> 停止旧版mysql -->修改docker-compose.yml镜像tag --> 启动新版mysql
备份
生产环境采用msyqldump方式,测试环境可以停止mysql容器后 直接备份数据目录cp -rf mysql mysql_bak
停止旧版mysql
shell
# 在docker-compose.yml文件目录执行
docker-compose down -v
修改镜像tag
mysql:8.0.39 --> mysql:8.4.5
启动新版mysql
shell
# 在docker-compose.yml文件目录执行
docker-compose up -d
启动报错
log
2025-06-05T12:36:52.141472Z 0 [ERROR] [MY-000067] [Server] unknown variable 'default-authentication-plugin=mysql_native_password'.
2025-06-05T12:36:52.142300Z 0 [ERROR] [MY-010119] [Server] Aborting
2025-06-05T12:41:31.730861Z 0 [ERROR] [MY-000068] [Server] unknown option '--skip-character-set-client-handshake'.
2025-06-05T12:41:31.731594Z 0 [ERROR] [MY-010119] [Server] Aborting
导致容器无法启动的故障主要是这两条配置
解决方法
修改配置文件:
ini
[client]
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default-storage-engine = InnoDB
#default-authentication-plugin = mysql_native_password
mysql_native_password = on
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
init_connect = 'SET NAMES utf8mb4'
#skip-character-set-client-handshake
explicit_defaults_for_timestamp
slow_query_log
long_query_time = 3
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
default-time-zone = '+8:00'
max_connections = 1000
innodb_buffer_pool_size = 1G
sort_buffer_size = 1M
join_buffer_size = 1M
[mysql]
default-character-set = utf8mb4
注释: default-authentication-plugin = mysql_native_password skip-character-set-client-handshake
新增: mysql_native_password = on
修改完后即可重新启动了
总结
- mysql可以从8.0直接升级到8.4,(但5.7是不可以直接升级8.4的)
- 只需修改弃用的某些参数即可启动成功,参考链接:dev.mysql.com/doc/refman/...
- nacos2.2版本支持mysql8.4.5!!!