mysql_upgrade必须执行,否则MySQL 5.7启动后权限系统失效、网站无法连接;需先启动服务并用root执行mysql_upgrade -u root -p,成功后重启mysqld;导出导入须指定--default-character-set=utf8mb4;导入前应禁用ONLY_FULL_GROUP_BY等严格模式。

mysql_upgrade 必须执行,否则系统表结构不兼容
升级后 MySQL 5.7 启动成功但网站连不上、mysql 命令报 ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 43,本质是系统库表结构没更新。5.6 的 mysql.user 表只有 43 列,5.7 扩展到 45 列(比如新增 password_expired、account_locked),不运行 mysql_upgrade 就直接连库,权限系统直接失效。
实操建议:
- 确保 MySQL 5.7 服务已启动(哪怕只进得去命令行)
- 用 root 执行:
/www/server/mysql/bin/mysql_upgrade -u root -p,输入原 5.6 的 root 密码 - 看到
Upgrade process completed successfully才算真正完成 - 执行完必须重启:
systemctl restart mysqld或宝塔面板内“重启”按钮
导出时加 --default-character-set=utf8mb4,否则中文变乱码
5.6 默认字符集是 utf8(实际是 utf8mb3),而 5.7+ 默认 utf8mb4。如果导出时不显式指定,mysqldump 会按服务端当前 character_set_server 编码读取数据——若仍是 latin1 或 utf8,导出的 SQL 文件里中文就会变成 Incorrect string value 错误或问号。
实操建议:
- 导出命令务必带编码参数:
mysqldump -u root -p --default-character-set=utf8mb4 --single-transaction --routines --triggers your_db > backup.sql - 检查导出文件开头是否有
SET NAMES utf8mb4;,没有就手动加一行 - 导入前确认目标库已设好
character_set_server = utf8mb4(在宝塔「数据库」→「配置修改」里改)
导入前要关掉 ONLY_FULL_GROUP_BY 和严格模式
5.7 默认启用 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY,其中 ONLY_FULL_GROUP_BY 会让很多 5.6 写的老 SQL 报错:Expression #1 of SELECT list is not in GROUP BY clause;STRICT_TRANS_TABLES 会导致 Field 'xxx' doesn't have a default value 直接中断导入。
实操建议:
- 进入宝塔 → 数据库 → 配置修改,在
[mysqld]段下把整行sql-mode替换为:sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" - 保存后重启 MySQL,再导入;导入成功后再按需逐步加回严格项(如只加
STRICT_TRANS_TABLES) - 不要用
SET sql_mode=''临时设置——导入脚本里可能含多语句,session 级设置无法覆盖全部
宝塔里导入大 SQL 文件失败?别用网页上传
宝塔后台「phpMyAdmin」或「数据库管理」页面上传 SQL 文件,实际走的是 PHP 的 upload_max_filesize 和 max_execution_time 限制。超过 20MB 或含大量视图/存储过程的文件,大概率卡住、超时、报 MySQL server has gone away。
实操建议:
- 改用命令行导入:
mysql -u root -p --default-character-set=utf8mb4 your_db - 导入前先关掉自动提交:
mysql -u root -p -e "SET autocommit=0; SOURCE /www/backup/backup.sql; COMMIT;" your_db - 若仍报
Packet too large,在配置里加:max_allowed_packet = 512M,然后重启
mysql_upgrade 是否执行、sql-mode 是否降级、字符集是否对齐这三件事。


















