mysql 8.0升级后必须清理my.cnf中所有query_cache_和slave_参数,否则启动报错或复制失败;同时需显式设置default_authentication_plugin、字符集、sql_mode等,默认行为已变更。

my.cnf 里不是“要不要改”,而是“不改就启动不了或连不上”。MySQL 5.7 升级到 8.0 后,配置文件必须清理废弃项、补上新默认行为的显式覆盖,否则 mysqld 启动直接报错,或应用连接静默失败。
删掉所有 query_cache_* 和 slave_* 参数
MySQL 8.0 彻底移除了查询缓存和旧复制参数,保留它们会导致启动失败:
-
query_cache_type、query_cache_size:启动时抛出unknown variable 'query_cache_type' -
slave_skip_errors、slave_parallel_workers等:已重命名为replica_skip_errors、replica_parallel_workers,旧名被忽略且不报错,但复制线程无法启动 - 检查命令:
mysqld --defaults-file=/etc/my.cnf --verbose --help | grep "Deprecated",结果里出现的都得删或替换
必须显式设置 default_authentication_plugin
5.7 默认用 mysql_native_password,8.0 默认切到 caching_sha2_password。老客户端(如 PHP 7.4 之前的 mysqlnd、JDBC 5.x)根本认不出后者,连接只报 Access denied,日志里看不到插件问题。
- 临时兼容方案:在
[mysqld]下加default_authentication_plugin=mysql_native_password - 注意:该配置只影响新建用户;已有用户仍需手动改:
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 别漏掉宝塔面板或 Docker 容器里的配置文件路径,Windows 下是
my.ini,Linux 下常见于/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf
字符集与排序规则不能靠默认继承
8.0 默认 character_set_server=utf8mb4、collation_server=utf8mb4_0900_ai_ci,但旧表/列若没显式声明字符集,升级后仍按 5.7 的 latin1 或 utf8(即 utf8mb3)存数据——导致中文乱码、ORDER BY 结果突变、插入时报 Incorrect string value。
- 必须在
[mysqld]中补全两行:character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci(后者比_0900_ai_ci兼容性更好) - 仅改配置不够:升级后要批量转换存量表,
ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 导出时若用
mysqldump,务必加--default-character-set=utf8mb4,否则 dump 文件里仍是CHARSET=utf8
sql_mode 和 explicit_defaults_for_timestamp 得按业务校准
8.0 默认启用 STRICT_TRANS_TABLES,而很多 5.7 应用依赖宽松模式(比如允许空字符串插入 NOT NULL 字段)。一升级就爆 ERROR 1364 (HY000) 是高频问题。
-
sql_mode建议显式设为业务能跑通的最小集合,例如:sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION—— 如果业务 SQL 不规范,先去掉ONLY_FULL_GROUP_BY或STRICT_TRANS_TABLES -
explicit_defaults_for_timestamp在 8.0 默认为ON,若原配置是OFF,得评估是否保留(影响TIMESTAMP列默认值生成逻辑) - 改完重启后,用
SELECT @@sql_mode;和SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp';确认生效
mysqld --defaults-file=/path/to/my.cnf --validate-config 这条命令必须跑,它比看 error log 更早暴露拼写错误或语法问题。还有,Windows 下服务注册残留、Docker 容器挂载覆盖、宝塔面板自动生成的配置片段,都可能让你的修改形同虚设。











