MySQL 8.0+升级后my.cnf中query_cache_type、query_cache_size等参数已彻底移除,必须整行删除;default_authentication_plugin已弃用,应改用authentication_policy;innodb_log_file_size若手动调大需删ib_logfile*后重启;sql_mode须按版本精准配置,避免NO_ZERO_IN_DATE等新增项引发报错。

MySQL版本升级后配置不兼容,核心问题不是“配错了”,而是旧配置项被新版本废弃、默认值变更或语义升级——直接复用my.cnf大概率导致服务启动失败或行为异常。
my.cnf里哪些参数在8.0+已失效或改名
常见错误现象:启动mysqld时报Unknown variable 'query_cache_type'、sql_mode contains NO_AUTO_CREATE_USER,或干脆静默退出。
-
query_cache_type、query_cache_size:MySQL 8.0 起彻底移除查询缓存,删掉这两行,别留着注释 -
default_authentication_plugin:8.4+ 已弃用,且它只影响新建用户,对已有用户无效;改认证方式应直接ALTER USER ... IDENTIFIED WITH ... -
innodb_log_file_size:若从5.7升8.0且该值被手动调大过,启动会卡在InnoDB初始化;必须先停库、删ib_logfile*、再启动(由服务器自动重建) -
ft_min_word_len等全文索引参数:8.0+ 移至INFORMATION_SCHEMA.INNODB_FT_CONFIG管理,配置文件中声明将被忽略
sql_mode配置必须按版本精准裁剪
不能直接清空sql_mode,也不能照搬5.7默认值——8.0.11+ 新增NO_ZERO_IN_DATE、NO_ZERO_DATE,盲目保留会导致INSERT报Field 'xxx' doesn't have a default value。
- 查当前生效值:
SELECT @@global.sql_mode;,重点关注是否含STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、ERROR_FOR_DIVISION_BY_ZERO - 安全降级写法(兼容5.7应用):
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"——显式去掉8.0新增项,保留必要校验 - 别用
TRADITIONAL别名:它隐含更严格规则(如STRICT_ALL_TABLES),2026年资料已明确不推荐
配置文件路径和加载顺序容易被忽略
MySQL启动时会按固定顺序读多个my.cnf,若某处残留旧版配置,可能覆盖你改好的主配置。
- 确认实际加载路径:
mysql --help | grep "Default options",典型位置包括/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf - 检查是否有多个文件同时生效:比如
/etc/my.cnf里!include /etc/mysql/conf.d/,而/etc/mysql/conf.d/50-old-params.cnf里还写着query_cache_type=1 - 修改后必须
systemctl restart mysqld(或mysqld_safe --defaults-file=/path/to/my.cnf),mysqladmin reload不重载[mysqld]段落
字符集与排序规则配置需同步更新
5.7常用utf8(实为utf8mb3)和utf8_general_ci,8.0默认utf8mb4 + utf8mb4_0900_ai_ci。仅改服务端配置,客户端不匹配仍会出乱码或截断。
- 全局设默认:
character-set-server = utf8mb4+collation-server = utf8mb4_0900_ai_ci - 但关键在客户端连接:JDBC需加
&characterEncoding=utf8mb4,Python驱动要设charset='utf8mb4',否则SET NAMES utf8mb4也救不了 - 已有表和列不会自动升级:需逐个执行
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
最常被跳过的一步是验证@@global和@@session是否真正同步——比如sql_mode在配置文件改了,但SELECT @@session.sql_mode还是旧值,说明没重启或被SET SESSION临时覆盖过,得清现场再测。


















