mysql 5.5→5.7不可直接原地升级,必须停服→彻底清理残留(服务/注册表/进程)→适配my.ini(删废弃参数、设sql_mode)→初始化→逻辑导出导入或谨慎物理迁移→运行mysql_upgrade→重启并重置密码认证插件。

mysql_upgrade 会失败,甚至导致表损坏或服务无法启动。
必须先停止并彻底清理 MySQL 5.5 服务
残留的服务、注册表项或进程会抢占端口、锁住 data 目录,让 5.7 初始化直接报错(如 [ERROR] --initialize specified but the data directory has files in it)。
- 用管理员权限运行
net stop mysql停止服务 - 执行
mysqld --remove移除服务项 - 手动结束所有
mysqld.exe进程(任务管理器 → 详细信息) - 删除注册表中三处路径:
HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL、ControlSet002、CurrentControlSet(不存在可跳过) - 删掉旧版安装目录(如
C:Program FilesMySQLMySQL Server 5.5)和C:ProgramDataMySQLMySQL Server 5.5
my.ini 配置必须手工适配 5.7 的废弃参数
直接拷贝 5.5 的 my.ini 启动 5.7 会静默失败——服务看起来启动了,但实际没监听端口,日志里全是 unrecognized option 报错。
- 删掉已移除的配置项:
innodb_additional_mem_pool_size、table_cache、query_cache_limit(5.7 默认禁用查询缓存) -
basedir和datadir必须指向 5.7 解压路径,且路径不能含中文、空格、括号;反斜杠要写成正斜杠/或双反斜杠\ - 加上 5.7 强制要求的项:
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,否则部分 SQL 会行为异常 - 如果复用旧
data目录,datadir指向它即可;若让 5.7 自建,则先别设该值,等mysqld --initialize执行完再补上
初始化后必须运行 mysql_upgrade,且不能跳过
mysql_upgrade 不是可选工具,它是把 5.5 的系统表结构(如 mysql.user、mysql.proc)转换为 5.7 格式的关键步骤。跳过会导致:登录报错 Access denied for user 'root'@'localhost',或 Navicat 连不上、SHOW DATABASES 空白。
- 确保 MySQL 5.7 服务已启动(
net start mysql) - 用初始化时输出的临时密码登录:
mysql -u root -p,然后立即执行ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_pass';(5.7.6+ 不再支持SET PASSWORD = PASSWORD(...)) - 退出后运行:
mysql_upgrade -u root -p,输入新密码;它会自动检查并升级所有库的系统表 - 升级完成后必须重启服务:
net stop mysql && net start mysql,否则变更不生效
data 目录迁移不是简单复制,要注意文件权限与引擎兼容性
直接把 5.5 的整个 data 目录丢进 5.7 文件夹,大概率启动失败。MyISAM 表可能被拒绝加载,InnoDB 表空间也可能因格式差异报错 Tablespace is missing。
- 优先用逻辑导出:升级前在 5.5 中执行
mysqldump -u root -p --all-databases --routines --events --triggers > backup_55.sql - 若坚持物理迁移,只复制每个业务库子目录(如
myapp/),**不要复制mysql/、performance_schema/、information_schema/这三个系统库目录**——它们必须由 5.7 初始化生成 - 复制后,检查
mysql/目录下是否保留了user.MYD、user.MYI、user.frm这 3 个文件(仅限 MyISAM 用户表),其他一律删掉,否则mysql_upgrade会冲突 - Windows 下注意文件所有权:右键
data目录 → 属性 → 安全 → 编辑 → 给Administrators和SYSTEM完全控制权限
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; 才能恢复兼容。











