MySQL升级后报错主因是版本间语法、默认行为或权限模型不兼容,需优先通过错误日志定位问题类型,再执行mysql_upgrade、调整sql_mode及认证插件等适配操作。

MySQL升级后报错,核心原因通常是版本间语法、默认行为或权限模型变化导致的不兼容。重点不是“修错”,而是快速定位是哪类兼容性问题——是SQL写法过时?系统表结构不匹配?还是配置参数失效?
检查错误日志里的关键线索
先别急着改代码或回滚。直接看 MySQL 错误日志(通常是 /var/log/mysql/error.log 或 mysqld.err),重点关注三类信息:
- 以 ERROR 1235、ERROR 1064 开头的 SQL 解析错误:大概率是废弃语法(如 GROUP BY 严格模式触发)
- 出现 mysql.user 表字段缺失 或 plugin column doesn't exist:说明系统表未升级,需运行 mysql_upgrade
- 报 Access denied for user 且用户刚能登录:新版本默认认证插件变为 caching_sha2_password,旧客户端不支持
快速验证是否为系统表未升级
升级 MySQL 二进制或 RPM 包后,必须手动执行 mysql_upgrade(8.0.16 起已弃用,但 5.7→8.0 迁移仍常需)。确认方式:
- 登录 MySQL 执行:SELECT VERSION(); 确认当前版本
- 运行:mysqlcheck -u root -p --all-databases --check-upgrade,若提示 “The sys schema is not up to date” 或 “Table is not latest” 就得升级
- 执行:mysql_upgrade -u root -p(注意:需有 root 权限,会自动重启服务或提示你手动重启)
排查常见 SQL 兼容性断点
以下写法在 5.7 升 8.0 后极易报错,建议逐条检查应用日志中的失败 SQL:
- GROUP BY 隐式字段被禁用:8.0 默认启用 ONLY_FULL_GROUP_BY,SELECT 中出现非 GROUP BY 字段会报错。临时关掉(不推荐):SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO';
- 关键字冲突:如列名用了 rank、json、window 等 8.0 新增保留字,需用反引号包裹:`rank`
- 默认字符集变更:8.0 默认 utf8mb4 + utf8mb4_0900_as_cs 排序规则,旧表若仍是 utf8 或 utf8_general_ci,JOIN 或 ORDER BY 可能报错,建议批量转换:ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
验证客户端连接兼容性
如果应用连不上,或报 Client does not support authentication protocol,基本是认证插件不匹配:
- 查看用户认证方式:SELECT user, host, plugin FROM mysql.user WHERE user='xxx';
- 若 plugin 是 caching_sha2_password,而你的 JDBC 驱动低于 8.0.13、PHP MySQLi 未启 MYSQLI_OPT_SSL_MODE,就需降级插件:ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';
- 或者升级客户端驱动,并在连接串中显式指定:?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
不复杂但容易忽略:升级前备份+记录旧版本号,升级后第一件事不是跑业务,而是查 error log + 运行 mysql_upgrade + 检查 sql_mode 和 default_authentication_plugin。多数“升级失败”其实卡在这三步里。










